2016-04-08 22 views
2

如何向Google Dataproc(PySpark)提交多個作業並排隊不適合當前執行者的作業?如何在DataProc上運行Spark時對新作業進行排隊

只提交作業排隊,在這裏任何下列作業的輸出不起作用:

$ gcloud dataproc jobs submit pyspark myjob.py 
... 
WARN Utils:70 - Service 'SparkUI' could not bind on port 4040. Attempting port 4041 

YARN應採取「排隊」參數用於這一目的。但是,我找不到有關使用dataproc的任何文檔...?

回答

4

在你的情況下,你可能想忽略該警告;它實際上只是一個無害的警告,你的驅動程序確實在同一個羣集上正確排隊;當多個驅動程序在同一個主機(dataproc主機)上運行時,端口只是bound to successive port numbers starting at 4040。請注意,這是而不是意思是後面的提交主動等待第一個完成;作業提交嘗試儘可能多地同時運行資源。在Dataproc中,如果你提交了100個作業,你應該會看到其中的10個(根據機器大小,簇大小等而變化)立即在YARN中排隊,其中幾個(或全部)將成功獲取足夠多的YARN容器開始運行,而另一些容器則保持在YARN中。完成後,隨着資源可用,Dataproc將逐漸遞增剩餘的90個工作給YARN。

目前有紗隊列沒有特殊的支持,但它如果你想在集羣創建時間來定製你的YARN隊列使用支持的功能:

gcloud dataproc clusters create --properties \ 
    ^;^yarn:yarn.scheduler.capacity.root.queues=foo,bar,default;spark:other.config=baz 

(與;更換gcloud delimiter穿過在教程概述像this one逗號分隔的列表)和/或附加yarn-site.xml CONFIGS,然後您指定的隊列:

gcloud dataproc jobs submit spark --properties spark.yarn.queue=foo 

雖然不會改變你對端口4040警告的看法。這是因爲默認設置是對Spark使用yarn-client模式,這意味着驅動程序在主節點上運行,並且驅動程序提交不受YARN排隊。

您可以使用yarn-cluster模式如下:

gcloud dataproc jobs submit spark --properties \ 
    spark.master=yarn-cluster,spark.yarn.queue=foo 

然後,它會使用foo紗隊列,如果你定義它,以及使驅動程序在運行使用yarn-cluster模式YARN容器。在這種情況下,您不再會遇到任何端口4040警告,但在yarn-cluster模式下,您也無法再在Dataproc UI中看到驅動程序的stdout/stderr

+0

謝謝你的解釋。你介意在將來某個時候更新dataproc的文檔嗎? ;-) – Frank

+0

http://spark.apache.org/docs/latest/job-scheduling.html#configuring-pool-properties - 我想我會嘗試你的建議和游泳池配置一般到YARN。應該工作,但?! – Frank

+0

它現在就像你自己描述的那樣工作。非常感謝你。有沒有辦法從SparkContext /正在運行的作業中的dataproc獲取jobId?我想保存結果以引用ApplicationId和JobId來涵蓋YARN和dataproc上下文。 – Frank

相關問題