问题
在本地虚拟机有一套hadoop集群,阿里云主机有一套集群。
本地IDEA开发工具写的MapReduce调试案例,可以在直接连接本地虚拟机集群运行跑,但是连接云主机集群报错,连接datanode超时!
报错信息如下:
org.apache.hadoop.net.ConnectTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/172.24.26.251:9866]
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:534) ~[hadoop-common-3.1.3.jar:?]
at org.apache.hadoop.hdfs.DataStreamer.createSocketForPipeline(DataStreamer.java:253) ~[hadoop-hdfs-client-3.1.3.jar:?]
at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1725) [hadoop-hdfs-client-3.1.3.jar:?]
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1679) [hadoop-hdfs-client-3.1.3.jar:?]
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:716) [hadoop-hdfs-client-3.1.3.jar:?]

原因分析
- 9866端口是hdfs文件系统datanode的数据传输接口。
- 并且我们查看集群日志,发现nameNode日志正常滚动没有报错,dataNode日志没有反应。
- 仔细分析是 本地client正常请求了nameNode,nameNode正常返回了需要传输数据的dataNode,但是!!!!返回的是一个IP,集群的内网ip,当你的客户端和集群不在一个局域网的时候,你拿这个ip当然是请求不到datanode数据的!!因此访问超时!
显然,本地虚拟机的地址与本机共用一个内网,因此没有这个问题!
解决办法
找了很久资料,发现有hdfs-site.xml个配置,datanode的 client通信是否使用域名,默认为false,改为true。
<!-- datanode 通信是否使用域名,默认为false,改为true -->
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
<description>Whether datanodes should use datanode hostnames when
connecting to other datanodes for data transfer.
</description>
</property>
代码里面也是显式声明配置:

重新跑程序,问题解决

本地IDEA调试MapReduce时,连接阿里云主机上的Hadoop集群出现datanode超时问题。原因是nameNode返回的dataNode IP为内网IP,导致客户端无法访问。解决办法是在`hdfs-site.xml`中配置datanode的client通信使用域名,并在代码中显式声明该配置,问题得以解决。

2389

被折叠的 条评论
为什么被折叠?



