对Docker Container的HTTP调用将IP重定向到Docker ID

时间:2017-01-04 19:10:49

标签: python hadoop docker ip hdfs

我在Windows 10计算机上运行Hadoop Docker容器。我正在尝试使用this库编写一个Python程序来访问我的HDFS。我能够使用配置了“http://localhost:50070”的客户端列出文件夹内容(50070是webHDFS端口)。但是,当我尝试读取文件的内容时,我收到一条错误消息,指出该地址无法解析。在返回的错误中,主机是我的Docker容器“453af3bd9164”的ID,而不是我期望的“localhost”或“127.0.0.1”。

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

如何正确配置环境,以便对我的HDFS数据节点的HTTP调用正常工作?

核心-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>

等/主机:

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

1 个答案:

答案 0 :(得分:1)

经过几个小时的挖掘,我终于解决了这个问题。也许这对某些人来说是显而易见的,但希望我可以通过发布我的解决方案来帮助像我这样的新手。

当我第一次运行我的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>

做这两件事让我可以读/写我的数据节点。