macos - 无法从 docker 容器访问在 macOS 上运行的 datanode
问题描述
我对 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)
我的 core-site.xml:(当然 my-laptop 绑定到 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”。
有没有人有任何想法如何解决这个问题?谢谢你。
解决方案
好像我已经通过以下步骤解决了这个问题:
- 在您的 hdfs 中添加 dfs.datanode.hostname 属性
hdfs 站点 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 与我的问题相同。
- 将 dfs.client.use.datanode.hostname 添加到 hdfs-site.xml 以获得 hdfs 客户端;
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
- 将 DNS 名称(在我的情况下为 my-laptop)映射到容器的 etc/hosts 中的 docker 主机的 IP 地址(在我的情况下为 host.docker.internal -> 192.168.65.2)
192.168.65.2 my-laptop
通过这种方法,Namenode 会将您的 Datanode 的主机名返回给 hdfs 客户端,然后,客户端将使用您的映射到 host.docker.internal。这就是我所需要的。
推荐阅读
- google-sheets - Google 表格中的问题与 SUM、ARRAYFORMULA、SUMIF 和“不等于”运算符的组合
- google-drive-api - 请求“.txt”类型的 Google 驱动器快捷方式文件时出错
- android - 我更改了 applicationId 并且调试(logcat)不再起作用
- wordpress - 根据 learndash 网站的语言隐藏课程
- c - 用于 UnitTests 的 Makefile(通用文件)
- python - AnalysisException:不支持在连接类型 LeftSemi 的连接条件中使用 PythonUDF
- flutter - _TypeError(类型'_InternalLinkedHashMap
' 不是类型 'Iterable 的子类型 ') 这是我的错误 - react-native - 反应原生 NAVITE BASE 选择器如何禁用选择器项目
- spring - 复合主键与多个主键
- flutter - Flutter:有没有办法创建一个始终存在的容器