解决外网无法访问HDFS文件系统①

解决外网无法访问HDFS文件系统①,第1张

解决外网无法访问HDFS文件系统① 本地HDFS的javaAPI访问云服务器Hadoop问题解决 1. 初始问题

使用云上的虚拟环境搭建好的测试集群,在本地IDEA做调试,但是发现本地IDEA无法连接测试环境

导入一些数据,本地HDFS的JavaAPI访问云服务器上的Hadoop服务时,终端展现IP地址的形式:

outUrl hdfs://公网ip地址:9000/root/output1/

这里的ip,是云服务器的网关ip,所以在访问的时候,出现了下面的异常:

  2021-12-28 20:55:56,811 WARN [org.apache.hadoop.hdfs.BlockReaderFactory] - I/O error constructing remote block reader.
  java.net.ConnectException: Connection timed out: no further information
详纠报错

报错核心

2021-12-28 20:56:58,268 WARN [org.apache.hadoop.hdfs.DFSClient] - Failed to connect to /内网ip地址:50010 for block, add to deadNodes and continue. java.net.ConnectException: Connection timed out: no further information

此处的ip地址,使用的是云服务的内网ip,用人话口吻解释:我们本地执行程序时访问hdfs上的DataNode时用的是内网IP。
这也就导致了报错,本地服务是无法访问云服务器的内网IP、而只能访问外网IP。

通过日志可以看出,是本地中无法连接到远程服务器,查看网络服务可以发现通信时访问的是内部网络,也就是NameNode与DataNonde的通信是采用内网进行通信的,我们在本地调试的时候需要指定网络为外部网络

这里可以通过编辑器自带的打断点(Debug)功能去逐一排查问题,在此不做演示

2. 解决问题

翻阅各类帖子,提炼出两种我个人觉得实用性较高的解决方法汇总如下

2.1 HostName访问

简明扼要:使用HostName实现本地访问云服务的内网

过程:

  • 云服务器的Hadoop配置hostname访问
  • 云服务器配置,内网于HostName的映射
  • 云服务器的Hadoop配置文件都用HostName
  • 本地修改hosts文件,云服务器外网ip和HostName的映射
2.1.1 hdfs-site.xml添加

本地目录添加或者服务器添加均可

这里的话配置涉及到优先级问题:本地优先级>服务器

在IDEA中resource的hdfs-site.xml 配置,即使用hostname连接datanode


    only cofig in clients
	dfs.client.use.datanode.hostname
    true

2.1.2 配置云服务映射
vim /etc/hosts
# 添加内网IP和新增的hostname的映射
内网IP地址 testname
2.1.3 core-site.xml添加

    fs.defaultFS
    
    hdfs://testname:9000

2.1.4 修改本地hosts文件

本地hosts文件目录:C:WindowsSystem32driversetchosts
在hosts文件中添加:

公网ip地址 hadooptest

也是云服务器外网IP

2.2 指定NN与DN通信

在程序中指定NN和DN之间的通信为外网,此方式仅适用于API *** 作HDFS

import org.apache.hadoop.conf.Configuration;
// 使用hdfs的fs功能,客户端访问core-site.xml配置文件
Configuration conf = new Configuration(); 
// 设置客户端访问datanode使用hostname来进行访问
conf.set("dfs.client.use.datanode.hostname", "true");
// 设置core-site.xml中的属性fs.defaultFS和属性值,注意主机名必须和设置的hosts主机名一致
conf.set("fs.defaultFS","hdfs://testname:9000");

由于本地测试网关和服务器不在同一局域网,安装的hadoop配置文件是以内网ip作为机器间通信的ip。

在这种情况下,我们能够访问到的namenode机器,此时,namenode会给数据所在机器的ip地址提供我们访问数据传输服务,但是返回的的是datanode内网的ip,我们无法根据该IP访问datanode服务器。

所以,我们需让namenode返回给我们datanode的域名,在开发机器的hosts文件中配置datanode对应的外网ip和域名,并且在与hdfs交互的程序中添加如上代码即可

写完本篇内容的时间略微有点晚了,状态有点差,先就此结束,后续会再汇总一篇问题引申解决,在此插个眼

了解更多知识请戳下:

@Author:懒羊羊

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5685326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存