本地远程连接云主机Hadoop集群调试失败,datanode连接超时,端口9866

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

问题

在本地虚拟机有一套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:?]

在这里插入图片描述

原因分析

  1. 9866端口是hdfs文件系统datanode的数据传输接口。
  2. 并且我们查看集群日志,发现nameNode日志正常滚动没有报错,dataNode日志没有反应。
  3. 仔细分析是 本地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>

代码里面也是显式声明配置:
在这里插入图片描述

重新跑程序,问题解决
在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值