【发布时间】:2015-12-19 13:22:24
【问题描述】:
到目前为止,我只在 Linux 机器和 VM(桥接网络)上运行 Spark,但现在我对将更多计算机用作从机很感兴趣。在计算机上分发 Spark Slave Docker 容器并让它们自动连接到硬编码的 Spark master ip 会很方便。这已经很短了,但是我无法在从容器上配置正确的 SPARK_LOCAL_IP(或 start-slave.sh 的 --host 参数)。
我认为我正确配置了 SPARK_PUBLIC_DNS env 变量以匹配主机的网络可访问 ip(来自 10.0.x.x 地址空间),至少它显示在 Spark 主 Web UI 上并且可供所有机器访问。
我还按照http://sometechshit.blogspot.ru/2015/04/running-spark-standalone-cluster-in.html 的说明设置了 SPARK_WORKER_OPTS 和 Docker 端口转发,但在我的情况下,Spark 主机运行在另一台机器上,而不是在 Docker 内部。我正在从网络中的另一台机器启动 Spark 作业,可能也运行从机本身。
我尝试过的事情:
- 根本没有配置 SPARK_LOCAL_IP,slave 绑定到容器的 ip(如 172.17.0.45),无法从 master 或驱动程序连接,计算仍然在大多数时间工作,但并非总是如此
- 绑定到 0.0.0.0,slave 与 master 对话并建立一些连接但它死了,另一个 slave 出现并消失,它们继续像这样循环
- 绑定到主机 ip,启动失败,因为该 ip 在容器中不可见,但由于配置了端口转发,其他人可以访问
我想知道为什么在连接从站时不使用配置的 SPARK_PUBLIC_DNS?我认为 SPARK_LOCAL_IP 只会影响本地绑定,而不会显示给外部计算机。
在https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/connectivity_issues.html,他们指示“将 SPARK_LOCAL_IP 设置为驱动程序、主进程和工作进程的集群可寻址主机名”,这是唯一的选择吗?我会避免额外的 DNS 配置,只使用 ips 来配置计算机之间的流量。或者有没有简单的方法来实现这一点?
编辑: 总结一下当前的设置:
- Master 正在 Linux 上运行(虚拟机在 Windows 上的 VirtualBox 上,具有桥接网络)
- 驱动程序从其他 Windows 机器提交作业,效果很好
- 用于启动 slave 的 Docker 映像作为“已保存”的 .tar.gz 文件分发,已加载(curl xyz | gunzip | docker load)并在网络中的其他机器上启动,此探针具有私有/公共 ip 配置
【问题讨论】:
-
您究竟是如何尝试使用容器的?还是这些容器只是用于“沙箱”或“实验”?我的意思是,您是否尝试在一个容器上与一个主容器并行运行多个容器,而在另一个容器中只运行从属容器?或者,您是在容器外一起安装 spark 吗?
-
只有从服务器会在 Docker 中,主服务器和驱动程序在操作系统上“本地”运行(但可能在虚拟机中)。我的奴隶 docker 图像看起来像这样(不是最新的):github.com/nikonyrh/docker-scripts/blob/master/spark_py34/… 基本上它安装了 Python 3.4、numpy、scipy 等。我们需要并行训练我们的模型。我们需要在多个从属服务器上进行扩展以更快地获得结果,我认为 Docker 映像很容易在 AWS 上甚至在 AWS 上部署。
-
仅供参考 我还在github.com/apache/spark/pull/3645#issuecomment-142319031 上发布了一个问题,也与github.com/apache/spark/pull/3893 相关
标签: networking apache-spark docker