HTTP调用到Docker容器将IPredirect到Docker ID

我正在Windows 10机器上运行Hadoop Docker容器。 我正在尝试使用这个库来编写一个Python程序来访问我的HDFS。 我能列出与我的客户端configuration“ http:// localhost:50070 ”(50070是webHDFS端口)的文件夹内容。 但是,当我尝试读取文件的内容时,出现错误,说明地址无法parsing。 在返回的错误中,主机是我所期望的Docker容器“453af3bd9164”的ID,而不是“localhost”或“127.0.0.1”。

我曾尝试使用不同的Docker容器和不同的Python库,仍然得到类似的错误。 所以我的猜测是我没有正确configuration我的Docker或Hadoop环境。 由于我可以从我的Docker主机访问NameNode WebUI,并且列出的文件夹内容可以正常工作,所以我认为我的datanodeconfiguration可能是问题所在。 当我通过WebUI检查时,我的datanode显示为“In Service”,所以至less运行。

如何正确configuration我的环境,以便HTTP调用我的HDFS datanode正常工作?

核心-site.xml中:

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> 

HDFS-site.xml中:

 <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.datanode.http.address</name> <value>0.0.0.0:50075</value> </property> </configuration> 

etc / hosts文件:

 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 453af3bd9164 192.168.56.1 192.168.56.1 

经过数小时的挖掘,我终于解决了这个问题。 也许这对一些人来说是显而易见的,但希望能通过发布我的解决scheme来帮助像我这样的noobs。

当我第一次运行我的docker,我没有指定一个主机名用于我的容器,所以它被分配了一个随机的默认值,在这种情况下是453af3bd9164。 但是,这会导致DNS查找问题,您需要确保您的Docker容器的主机名和Docker容器的名称相同。 所以我加了这个标志:

 docker run -h "computer-name@example.com" 

我也将这个属性添加到我的hdfs-site.xml中:

 <property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</false> </property> 

做这两件事让我读/写我datanodes。