gpt4 book ai didi

java - 使用 Java 读取远程 HDFS 文件

转载 作者:IT王子 更新时间:2023-10-29 00:54:55 30 4
gpt4 key购买 nike

我在安装简单的 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:无法获取 block :BP-13917963-127.0.0.1-1398476189167:blk_1073741831_1007 file=/usr/test/test_file。 txt

谷歌搜索给出了一些可能的提示,但都被检查过了。数据节点已连接,处于 Activity 状态,并且有足够的空间。来自 hdfs dfsadmin –report 的管理报告显示:

Configured Capacity: 52844687360 (49.22 GB)
Present Capacity: 48507940864 (45.18 GB)
DFS Remaining: 48507887616 (45.18 GB)
DFS Used: 53248 (52 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

Datanodes available: 1 (1 total, 0 dead)

Live datanodes:
Name: 127.0.0.1:50010 (test.server)
Hostname: test.server
Decommission Status : Normal
Configured Capacity: 52844687360 (49.22 GB)
DFS Used: 53248 (52 KB)
Non DFS Used: 4336746496 (4.04 GB)
DFS Remaining: 48507887616 (45.18 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.79%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Last contact: 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 个节点而不是最小复制(=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

非常感谢任何帮助。

最佳答案

Hadoop 错误消息令人沮丧。他们通常不会说出他们的意思,也与真正的问题无关。当客户端、namenode 和 datanode 无法正常通信时,我见过这样的问题。对于您的情况,我会选择以下两个问题之一:

  • 您的集群在虚拟机中运行,其对客户端的虚拟化网络访问被阻止。
  • 您没有始终如一地使用在客户端和主机之间解析相同的完全限定域名 (FQDN)。

主机名“test.server”非常可疑。检查以下所有内容:

  • test.server 是 FQDN 吗?
  • 这是您的 conf 文件中到处使用的名称吗?
  • 客户端和所有主机能否正向和反向解析"test.server"和它的 IP 地址和得到的一样吗?
  • 是否在任何地方使用 IP 地址代替 FQDN?
  • 是否在任何地方使用“localhost”?

必须删除 FQDN、主机名、数字 IP 和本地主机使用中的任何不一致之处。永远不要将它们混合在您的 conf 文件或您的客户端代码中。首选始终使用 FQDN。一致使用数字 IP 通常也有效。使用不合格的主机名、localhost 或 127.0.0.1 会导致问题。

关于java - 使用 Java 读取远程 HDFS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23307235/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com