一尘不染

在具有Docker容器的独立集群上执行Spark SPARK_PUBLIC_DNS和SPARK_LOCAL_IP

docker

到目前为止,我仅在Linux机器和VM(桥接网络)上运行Spark,但现在我对将更多计算机用作从属设备很感兴趣。在计算机上分发Spark Slave
Docker容器并使它们自动连接到硬编码的Spark master
IP会很方便。这种不足已经可以解决,但是我在从属容器上配置正确的SPARK_LOCAL_IP(或start-slave.sh的–
host参数)时遇到了麻烦。

我认为我已正确配置了SPARK_PUBLIC_DNS env变量以匹配主机的网络可访问ip(来自10.0.xx地址空间),至少它显示在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,从属服务器绑定到容器的ip(如172.17.0.45),无法从主服务器或驱动程序连接到该主机,计算在大多数时间仍然有效,但并非总是如此
  2. 绑定到0.0.0.0,从站与主站对话并建立一些连接,但它死了,另一个从站出现并消失,他们继续像这样循环
  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上的VM)
  • 驱动程序从其他Windows计算机提交作业,效果很好
  • 用于启动从站的Docker映像以“已保存” .tar.gz文件的形式分发,加载(curl xyz | gunzip | docker load)并在网络内的其他计算机上启动,该探针具有私有/公共ip配置

阅读 576

收藏
2020-06-17

共1个答案

一尘不染

我想我找到了针对我的用例(一个Spark容器/主机OS)的解决方案:

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

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

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

2020-06-17