2016-02-26 86 views
4

我在默認設置的8節點Google dataproc羣集上運行pyspark。啓動後 幾秒鐘我看到運行(如預期)30個執行內核:啓動後一分鐘火花丟失所有執行者

 
    >>> sc.defaultParallelism 
    30 

一分鐘後:

 
    >>> sc.defaultParallelism 
    2 

從這一點所有的動作上只有2個內核上運行:

 

    >>> rng = sc.parallelize(range(1,1000000)) 
    >>> rng.cache() 
    >>> rng.count() 
    >>> rng.getNumPartitions() 
    2 

如果我運行rng.cache()核心仍然連接時,他們保持連接和作業分佈。

檢查監測應用程序(主節點上的端口4040)顯示執行人被刪除:

Executor 1 
Removed at 2016/02/25 16:20:14 
Reason: Container container_1456414665542_0006_01_000002 exited from explicit termination request." 

有一些設置,可以繼續使用,無需連接解決方​​法內核?

回答

8

大部分情況下,你所看到的實際上只是Yarn上的Spark可以配置與Spark獨立的區別。目前,YARN報告的「使用的VCore」實際上並不正確地對應於核心的實際容器預留,而容器實際上僅基於內存預留。

總體有在這裏打球幾件事情:

動態分配使星火放棄閒置執行人回紗,可惜在那個垃圾無害的,但「失去了執行」的消息瞬間火花印刷品。這是YARN上經典的火花問題,其中火花原本是癱瘓的集羣,因爲它會抓住它認爲需要的最大數量的容器,然後永遠不要放棄它。

通過動態分配,當您開始長時間工作時,spark會快速分配新容器(類似於指數斜升,以在幾分鐘內快速填充完整的YARN集羣),並且在空閒時放棄執行器在大約60秒的時間間隔內相同的降速(如果空閒60秒,則放棄一些執行器)。

如果你想停用動態分配,您可以運行:

spark-shell --conf spark.dynamicAllocation.enabled=false 

gcloud dataproc jobs submit spark --properties spark.dynamicAllocation.enabled=false --cluster <your-cluster> foo.jar 

另外,如果指定遺囑執行人的一個固定的數字,它也應該自動停用動態分配:

spark-shell --conf spark.executor.instances=123 

gcloud dataproc jobs submit spark --properties spark.executor.instances=123 --cluster <your-cluster> foo.jar 
+0

如果設置這個值越低,工作是否完成,可能需要更長的時間?換句話說,如果你不使用動態分配,如果他們試圖請求比設置更多的執行者,作業會失敗嗎? – Davos