2016-11-24 56 views
4

我在獨立模式下運行Spark 2.0,成功配置它在服務器上啓動,並且能夠將Ipython Kernel PySpark配置爲Jupyter Notebook中的選項。一切正常,但我面臨的問題是,對於我啓動的每個Notebook,我的所有4名工作人員都被分配到該應用程序。因此,如果我的團隊中的另一個人嘗試使用PySpark內核啓動另一臺筆記本電腦,則只有在我停止第一臺筆記本電腦並釋放所有工作人員後才能工作。Spark 2.0獨立模式動態資源分配工作者啓動錯誤

爲了解決這個問題,我試圖按照Spark 2.0 Documentation的指示。 所以,在我的$SPARK_HOME/conf/spark-defaults.conf我有以下行:

spark.dynamicAllocation.enabled true 
spark.shuffle.service.enabled  true 
spark.dynamicAllocation.executorIdleTimeout 10 

此外,在$SPARK_HOME/conf/spark-env.sh我:

export SPARK_WORKER_MEMORY=1g 
export SPARK_EXECUTOR_MEMORY=512m 
export SPARK_WORKER_INSTANCES=4 
export SPARK_WORKER_CORES=1 

但是,當我嘗試推出了工人,使用$SPARK_HOME/sbin/start-slaves.sh,只有第一個工人成功推出。從第一個工作日誌落得這樣的:

16/11/24 13:32:06 INFO Worker: Successfully registered with master spark://cerberus:7077

但是從工人2-4日誌告訴我這個錯誤:

INFO ExternalShuffleService: Starting shuffle service on port 7337 with useSasl = false 16/11/24 13:32:08 ERROR Inbox: Ignoring error java.net.BindException: Address already in use

看來(我)第一個工人成功啓動在7337港口洗牌服務,但工人2-4「不知道」這一點,並嘗試在同一個港口啓動另一項洗牌服務。

如果我首先啓動洗牌服務(使用$SPARK_HOME/sbin/start-shuffle-service.sh),然後嘗試啓動所有工作人員($SPARK_HOME/sbin/start-slaves.sh),則所有工作人員(1-4)也會出現此問題。

有沒有辦法解決這個問題?爲了讓所有工作人員能夠確定是否有一個洗牌服務正在運行並連接到它,而不是嘗試創建一項新服務?

回答

1

我有同樣的問題,似乎通過從配置文件中刪除spark.shuffle.service.enabled項目(實際上我沒有任何dynamicAllocation相關的項目),而是把它在SparkConf當我要求SparkContext:

sconf = pyspark.SparkConf() \ 
    .setAppName("sc1") \ 
    .set("spark.dynamicAllocation.enabled", "true") \ 
    .set("spark.shuffle.service.enabled", "true") 
sc1 = pyspark.SparkContext(conf=sconf) 

我啓動主&奴隸正常:

$SPARK_HOME/sbin/start-all.sh 

而且我要開始洗牌的服務的一個實例:

$SPARK_HOME/sbin/start-shuffle-service.sh 

然後,我開始兩款筆記本用此背景下,得到了他們倆做一個小的工作。第一臺筆記本電腦的應用程序完成這項工作並處於RUNNING狀態,第二臺筆記本電腦的應用程序處於WAITING狀態。一分鐘後(默認空閒超時),資源被重新分配,第二個上下文開始工作(兩者都處於RUNNING狀態)。

希望這會有所幫助, 約翰