本地笔记本向跨网络远程Hadoop集群执行hdfs put命令失败咨询
问题根因
HDFS读写采用「客户端先请求NameNode获取块存储位置、再直接和对应DataNode通信传输数据」的架构。你的Hadoop集群部署在内网环境,NameNode默认返回给客户端的是DataNode的内网IP/主机名,处于外网的本地客户端无法解析内网地址,也无法直接访问内网端口,所以出现UnknownHostException报错,确实需要配合端口映射/网络打通+配置调整解决。
你已配置的dfs.client.use.datanode.hostname=true仅让客户端优先使用主机名而非IP连接DataNode,但缺少集群侧和网络层的配套配置,所以不生效。
解决步骤
方案一:VPN打通(最简单,无需修改集群配置)
直接在本地笔记本安装VPN客户端,拨入Hadoop集群所在的内网,本地即可直接访问所有DataNode的内网IP,不需要修改任何Hadoop参数即可正常执行HDFS操作。
方案二:公网端口映射+配置调整
如果无法使用VPN,按以下步骤操作:
- 网络层端口转发配置
在集群出口路由器上为每个DataNode配置端口映射,默认需要映射的端口为9866(数据传输端口)、9864(Web UI端口),示例:
- 内网DataNode1
192.168.50.31:9866→ 公网mydns.asuscomm.com:19866 - 内网DataNode2
192.168.50.19:9866→ 公网mydns.asuscomm.com:29866
确保公网端口无防火墙拦截,本地可通过telnet命令验证端口连通性。
- 集群侧HDFS配置修改
修改集群所有节点的hdfs-site.xml,添加以下参数:
<!-- 让NameNode向客户端返回DataNode的主机名而非内网IP --> <property> <name>dfs.datanode.use.datanode.hostname</name> <value>true</value> </property>
每个DataNode单独配置自己对外暴露的公网信息,以DataNode1为例:
<property> <name>dfs.datanode.hostname</name> <value>mydns.asuscomm.com</value> </property> <property> <name>dfs.datanode.address</name> <value>0.0.0.0:19866</value> </property>
DataNode2对应把端口改为29866即可。修改完成后重启HDFS集群生效。
- 本地侧补充配置
你已经配置了dfs.client.use.datanode.hostname=true无需额外修改,如果给每个DataNode分配了独立的公网子域名,只需要在本地hosts文件中添加对应域名和公网IP的映射即可。
验证
配置完成后,执行原上传命令即可正常执行:
hdfs dfs -put ~/Documents/reddit-streaming/redditStreaming/target/redditStreaming-1.0-SNAPSHOT.jar hdfs://mydns.asuscomm.com:8021/user/me/jars/
内容的提问来源于stack exchange,提问作者steven hurwitt
相关产品推荐
相关产品推荐

