【问题标题】:Spark SPARK_PUBLIC_DNS and SPARK_LOCAL_IP on stand-alone cluster with docker containersSpark SPARK_PUBLIC_DNS 和 SPARK_LOCAL_IP 在带有 docker 容器的独立集群上
【发布时间】: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 作业,可能也运行从机本身。

我尝试过的事情:

  1. 根本没有配置 SPARK_LOCAL_IP,slave 绑定到容器的 ip(如 172.17.0.45),无法从 master 或驱动程序连接,计算仍然在大多数时间工作,但并非总是如此
  2. 绑定到 0.0.0.0,slave 与 master 对话并建立一些连接但它死了,另一个 slave 出现并消失,它们继续像这样循环
  3. 绑定到主机 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


【解决方案1】:

我还在不同 docker 主机上的容器中运行 spark。使用这些参数启动工作容器对我有用:

docker run \
-e SPARK_WORKER_PORT=6066 \
-p 6066:6066 \
-p 8081:8081 \
--hostname $PUBLIC_HOSTNAME \
-e SPARK_LOCAL_HOSTNAME=$PUBLIC_HOSTNAME \
-e SPARK_IDENT_STRING=$PUBLIC_HOSTNAME \
-e SPARK_PUBLIC_DNS=$PUBLIC_IP \
spark ...

其中$PUBLIC_HOSTNAME 是主机可访问的主机名。

缺少的部分是 SPARK_LOCAL_HOSTNAME,一个未记录的选项 AFAICT。

https://github.com/apache/spark/blob/v2.1.0/core/src/main/scala/org/apache/spark/util/Utils.scala#L904

【讨论】:

  • SPARK_LOCAL_HOSTNAME 是我一直在寻找的确切配置。谢谢!
  • 这适用于我在 docker 中运行的 spark worker,连接到不同网络中的 master
  • 有趣的是,我们在过去使用 SPARK_LOCAL_IP 使其工作,但现在,在一些网络更改后,这不起作用,而 SPARK_LOCAL_HOSTNAME 可以。非常感谢:)
【解决方案2】:

我正在我的机器上运行 3 种不同类型的 docker 容器,目的是在将我们需要的所有软件添加到其中后将它们部署到云中:Master、Worker 和 Jupyter notebook(带有 Scala、R 和 Python 内核)。

以下是我目前的观察结果:

大师:

  • 我无法使其绑定到 Docker 主机 IP。相反,我将一个虚构的域名传递给它:-h "dockerhost-master" -e SPARK_MASTER_IP="dockerhost-master"。我找不到让 Akka 绑定到容器 IP 并接受针对主机 IP 的消息的方法。我知道 Akka 2.4 可以,但 Spark 可能不行。
  • 我传入了 -e SPARK_LOCAL_IP="${HOST_IP}",这会导致 Web UI 绑定到该地址而不是容器的 IP,但是 Web UI 无论如何都可以正常工作。

工人:

  • 我给工作容器一个不同的主机名,并将其作为--host 传递给Spark org.apache.spark.deploy.master.Worker 类。不能和master的一样,不然Akka集群就不行了:-h "dockerhost-worker"
  • 我正在使用 Docker 的 add-host,因此容器能够将主机名解析为主机的 IP:--add-host dockerhost-master:${HOST_IP}
  • 需要传递的主URL是spark://dockerhost-master:7077

Jupyter:

  • 这个需要主 URL 和 add-host 才能解决它
  • SparkContext 存在于笔记本中,这是 Spark 应用程序的 Web UI 启动的地方,而不是主控。默认情况下,它绑定到 Docker 容器的内部 IP 地址。要改变这一点,我必须通过:-e SPARK_PUBLIC_DNS="${VM_IP}" -p 4040:4040。笔记本中的后续应用程序将在 4041、4042 等上。

通过这些设置,三个组件能够相互通信。我正在使用带有spark-class 的自定义启动脚本在前台启动类并防止Docker 容器此时退出。

还有一些其他端口可能会暴露,例如我还没有遇到的历史服务器。使用--net host 似乎要简单得多。

【讨论】:

  • 运行工作者的类不正确。它应该是 org.apache.spark.deploy.worker.Worker,而不是 org.apache.spark.deploy.master.Worker。
【解决方案3】:

我想我找到了适合我的用例的解决方案(一个 Spark 容器/主机操作系统):

  1. 使用--net hostdocker run => 主机的 eth0 在容器中可见
  2. 设置SPARK_PUBLIC_DNSSPARK_LOCAL_IP为host的ip,忽略docker0的172.x.x.x地址

Spark 可以绑定到主机的 ip 并且其他机器也可以与之通信,端口转发负责其余的工作。不需要 DNS 或任何复杂的配置,我还没有彻底测试过,但到目前为止还不错。

编辑:请注意,这些说明适用于 Spark 1.x,在 Spark 2.x 中仅需要 SPARK_PUBLIC_DNS,我认为 SPARK_LOCAL_IP 已弃用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    相关资源
    最近更新 更多