hadoop不能在不使用ip的情况下访问datanode

drkbr07n  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(553)

我有以下系统:
windows主机
带docker的linux访客(在虚拟机中)
我已经在docker(ubuntu,virtualbox)中安装了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>

如果我在navigator中从linux(在virtualbox中)写入:
http://10.0.1.20:9870
然后我可以访问hadoopwebui。
如果我从windows(主机系统,虚拟机外部)写入导航器:
http://192.168.56.1:9870然后我也可以访问(我已将此ipMap为能够从虚拟机箱外部连接)。
但是当我在webui中导航并且我想下载一个文件时,问题就出现了。然后导航器说它无法连接到服务器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新手。我可以通过编辑任何配置文件来解决这个问题吗?

x33g5p2x

x33g5p2x1#

最后,我找到了解决这个问题的办法。
步骤如下:
1-在docker compose中使用de hostname标记,用于所有服务,如@smart\u coder在注解中建议的:

hostname:datanode

2-编辑(在linux中)/etc/hosts文件并添加路由到我的服务的ip(在本例中,我需要将“datanode”Map到其ip),因此我将此行添加到/etc/hosts文件:

192.168.56.1 datanode

(这是一个真正的ipv4 ip,如果我添加10.0.1.21,它是在docker compose中创建的docker ip,也可以在linux中工作,但我不确定它是否可以从windows访问)。通过这第二步,我们可以将“datanode”一词解析为ip192.168.56.1,这将(仅)在linux客户机中起作用。
但是请记住,在我的第一篇评论中,我已经将我的windows ip(192.168.56.1)Map到docker(linux)ip(10.0.1.21),所以如果您只使用linux,您可以在docker compose文件中编写创建的ip,并且它可以正常工作。
3-通过执行以下步骤(在windows中)编辑/etc/hosts文件:
按windows键
写记事本
右键单击->以管理员身份运行
从记事本中,打开文件:c:\windows\system32\drivers\etc\hosts(c是我的硬盘,因此如果您的硬盘有其他名称,则地址可能不同)。
我补充说: 192.168.56.1 datanode 节约
第三步允许将单词“datanode”解析为windows主机的ip192.168.56.1。完成这些步骤后,我可以从我的linux客户机(virtualbox内部)和windows主机下载访问的文件。

相关问题