我在独立模式下运行 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 服务正在运行并连接到它,而不是尝试创建一个新服务,那么能够验证所有工作人员吗?