无法建立从 docker 容器对在 macOS 上运行的数据节点的访问



我没有使用HDFS的经验,我在我的macbook上遇到了一个与HDFS相关的问题。我有一个在docker容器中启动的HDFS客户端,每次我试图从这个容器中放入或从HDFS获取数据时,我都会得到以下错误:

hdfs dfs -put /core-site.xml hdfs://host.docker.internal:9000/abcs
21/03/02 07:28:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
21/03/02 07:28:48 INFO hdfs.DFSClient: Exception in createBlockOutputStream
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:530)
at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1610)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1408)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1361)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:588)
21/03/02 07:28:48 INFO hdfs.DFSClient: Abandoning BP-1485605719-127.0.0.1-1614607405999:blk_1073741832_1008
21/03/02 07:28:48 INFO hdfs.DFSClient: Excluding datanode 127.0.0.1:9866
21/03/02 07:28:48 WARN hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /abcs/core-site.xml._COPYING_ could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

可以清楚地看到,我的客户端(容器)接收到错误的DataNode的IP地址(127.0.0.1:9866),它应该是192.168.65.2:9866,即host.docker.internal。或者我的笔记本电脑的域名(例如my-laptop)

My core-site.xml:(当然我的笔记本电脑绑定到etc/hosts中的127.0.0.1)

<configuration>
<property>         
<name>fs.defaultFS</name>         
<value>hdfs://my-laptop:9000</value>     
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/Users/Ian_Rakhmatullin/localHadoopTmp</value>
</property>
</configuration>

hdfs-site.xml:

<configuration>
<property>         
<name>dfs.replication</name>        
<value>1</value>    
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</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>
<property>
<name>dfs.datanode.address</name>
<value>my-laptop:9866</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>my-laptop:9864</value>
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>my-laptop:9867</value>
</property>
</configuration>

另一件让我困惑的事情是,通过HDFS的webUI,我可以看到DataNode在localhost:9866 (127.0.0.1:9866)上运行,但我期望"my-laptop:9866"。

有没有人有任何想法如何解决这个问题?谢谢你。

似乎我已经解决了这个问题,通过以下步骤:

  1. 在hdfs
  2. 中添加dfs.datanode.hostname属性

hdfs-site xml:

<property>         
<name>dfs.replication</name>        
<value>1</value>    
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</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> 
<property>
<name>dfs.datanode.hostname</name>
<value>my-laptop</value>
</property> 

core-site XML与我的问题相同。

  1. 在hdfs客户端hdfs-site.xml中添加dfs.client.use.datanode.hostname;
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
  1. 将DNS名称(在我的情况下是我的笔记本电脑)映射到您的docker主机的IP地址(在我的情况下是host.docker.internal) ->192.168.65.2)在容器的etc/hosts
192.168.65.2 my-laptop

使用这种方法Namenode将返回Datanode的主机名给hdfs客户端,然后,客户端将使用到host.docker.internal的映射。这就是我需要的。

相关内容

  • 没有找到相关文章

最新更新