到目前为止,我仅在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作业,可能还运行了一个奴隶本身。
我尝试过的事情:
我想知道为什么连接到从站时不使用配置的SPARK_PUBLIC_DNS?我认为SPARK_LOCAL_IP仅会影响本地绑定,而不会透露给外部计算机。
在https://databricks.gitbooks.io/databricks-spark-knowledge- base/content/troubleshooting/connectivity_issues.html上,他们指示“将SPARK_LOCAL_IP设置为驱动程序,主进程和工作进程的群集可寻址主机名”是这是唯一的选择吗?我会避免额外的DNS配置,而仅使用ips配置计算机之间的流量。还是有一个简单的方法来实现这一目标?
编辑: 总结当前设置:
我想我找到了针对我的用例(一个Spark容器/主机OS)的解决方案:
--net host
docker run
SPARK_PUBLIC_DNS
SPARK_LOCAL_IP
Spark可以绑定到主机的ip,其他机器也可以与之通信,端口转发负责其余的工作。不需要DNS或任何复杂的配置,我还没有对此进行全面的测试,但是到目前为止还不错。
编辑:请注意,这些说明适用于Spark 1.x,仅在Spark 2.x才SPARK_PUBLIC_DNS需要,我认为SPARK_LOCAL_IP已弃用。