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 개로 줄이면 작업이 파일을 실행합니다. 왜 이런 일이 일어날 지에 대한 다른 가설이 있습니까?
- https://stackoverflow.com/questions/40474057/what-are-possible-reasons-for-receiving-timeoutexception-futures-timed-out-afte - https://stackoverflow.com/questions/45171175/ 오류 오류 정리 브로드 캐스트 예외 –