一、HDFS-API-open读取文件
1. 准备数据和代码实现
基于阿里云搭建的hadoop环境,先查看文件路径,命令:hadoop fs -ls /
读取根目录下的README.txt
Java代码:通过fileSystem对象open方法打开hdfs的文件
// 打开阿里云hadoop服务根目录的README.txt文件
FSDataInputStream open = fileSystem.open(new Path("/README.txt"));
// 将文件内容打印到控制台
IOUtils.copyBytes(open, System.out, 2048);
2. 出现的问题
-
运行报错:Could not obtain block: BP-657694722-172.31.215.197-1587788443531:blk_1073741825_1001 file=/README.txt,但是创建文件和文件夹确实正常的。
原因:
- 文件夹是放在NameNode上的,在etc/hadoop/core-site.xml中的fs.defaultFS已经配置了任意ip可以访问。所以创建文件夹和文件名都不会有问题,但是当去读取数据的时候,NameNode和DataNode需要通信,而它们当时注册的时候,根据上面的报错信息,我们就知道肯定是内网【172.31.215.197】,当然通过断点调试,我们也可以证明这点。读数据的时候先访问NameNode,NameNode返回一个内网地址给我,那我本地肯定是访问不了的。
- 阿里云安全策略未打开50010端口,DataNode的数据传输端口
解决方案:
-
创建configuration之后设置dfs.client.use.datanode.hostname为true
configuration.set("dfs.client.use.datanode.hostname", "true");
-
查看阿里云内网ip,命令
ifconfig
-
查看阿里云内网映射,命令:
vim /etc/hosts
-
配置本地host:阿里云公网ip 和阿里云的内网ip对应的映射
-
阿里云安全组开放50010端口
-
效果
- 文件夹是放在NameNode上的,在etc/hadoop/core-site.xml中的fs.defaultFS已经配置了任意ip可以访问。所以创建文件夹和文件名都不会有问题,但是当去读取数据的时候,NameNode和DataNode需要通信,而它们当时注册的时候,根据上面的报错信息,我们就知道肯定是内网【172.31.215.197】,当然通过断点调试,我们也可以证明这点。读数据的时候先访问NameNode,NameNode返回一个内网地址给我,那我本地肯定是访问不了的。