当前位置:  开发笔记 > 编程语言 > 正文

使用Java读取远程HDFS文件

如何解决《使用Java读取远程HDFS文件》经验,为你挑选了0个好方法。

我在使用简单的Hadoop安装时遇到了一些麻烦.我已经下载了hadoop 2.4.0并安装在一个CentOS Linux节点(虚拟机)上.我已经为apache站点(http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html)上描述的具有伪分发的单个节点配置了hadoop .它从日志中没有问题开始,我可以使用命令行中的"hadoop fs"命令读取+写入文件.

我正在尝试使用Java API从远程计算机上的HDFS读取文件.机器可以连接并列出目录内容.它还可以确定文件是否存在以及代码:

Path p=new Path("hdfs://test.server:9000/usr/test/test_file.txt");
FileSystem fs = FileSystem.get(new Configuration());
System.out.println(p.getName() + " exists: " + fs.exists(p));

系统打印"true"表示它存在.但是,当我尝试使用以下内容读取文件时:

BufferedReader br = null;
try {
    Path p=new Path("hdfs://test.server:9000/usr/test/test_file.txt");
    FileSystem fs = FileSystem.get(CONFIG);
    System.out.println(p.getName() + " exists: " + fs.exists(p));

    br=new BufferedReader(new InputStreamReader(fs.open(p)));
    String line = br.readLine();

    while (line != null) {
        System.out.println(line);
        line=br.readLine();
    }
}
finally {
    if(br != null) br.close();
}

此代码抛出异常:

线程"main"中的异常org.apache.hadoop.hdfs.BlockMissingException:无法获取块:BP-13917963-127.0.0.1-1398476189167:blk_1073741831_1007 file =/usr/test/test_file.txt

谷歌搜索提供了一些可能的提示,但都检查了.数据节点已连接,处于活动状态,并且具有足够的空间.来自hdfs dfsadmin -report的管理员报告显示:

配置容量:52844687360(49.22 GB)
当前容量:48507940864(45.18 GB)
DFS剩余:48507887616(45.18 GB)使用
DFS:53248(52 KB)
DFS已使用%:0.00%
在复制块下:0
块具有损坏的副本:0
缺失blocks:0

Datanodes available:1(总共1,0死)

实时datanodes:
名称:127.0.0.1
:50010 (test.server)主机名:test.server
退役状态:正常
配置容量:52844687360(49.22 GB)使用
DFS:53248 (52 KB)
非DFS使用:4336746496(4.04 GB)
DFS剩余:48507887616(45.18 GB)
DFS使用%:0.00%
DFS剩余%:91.79%
配置缓存容量:0(0 B)使用的
缓存:0(0 B)
剩余高速缓存:0(0 B)使用的
高速缓存%:100.00%
高速缓存剩余%:0.00%
最后联系人:Fri Apr 25 22:16:56 PDT 2014

客户端jar直接从hadoop安装中复制,因此没有版本不匹配.我可以使用Java类浏览文件系统并读取文件属性.我没有得到异常就无法读取文件内容.如果我尝试用代码编写一个文件:

FileSystem fs = null;
BufferedWriter br = null;

System.setProperty("HADOOP_USER_NAME", "root");

try {
    fs = FileSystem.get(new Configuraion());

    //Path p = new Path(dir, file);
    Path p = new Path("hdfs://test.server:9000/usr/test/test.txt");
    br = new BufferedWriter(new OutputStreamWriter(fs.create(p,true)));
    br.write("Hello World");
}
finally {
    if(br != null) br.close();
    if(fs != null) fs.close();
}

这会创建文件,但不会写任何字节并抛出异常:

线程"main"中的异常org.apache.hadoop.ipc.RemoteException(java.io.IOException):文件/usr/test/test.txt只能复制到0个节点而不是minReplication(= 1).在此操作中,有1个数据节点正在运行,1个节点被排除在外.

谷歌搜索表明可能存在空间问题但是从dfsadmin报告来看,似乎有足够的空间.这是一个简单的vanilla安装,我无法解决这个问题.

环境摘要是:

服务器:

带有伪分发的Hadoop 2.4.0(http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html)

CentOS 6.5虚拟机64位服务器Java 1.7.0_55

客户:

Windows 8(虚拟机)Java 1.7.0_51

任何帮助是极大的赞赏.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有