2017-10-13 1 views
1

3 개의 입력을 받아 두 개의 외부 조인을 수행하는 스파크 작업이 있습니다. 데이터는 키 - 값 형식입니다 (String, Array [String]). 코드의 가장 중요한 부분은 다음과 같습니다클러스터 크기가 크면 스파크 작업이 실패하고 작을 때 성공합니다.

val partitioner = new HashPartitioner(8000) 
val joined = inputRdd1.fullOuterJoin(inputRdd2.fullOuterJoin(inputRdd3, partitioner), partitioner).cache 
saveAsSequenceFile(joined, filter="X") 
saveAsSequenceFile(joined, filter="Y") 

나는 r3.4xlarge 드라이버 노드와 500 개 m3.xlarge 작업자 노드 EMR에 작업을 실행하고 있습니다. 스파크 제출 파라미터는 :

spark-submit --deploy-mode client --master yarn-client --executor-memory 3g --driver-memory 100g --executor-cores 3 --num-executors 4000 --conf spark.default.parallelism=8000 --conf spark.storage.memoryFraction=0.1 --conf spark.shuffle.memoryFraction=0.2 --conf spark.yarn.executor.memoryOverhead=4000 --conf spark.network.timeout=600s 

UPDATE :이 설정으로, 스파크 채용 UI에서 본 실행기의 수가 있었다 500 (노드 당 하나)

I 드라이버 로그에 표시되는 예외가 다음 인 :

  • 내가 문제는 t이 될 것이라고 생각 :
    17/10/13 21:37:57 WARN HeartbeatReceiver: Removing executor 470 with no recent heartbeats: 616136 ms exceeds timeout 600000 ms 
    17/10/13 21:39:04 ERROR ContextCleaner: Error cleaning broadcast 5 
    org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [600 seconds]. This timeout is controlled by spark.network.timeout at org.apache.spark.rpc.RpcTimeout.org$apache$spark$rpc$RpcTimeout$$createRpcTimeoutException(RpcEnv.scala:214) 
    ... 
    

    것들 중 일부

    나는 실패 시도 여기에는 너무 많은 executor가 생성되며 드라이버는 이러한 executor를 추적하는 오버 헤드가 있습니다. 실행 프로그램 메모리를 4g으로 늘려서 실행 프로그램의 수를 줄이려고 노력했습니다. 이것은 도움이되지 못했습니다.
  • 드라이버의 인스턴스 유형을 r3.8xlarge로 변경하려고 시도했지만이 역시 도움이되지 않았습니다.

놀랍게도 작업자 노드 수를 300 개로 줄이면 작업이 파일을 실행합니다. 왜 이런 일이 일어날 지에 대한 다른 가설이 있습니까?

+0

- https://stackoverflow.com/questions/40474057/what-are-possible-reasons-for-receiving-timeoutexception-futures-timed-out-afte - https://stackoverflow.com/questions/45171175/ 오류 오류 정리 브로드 캐스트 예외 –

답변

0

한 번에 하나의 매개 변수를 500 개 노드로 수정하는 많은 구성을 실험했습니다. 마지막으로 HashPartitioner의 파티션 수를 8000에서 3000으로 낮추어 작업 할 작업을 얻었습니다.

val partitioner = new HashPartitioner(3000) 

은 그래서 아마 드라이버가 더 많은 파티션이며, 따라서 낮은 파티션 도움이 때 수행해야합니다 셔플의 많은 수에 압도된다.

0

음 이것은 Spark의 할당이 어떻게 작동하는지 이해하는 데 조금 문제가 있습니다.

귀하의 정보에 따르면 각각 4 개의 코어가있는 500 개의 노드가 있습니다. 따라서 4000 코어가 있습니다. 당신이 요청한 것은 각각 3 코어의 4000 명의 집행자를 만드는 것입니다. 이는 클러스터에 12000 코어를 요청하고 있다는 것을 의미하며 그와 같은 것은 없습니다.

이 RPC 시간 초과 오류는 동일한 시스템에서 시작한 jvms 수와 정기적으로 관련이 있으며, 동시에 많은 일이 발생하여 적절한 시간 내에 응답 할 수 없습니다.

--num-executors은 노드와 연결되어 있어야하며 코어 수는 각 노드에있는 코어와 연결되어 있어야합니다.

예를 들어, m3.x 대형의 구성은 15Gb RAM이있는 4 코어입니다. 그 곳에서 일하기에 가장 좋은 구성은 무엇입니까? 그것은 당신이하고자하는 일에 달려 있습니다. 이것은 당신의 노동자가에 당신이 당신의 데이터에 맞게 문제를 가지고 있지 않는 경우 작업이 잘 실행 할 수

spark-submit --deploy-mode client --master yarn-client --executor-memory 10g --executor-cores 4 --num-executors 500 --conf spark.default.parallelism=2000 --conf spark.yarn.executor.memoryOverhead=4000 

: 당신은 내가 당신이 이런 식으로 설정하는 것이 좋습니다 하나의 작업을 실행하려는 경우 참조 더 나은 default.parallelism을 2000으로 변경하거나 셔플로 많은 시간을 낭비하게됩니다.

하지만 최선의 방법은 EMR이 기본적으로 활성화하는 동적 할당을 유지하는 것입니다. 코어 수와 병렬 처리 및 메모리를 설정하면 작업이 매력처럼 작동합니다.

관련 문제