docker - Hadoop在不使用IP的情况下无法访问数据节点

标签 docker hadoop hdfs webhdfs datanode

我有以下系统:

  • Windows主机
  • 带有Docker的Linux guest虚拟机(在Virtual Box中)

  • 我已经在Docker(Ubuntu,Virtual Box)中安装了HDFS。我使用了来自Docker Hub的bde2020 hadoop镜像。这是我的 docker 组成:
    namenode:
        image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
        container_name: namenode
        restart: always
        ports:
          - 9870:9870
          - 9000:9000
        volumes:
          - hadoop_namenode:/hadoop/dfs/name
        environment:
          - CLUSTER_NAME=test
        env_file:
          - ./hadoop.env
        networks: 
          control_net:
            ipv4_address: 10.0.1.20
      datanode:
        image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
        container_name: datanode
        restart: always
        ports:
          - 9864:9864
        volumes:
          - hadoop_datanode:/hadoop/dfs/data
        environment:
          SERVICE_PRECONDITION: "namenode:9870"
        env_file:
          - ./hadoop.env
        networks: 
          control_net:
            ipv4_address: 10.0.1.21
      resourcemanager:
        image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8
        container_name: resourcemanager
        restart: always
        environment:
          SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864"
        env_file:
          - ./hadoop.env
        networks: 
          control_net:
            ipv4_address: 10.0.1.22
      nodemanager1:
        image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
        container_name: nodemanager
        restart: always
        environment:
          SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
        env_file:
          - ./hadoop.env
        networks: 
          control_net:
            ipv4_address: 10.0.1.23
      historyserver:
        image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8
        container_name: historyserver
        restart: always
        environment:
          SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
        volumes:
          - hadoop_historyserver:/hadoop/yarn/timeline
        env_file:
          - ./hadoop.env
        networks: 
          control_net:
            ipv4_address: 10.0.1.24        
    volumes: 
      hadoop_namenode:
      hadoop_datanode:
      hadoop_historyserver:   
    networks:
      processing_net:
        driver: bridge
        ipam:
          driver: default
          config:
            - subnet: 10.0.0.0/24
              gateway: 10.0.0.1
    
    我的hdfs-site.xml是:
    <configuration>
    
    <property><name>dfs.namenode.datanode.registration.ip-hostname-check</name><value>false</value></property>
    <property><name>dfs.webhdfs.enabled</name><value>true</value></property>
    <property><name>dfs.permissions.enabled</name><value>false</value></property>
    <property><name>dfs.namenode.name.dir</name><value>file:///hadoop/dfs/name</value></property>
    <property><name>dfs.namenode.rpc-bind-host</name><value>0.0.0.0</value></property>
    <property><name>dfs.namenode.servicerpc-bind-host</name><value>0.0.0.0</value></property>
    <property><name>dfs.namenode.http-bind-host</name><value>0.0.0.0</value></property>
    <property><name>dfs.namenode.https-bind-host</name><value>0.0.0.0</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>
    </configuration>
    
    如果我在导航器中从Linux(在Virtual Box中)编写:

    http://10.0.1.20:9870


    然后我可以访问Hadoop Web ui。
    如果我从Windows(主机系统,Virtual Box外部)在导航器中编写:

    http://192.168.56.1:9870 then I can access too (I have mapped this IP to be able to connect from outside of Virtual Box).


    但是,当我在Web界面中导航并想要下载文件时,就会出现问题。然后,导航器说它无法连接到服务器dcfb0bf3b42c,并在地址选项卡中显示了这样的一行:
    http://dcfb0bf3b42c:9864/webhdfs/v1/tmp/datalakes/myJsonTest1/part-00000-0009b521-b474-49e7-be20-40f5e8b3a7b4-c000.json?op=OPEN&namenoderpcaddress=namenode:9000&offset=0
    
    如果我将“dcfb0bf3b42c”这一部分更改为IP:10.0.1.21(从Linux)或192.168.56.1(从Windows),则可以正常工作并下载文件。
    我需要使该过程自动化,以避免每次都需要手动编写IP,因为我需要使用一个程序来访问HDFS数据(Power BI),并且由于上述问题,当它尝试访问数据时会失败。
    我是Hadoop的新手。我可以通过编辑任何配置文件来解决此问题吗?

    最佳答案

    最后,我找到了解决该问题的方法。
    这些步骤是:
    1-在注释中建议的@smart_coder中,对所有服务使用docker-compose中的de hostname标记:

    hostname:datanode
    
    2-编辑(在Linux中)/ etc / hosts文件并添加路由到我的服务的ip(在这种情况下,我需要将“datanode”映射到其IP),因此我将这一行添加到了/ etc / hosts文件中:
    192.168.56.1 datanode
    
    (这是一个真正的IPv4 IP,如果我添加10.0.1.21,这是在我的docker-compose中创建的Docker IP也可以在Linux中使用,但是我不确定它是否可以从Windows访问)。通过第二步,我们可以将“datanode”一词解析为IP 192.168.56.1,这将(仅)在我的Linux guest虚拟机中起作用。
    但是请记住,在我的第一条评论中,我已经将Windows IP(192.168.56.1)映射到了Docker(Linux)IP(10.0.1.21),因此,如果您仅使用Linux,则可以编写在您的Docker撰写文件,它将起作用。
    3-通过执行以下步骤编辑(在Windows中)/ etc / hosts文件:
  • 按Windows键
  • 编写记事本
  • 右键单击->以管理员身份运行
  • 从记事本中,打开文件:C:\ Windows \ System32 \ Drivers \ etc \ hosts
    (c是我的硬盘驱动器,因此如果您的硬盘使用其他名称,则地址可以不同)。
  • 我添加的
  • :
  • 192.168.56.1 datanode
  • 保存

  • 第三步允许将单词“datanode”解析为Windows主机的IP 192.168.56.1。完成此步骤后,我便可以从Linux guest (位于VirtualBox内)和Windows主机下载访问文件。

    关于docker - Hadoop在不使用IP的情况下无法访问数据节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63318040/

    相关文章:

    hadoop - 如何将HDFS数据持久化到docker容器中

    apache - 无法将数据从水槽提取到 hdfs hadoop 以获取日志

    hadoop - 带有按时间戳分区的配置单元表的 sqoop 导出问题

    docker - 使用 docker image testcafe/testcafe 时没有创建截图目录的权限

    ubuntu - Oracle vm 中 ubuntu 中的 SSH 连接抛出错误

    Docker-machine 连接到现有的 AWS 机器

    java.lang.NumberFormatException : For input string: "100" while executing MapReduce 异常

    java - Eclipse Hadoop 插件在尝试连接时显示 "java.io.EOFException"

    node.js - dockerize NestJS 和 TypeORM

    docker - Traefik中间件无法与docker compose一起使用