2016-11-24 66 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状态)。

希望这会有所帮助, 约翰

相关问题