热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

在DockerSwarm上部署Spark和HDFS不会启用数据局部性

如何解决《在DockerSwarm上部署Spark和HDFS不会启用数据局部性》经验,需要怎么解决?

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

为了启用数据局部性,我在每个服务器上都制作了一个单一的“工作节点”容器,该容器同时包含Spark工作程序和HDFS数据节点。这里的想法是,由于它们在同一容器中运行,因此它们在堆栈的覆盖网络上都应具有相同的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配置如下所示:




    
        dfs.datanode.data.dir
        /data/hdfs/datanode
    
    
        dfs.namenode.name.dir
        /data/hdfs/namenode
    
    
        dfs.replication
        2
        The default replication factor of files on HDFS
    
    
        dfs.webhdfs.enabled
        true
    
     
        dfs.block.size
        64m
        The default block size in bytes of data saved to HDFS
    
    
        dfs.namenode.datanode.registration.ip-hostname-check
        false
    
    
        dfs.client.use.datanode.hostname
        true
    
    
        dfs.datanode.use.datanode.hostname
        true
    

    
        dfs.namenode.rpc-bind-host
        0.0.0.0
        
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        
    
    
        dfs.namenode.servicerpc-bind-host
        0.0.0.0
        
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        
    
    
        dfs.namenode.http-bind-host
        0.0.0.0
        
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        
    
    
        dfs.namenode.https-bind-host
        0.0.0.0
        
            controls what IP address the NameNode binds to. 
            0.0.0.0 means all available.
        
    


我的完整设置可以在GitHub上查看。

有谁知道我在做什么错,这是防止同一个Docker容器中的Spark worker和HDFS datanode进程绑定到相同的IP地址吗?


推荐阅读
author-avatar
加乘ACCA财务英语教室_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有