在Docker Swarm上部署Spark和HDFS无法启用数据本地性

我正在尝试使用Docker Swarm作为堆栈部署在小型集群上设置Spark + HDFS部署。我可以正常使用它,但是遇到一个阻止Spark利用数据局部性的问题。

为了启用数据局部性,我在每个服务器上都制作了一个单独的“ worker node”容器,该容器同时包含Spark worker和HDFS datanode。这里的想法是,由于它们在同一容器中运行,因此它们在堆栈的覆盖网络上都应具有相同的IP地址。但是,他们没有。看来容器在覆盖网络上获得了一个VIP,而堆栈使用的撰写文件中定义的服务又获得了另一个VIP。

事实证明,HDFS datanode进程绑定到容器VIP,Spark worker进程绑定到服务的VIP(据我所知)。结果,Spark不知道Spark工作者和HDFS数据节点实际上在同一台计算机上,仅调度ANY本地性的任务。

我确定我缺少什么,但我(当然)不知道什么。

我用于定义每个工作程序节点服务的Docker堆栈组合文件条目如下所示:

version: '3.4'
services:

    ...

    worker-node2:
        image: master:5000/spark-hdfs-node:latest
        hostname: "worker-node2"
        networks:
            - cluster_network
        environment:
            - SPARK_PUBLIC_DNS=10.1.1.1
            - SPARK_LOG_DIR=/data/spark/logs
        depends_on:
            - hdfs-namenode
        volumes:
            - type: bind
              source: /mnt/data/hdfs
              target: /data/hdfs
            - type: bind
              source: /mnt/data/spark
              target: /data/spark
        deploy:
            mode: replicated
            replicas: 1
            placement:
                constraints:
                    - node.hostname == slave1
            resources:
               limits:
                   memory: 56g

    ...

networks:
    cluster_network:
        attachable: true
        ipam:
            driver: default
            config:
                - subnet: 10.20.30.0/24

Hadoop HDFS-site.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/data/hdfs/datanode</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/data/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <description>The default replication factor of files on HDFS</description>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property> 
        <name>dfs.block.size</name>
        <value>64m</value>
        <description>The default block size in bytes of data saved to HDFS</description>
    </property>
    <property>
        <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.client.use.datanode.hostname</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.datanode.use.datanode.hostname</name>
        <value>true</value>
    </property>

    <property>
        <name>dfs.namenode.rpc-bind-host</name>
        <value>0.0.0.0</value>
        <description>
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        </description>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-bind-host</name>
        <value>0.0.0.0</value>
        <description>
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        </description>
    </property>
    <property>
        <name>dfs.namenode.http-bind-host</name>
        <value>0.0.0.0</value>
        <description>
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        </description>
    </property>
    <property>
        <name>dfs.namenode.https-bind-host</name>
        <value>0.0.0.0</value>
        <description>
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        </description>
    </property>

</configuration>

我的完整设置可以为viewed here on GitHub

有没有人知道我在做什么错,这会阻止同一Docker容器中的Spark worker和HDFS datanode进程绑定到同一IP地址?

tjdalele 回答:在Docker Swarm上部署Spark和HDFS无法启用数据本地性

是不是跟这个的使用有关:

    <property>
        <name>dfs.client.use.datanode.hostname</name>
        <value>true</value>
    </property>

如果我是对的,使用主机名意味着绑定到容器而不是服务本身。

本文链接:https://www.f2er.com/3131317.html

大家都在问