首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >码头集装箱独立集群中的Spark SPARK_PUBLIC_DNS和SPARK_LOCAL_IP

码头集装箱独立集群中的Spark SPARK_PUBLIC_DNS和SPARK_LOCAL_IP
EN

Stack Overflow用户
提问于 2015-09-22 14:02:21
回答 3查看 20.3K关注 0票数 10

到目前为止,我只在Linux机器和VM(桥接网络)上运行Spark,但是现在我对使用更多的计算机作为奴隶很感兴趣。这将是方便分发一个火种奴隶码头集装箱在计算机上,并让他们自动连接到一个硬编码的火花主ip。这一不足已经完成了,但我在从容器上配置正确的SPARK_LOCAL_IP (或--start-slve.sh的主机参数)时遇到了困难。

我认为我正确地配置了SPARK_PUBLIC_DNS env变量以匹配主机的网络访问ip (来自10.0.x.x地址空间),至少它显示在Spark上,并且所有机器都可以访问。

我还按照http://sometechshit.blogspot.ru/2015/04/running-spark-standalone-cluster-in.html的指示设置了http://sometechshit.blogspot.ru/2015/04/running-spark-standalone-cluster-in.html和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只会影响本地绑定,而不会透露给外部计算机。

issues.html,他们指示“将SPARK_LOCAL_IP设置为驱动程序、主进程和工作进程的可寻址主机名”,这是唯一的选择吗?我将避免额外的DNS配置,只需使用ips来配置计算机之间的通信量。还是有一个简单的方法来实现这一点?

编辑:总结当前的设置:

  • 主服务器正在Linux上运行(在VirtualBox上使用桥接网络)
  • 驱动程序从另一台Windows机器提交作业,工作效率很高
  • 用于启动从服务器的Docker映像被作为“保存”的.tar.gz文件分发,加载(curl \ gunzip / docker加载),并在网络中的其他机器上启动,具有私有/公共ip配置。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-23 10:53:27

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

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

Spark可以绑定到主机的ip和其他机器与其通信,端口转发负责其余的事务。DNS或任何复杂的信任是不需要的,我还没有彻底测试这一点,但到目前为止还不错。

编辑:请注意,这些说明是针对Spark1.x的,在Spark2.x只需要SPARK_PUBLIC_DNS,我认为SPARK_LOCAL_IP是不推荐的。

票数 8
EN

Stack Overflow用户

发布于 2017-04-21 17:36:46

我也运行在不同的码头主机的容器火花。使用这些参数启动工人容器对我有用:

代码语言:javascript
运行
复制
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

票数 14
EN

Stack Overflow用户

发布于 2015-11-17 17:29:15

我正在我的机器上运行3种不同类型的对接容器,目的是在我们所需的所有软件都添加到云中时将它们部署到云中: Master、Worker和木星笔记本(带有Scala、R和Python内核)。

以下是我迄今为止的观察:

硕士:

  • 我不能让它绑定到码头主机IP。相反,我传入一个虚构的域名给它:-h "dockerhost-master" -e SPARK_MASTER_IP="dockerhost-master"。我找不到一种方法使Akka绑定到容器的IP上,但是接受针对主机IP的消息。我知道使用Akka 2.4是可能的,但可能不是用火花。
  • 我正在传递-e SPARK_LOCAL_IP="${HOST_IP}",这会导致Web绑定到该地址,而不是容器的IP,但是Web的工作方式都很好。

工作者:

  • 我给了工人容器一个不同的主机名,并将其作为--host传递给Sparkorg.apache.spark.deploy.master.Worker类。它不可能与主集群或Akka集群不工作相同:-h "dockerhost-worker"
  • 我使用的是Docker的add-host,因此容器能够将主机名解析为主IP:--add-host dockerhost-master:${HOST_IP}
  • 需要传递的主URL是spark://dockerhost-master:7077

木星:

  • 这需要主URL和add-host才能解决它。
  • SparkContext生活在笔记本中,而这正是启动星火应用程序的web的地方,而不是主程序。默认情况下,它绑定到Docker容器的内部IP地址。要更改我必须传入的内容:-e SPARK_PUBLIC_DNS="${VM_IP}" -p 4040:4040。随后来自笔记本的申请将是4041,4042等。

有了这些设置,三个组件就可以相互通信。我正在使用带有spark-class的自定义启动脚本来启动前台类,同时防止Docker容器暂时退出。

还有一些其他端口可以公开,比如历史服务器,我还没有遇到这些端口。使用--net host似乎要简单得多。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32719007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档