Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking Spark Spark_PUBLIC_DNS和Spark_LOCAL_IP位于带有docker容器的独立群集上_Networking_Apache Spark_Docker - Fatal编程技术网

Networking Spark Spark_PUBLIC_DNS和Spark_LOCAL_IP位于带有docker容器的独立群集上

Networking Spark Spark_PUBLIC_DNS和Spark_LOCAL_IP位于带有docker容器的独立群集上,networking,apache-spark,docker,Networking,Apache Spark,Docker,到目前为止,我只在Linux机器和VM(桥接网络)上运行Spark,但现在我对利用更多计算机作为从机很感兴趣。在计算机上分发Spark Slave Docker容器并让它们自动连接到硬编码的Spark master ip是很方便的。这一缺陷已经起作用了,但我在从容器上配置正确的SPARK_LOCAL_IP(或——start slave.sh的主机参数)时遇到了问题 我认为我正确地配置了SPARK_PUBLIC_DNS env变量,以匹配主机的网络可访问ip(从10.0.x.x地址空间),至少它显

到目前为止,我只在Linux机器和VM(桥接网络)上运行Spark,但现在我对利用更多计算机作为从机很感兴趣。在计算机上分发Spark Slave Docker容器并让它们自动连接到硬编码的Spark master ip是很方便的。这一缺陷已经起作用了,但我在从容器上配置正确的SPARK_LOCAL_IP(或——start slave.sh的主机参数)时遇到了问题

我认为我正确地配置了SPARK_PUBLIC_DNS env变量,以匹配主机的网络可访问ip(从10.0.x.x地址空间),至少它显示在SPARK master web UI上并可供所有机器访问

我还按照中的指示设置了SPARK_WORKER_选项和Docker端口,但在我的情况下,SPARK master正在其他机器上运行,而不是在Docker内部。我正在网络中的另一台机器上启动Spark jobs,可能还运行着一个从机本身

我尝试过的事情:

  • 根本不配置SPARK_LOCAL_IP,从服务器绑定到容器的IP(如172.17.0.45),无法从主服务器或驱动程序连接,大部分时间计算仍然有效,但并不总是有效
  • 绑定到0.0.0.0,从机与主机对话并建立一些连接,但它死了,另一个从机出现并离开,它们继续这样循环
  • 绑定到主机ip,启动失败,因为该ip在容器中不可见,但在配置端口转发时其他人可以访问
  • 我想知道为什么连接到从属服务器时没有使用配置的SPARK\u PUBLIC\u DNS?我认为SPARK_LOCAL_IP只会影响本地绑定,而不会泄露给外部计算机

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

    编辑: 要总结当前设置,请执行以下操作:

    • Master在Linux上运行(Windows上VirtualBox上的虚拟机与桥接网络)
    • 驱动程序从其他Windows计算机提交作业,效果很好
    • 用于启动从属服务器的Docker映像作为“保存的”.tar.gz文件分发,加载(curl xyz | gunzip | Docker load)并在网络中的其他机器上启动,在私有/公共ip配置中存在此问题

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

  • 使用
    --net host
    docker run
    =>主机的eth0在容器中可见
  • SPARK\u PUBLIC\u DNS
    SPARK\u LOCAL\u IP
    设置为主机的IP,忽略docker0的172.x.x.x地址
  • Spark可以绑定到主机的ip,其他机器也可以与之通信,其余部分由端口转发负责。DNS或任何复杂的配置是不需要的,我还没有彻底测试过这一点,但到目前为止还不错


    编辑:请注意,这些说明是针对Spark 1.x的,在Spark 2.x上只需要
    Spark\u PUBLIC\u DNS
    ,我认为
    Spark\u LOCAL\u IP
    已被弃用。

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

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

    主机:

    • 我无法将其绑定到Docker主机IP。相反,我将一个虚构的域名传递给它:
      -h“dockerhost master”-e SPARK\u master\u IP=“dockerhost master”
      。我找不到一种方法使Akka绑定到容器的IP上,而接受主机IP上的消息。我知道Akka 2.4是可能的,但Spark可能不行
    • 我正在传入
      -e SPARK\u LOCAL\u IP=“${HOST\u IP}”
      ,这会导致Web UI绑定到该地址,而不是容器的IP,但Web UI无论以哪种方式都可以正常工作
    工人:

    • 我给了worker容器一个不同的主机名,并将其作为
      --host
      传递给Spark
      org.apache.Spark.deploy.master.worker
      类。它不能与master的相同,否则Akka群集将无法工作:
      -h“dockerhost worker”
    • 我正在使用Docker的
      添加主机
      ,因此容器能够将主机名解析为主机的IP:
      --添加主机dockerhost主机:${host_IP}
    • 需要传递的主URL是
      spark://dockerhost-master:7077
    Jupyter:

    • 这一个需要主URL和
      添加主机
      才能解析它
    • SparkContext
      位于笔记本中,这是Spark应用程序的web UI启动的地方,而不是主界面。默认情况下,它绑定到Docker容器的内部IP地址。要改变这一点,我必须传入:
      -e SPARK\u PUBLIC\u DNS=“${VM\u IP}”-p 4040:4040
      。笔记本的后续应用程序将在4041、4042等上
    通过这些设置,三个组件能够相互通信。我正在使用带有
    spark class
    的自定义启动脚本在前台启动类,并防止Docker容器退出


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

    我还在不同docker主机上的容器中运行spark。使用以下参数启动worker容器对我有效:

    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\u HOSTNAME
    是可从主机访问的主机名


    缺少的部分是
    SPARK\u LOCAL\u HOSTNAME
    ,一个未记录的AFAICT选项


    您到底打算如何使用c语言