5

我在独立模式下运行 Spark 2.0,成功将其配置为在服务器上启动,并且还能够将 Ipython Kernel PySpark 配置为 Jupyter Notebook 的选项。一切正常,但我面临的问题是,对于我启动的每个 Notebook,我的所有 4 个工作人员都分配给该应用程序。因此,如果我的团队中的另一个人尝试使用 PySpark 内核启动另一个 Notebook,它根本无法工作,直到我停止第一个 notebook 并释放所有工作人员。

为了解决这个问题,我尝试按照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: 成功注册master spark://cerberus:7077

但是工人 2-4 的日志向我显示了这个错误:

信息 ExternalShuffleService:使用 useSasl = false 16/11/24 13:32:08 在端口 7337 上启动 shuffle 服务错误收件箱:忽略错误 java.net.BindException:地址已在使用中

似乎(对我来说)第一个工作人员在端口 7337 成功启动了 shuffle 服务,但是 2-4 工作人员“不知道”这一点并尝试在同一端口上启动另一个 shuffle 服务。

如果我首先启动 shuffle-service(使用$SPARK_HOME/sbin/start-shuffle-service.sh)然后尝试启动所有工作人员($SPARK_HOME/sbin/start-slaves.sh),那么所有工作人员(1-4)也会出现问题。

有什么办法可以解决这个问题吗?如果有一个 shuffle 服务正在运行并连接到它,而不是尝试创建一个新服务,那么能够验证所有工作人员吗?

4

1 回答 1

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

我必须启动 shuffler-service 的一个实例:

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

然后我用这个上下文开始了两个笔记本,让他们都做一个小工作。第一个笔记本的应用程序完成工作并处于 RUNNING 状态,第二个笔记本的应用程序处于 WAITING 状态。一分钟后(默认空闲超时),资源被重新分配,第二个上下文开始工作(两者都处于 RUNNING 状态)。

希望这会有所帮助,约翰

于 2017-05-12T16:55:29.027 回答