问题描述:
在阿里云服务器搭建完Hadoop环境后,在服务器上用shell命令可以读取写入文件
在本地java程序可以连接hadoop,并创建路径。
Boolean result = fileSystem.mkdirs(path);
但是读取hdfs上的文件就报错。
FSDataInputStream fsDataInputStream =fileSystem.open(new Path("/README.txt"));
IOUtils.copyBytes(fsDataInputStream,System.out,1024);
问题原因:
1.阿里云服务器Shell 可以正常操作,排除集群搭建和进程没有启动的问题。
2.HDFS 中的文件夹和文件名都是存放在 NameNode 上,操作不需要和 DataNode 通信,因此可以正常创建文件夹和创建文件说明本地和远程 NameNode 通信没有问题。
3.那么很可能是本地和远程 DataNode 通信有问题。
4.猜测问题原因为:文件夹和文件名都是存放在 NameNode 上的,我本地可以通过公网访问 NameNode,所以创建文件夹和文件都可以,但是当我写数据的时候,NameNode 和DataNode 是通过内网通信的,NameNode 会返回给我 DataNode 的内网 IP,我本地就访问不了了。
还有一种可能,云服务器没有开放 DataNode 用于数据传输服务端口 默认是 50010。
解决问题:
1.构造HDFS客户端的时候加如下配置,使 NameNode 返回 DataNode 的主机名而不是 IP
configuration = new Configuration();
configuration.set("dfs.client.use.datanode.hostname", "true");
2.阿里云服务器的host配置如下:
/etc/hosts
172.xx.xx.xx hadoop000
3.阿里云服务器开放50010端口
问题解决了!!
网友评论