2017-10-13 88 views
1

我有一個需要三個輸入並執行兩個外部連接的spark任務。數據採用鍵值格式(String,Array [String])。代碼的最重要的部分是:當羣集大小很大時,Spark作業失敗,小時成功

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 

更新:使用此設置,在火花的作業UI看到執行人的人數分別爲500(每個節點之一)

的例外,我在驅動程序的日誌中看到以下:

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) 
... 

有些事情我試過失敗:

  • 我想這個問題是因爲的T這裏有太多的執行者正在產生,驅動程序會追蹤這些執行者。我試圖通過將執行程序內存增加到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的分配是如何工作的,這是一個小問題。根據你的信息,你有500個節點,每個節點有4個核心。所以,你有4000個內核。你在處理你的請求是創建4000個執行器,每個執行器有3個內核。這意味着您正在爲羣集請求12000個內核,並且沒有這樣的事情。

RPC超時的這個錯誤通常與您在同一臺計算機上啓動多少個jvms相關聯,並且由於同時發生的事件,該計算機無法在適當的時間作出響應。

您需要知道的是,--num-executors最好與您的節點相關聯,並且核心數量應該與每個節點中的核心相關聯。

例如,m3.xLarge的配置是4個內核,15 Gb的RAM。在那裏運行工作的最佳配置是什麼?這取決於你打算做什麼。看看你是否要運行只有一個工作,我建議你設置這樣的:

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啓用它的動態分配,只需設置核心數量,並行度和內存,你的工作就像魅力一樣運行。

相關問題