我在独立模式下运行Spark2.0,成功地将其配置为在服务器上启动,还能够将Ipython配置为朱庇特笔记本中的选项。一切都很好,但我面临的问题是,我发布的每一本笔记本,我所有的4名员工都被分配到该应用程序中。因此,如果我的团队中的另一个人试图推出另一个带有PySpark内核的笔记本,那么在我停止第一个笔记本并释放所有工作人员之前,它根本无法工作。
为了解决这个问题,我试图遵循Spark 2.0文档的说明。因此,在我的$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信息工作者:成功注册主火花://cerberus:7077
但是,工作人员2-4的日志显示了以下错误:
INFO ExternalShuffleService:在端口7337上启动洗牌服务,使用useSasl = false 16/11/24 13:32:08错误收件箱:忽略错误java.net.BindException:已在使用的地址
在我看来,第一个工人成功地在7337端口启动了洗牌服务,但是工人2-4“不知道”,并试图在同一个港口上启动另一个洗牌服务。
如果我首先启动一个洗牌服务(使用$SPARK_HOME/sbin/start-shuffle-service.sh
),然后尝试启动所有工作人员($SPARK_HOME/sbin/start-slaves.sh
),那么所有工作人员(1-4)也会出现问题。
有什么办法可以绕过这件事吗?如果有一个正在运行的洗牌服务,并连接到它,而不是尝试创建一个新的服务,那么能够让所有的工作人员都熟悉吗?
发布于 2017-05-12 16:55:29
我也遇到了同样的问题,似乎通过从配置文件中删除spark.shuffle.service.enabled项(实际上,在配置文件中没有任何与dynamicAllocation相关的项),并在请求SparkContext时将其放在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
然后,我开始使用这种背景的两本笔记本,并让他们都做了一个小的工作。第一个笔记本的应用程序完成工作,处于运行状态,第二个笔记本的应用程序处于等待状态。一分钟后(默认的空闲超时),资源重新分配,第二个上下文完成它的工作(并且都处于运行状态)。
希望这能帮上忙约翰
https://stackoverflow.com/questions/40788138
复制相似问题