[WARN] - I/O error constructing remote block reader.
java.net.ConnectException: Connection timed out: no further information
...
[WARN] - Connection failure: Failed to connect to /10.0.0.24:9866 for file /user/hive/warehouse/hw_data.db/dws/dws_hw_ltv_detail/date=2019-08-14/part-00000-d037228a-1815-4288-a9ac-10b3062090d8.c000 for block BP-1993280466-192.168.100.45-1566407732189:blk_1075498905_1760462:java.net.ConnectException: Connection timed out: no further information
java.net.ConnectException: Connection timed out: no further information
问题
CDH6.2集群,跟本地电脑不在同一局域网,Spark 读取 Hive 报以上错。
检查
1. 本地及远程 HDFS 服务器都已配置好映射。
2. 已开放远程服务器防火墙,9866端口。
3. 远程连接 Namenode WebUI 及访问 HDFS 没问题,但是不能通过 WebUI 下载文件。
http://cdh-slave01:9870
4. HDFS API直接读取文件没问题,只能查看目录,不能查看文件内容。
读取目录没问题
val conf = new Configuration()
conf.addResource("hdfs-site.xml")
val fs = FileSystem.get(conf)
val files = fs.listFiles(new Path("/dw"),true)
while (files.hasNext) {
println(files.next().getPath)
}
读取文件报错
val conf = new Configuration()
conf.addResource("hdfs-site.xml")
val fs = FileSystem.get(conf)
val path = "hdfs://BigdataCluster/dw/test.txt"
val fis = fs.open(new Path(path))
IOUtils.copyBytes(fis, System.out, 4096, true)
5. Spark 读取 Hive 报错。
val rdd = spark.sparkContext.textFile("/dw/test.txt")
rdd.foreach(println)
原因
Namenode 与 Datanode之间是内网通讯,HDFS 中的元数据是存放在 Namenode 上,所以 Namenode 返回的是数据所在节点的内网 ip,客户端使用 NameNode 提供的 ip 地址来连接到 Datanode,因为不在一个局域网,客户端无法访问此内网IP地址。
解决
客户端对 DataNode 主机名执行 DNS 解析。
1. 初始化SparkSession时,配置客户端采用 hostname 访问 Datanode。
.config("dfs.client.use.datanode.hostname", "true")
2. 或者 IDEA 中修改 hdfs-site.xml 配置文件。
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
- 设置完成,仍然报错,但显示被拒绝连接:
[WARN] - I/O error constructing remote block reader.
java.net.ConnectException: Connection refused: no further information
...
Connection failure: Failed to connect to /10.0.0.23:9866 for file /user/hive/warehouse/hw_data.db/ads/ads_hw_new_user_count/part-00000-928e4831-6e7e-4bb1-a112-1bf618e61894-c000.snappy.orc
for block BP-1993280466-192.168.100.45-1566407732189:blk_1075723576_1985133:java.net.ConnectException: Connection timed out: no further information
java.net.ConnectException: Connection timed out: no further information
检查端口,发现服务监听的是内网ip:
进入CDH 的 HDFS 配置,搜索 通配符地址,勾选 DataNode,重启生效。
再查看端口:
再运行 Spark 已经没问题,问题解决。