【发布时间】:2014-04-26 05:53:56
【问题描述】:
我在安装简单的 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 文件=/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
缺少块:0
可用数据节点:1 个(总共 1 个,0 个死节点)
实时数据节点:
名称: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%
最后联系时间:2014 年 4 月 25 日星期五 22:16:56 PDT
客户端 jars 是直接从 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 报告来看,似乎有足够的空间。这是一个普通的香草安装,我无法解决这个问题。
环境总结为:
服务器:
具有伪分布的 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
非常感谢任何帮助。
【问题讨论】:
-
检查所有 live 节点和命名节点的内部设置。因为它在你的问题中是 127.0.0.1
-
或者你能把你的日志放在这里吗?
标签: java linux apache hadoop hdfs