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

我有以下系统:

  • Windows主机
  • Linux客户与Docker(在Virtual Box中)

我已经在Docker(Ubuntu,Virtual Box)中安装了HDFS。我使用了来自Docker Hub的bde2020 hadoop映像。这是我的docker-compose:

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,然后我也可以访问(我已将此IP映射为可以从Virtual Box外部进行连接)。

但是,当我在Web ui中导航并想要下载文件时,就会出现问题。然后,导航器说它无法连接到服务器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的新手。我可以通过编辑任何配置文件来解决此问题吗?

iCMS 回答:Hadoop在不使用IP的情况下无法访问数据节点

最后,我找到了解决此问题的方法。

步骤是:

1-对所有服务使用docker-compose中的de hostname标记,如注释中建议的@smart_coder所示:

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来宾系统中起作用。

但是,请记住,在我的第一条评论中,我已将Windows IP(192.168.56.1)映射到Docker(Linux)IP(10.0.1.21),因此,如果在您的情况下仅使用Linux,则可以编写在您的Docker撰写文件中创建了IP,它将正常工作。

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来宾(位于VirtualBox内)和Windows主机下载正在访问的文件。

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

大家都在问