gpt4 book ai didi

java - 在 Hadoop 2 中从 Java 远程读取 HDFS 文件时出现 BlockMissingException

转载 作者:可可西里 更新时间:2023-11-01 14:56:54 24 4
gpt4 key购买 nike

我使用的是 Hadoop 2.6,我有一个安装了 HDFS 的虚拟机集群。我正在尝试通过在我的本地运行的一些 Java 代码远程读取我的 HDFS 中的文件,以基本方式,使用 BufferedReader

    FileSystem fs = null;
String hadoopLocalPath = "/path/to/my/hadoop/local/folder/etc/hadoop";
Configuration hConf = new Configuration();
hConf.addResource(new Path(hadoopLocalPath + File.separator + "core-site.xml"));
hConf.addResource(new Path(hadoopLocalPath + File.separator + "hdfs-site.xml"));
try {
fs = FileSystem.get(URI.create("hdfs://10.0.0.1:54310/"), hConf);
} catch (IOException e1) {
e1.printStackTrace();
System.exit(-1);
}
Path startPath = new Path("/user/myuser/path/to/my/file.txt");

FileStatus[] fileStatus;
try {
fileStatus = fs.listStatus(startPath);
Path[] paths = FileUtil.stat2Paths(fileStatus);

for(Path path : paths) {
BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(path)));
String line = new String();
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

程序可以正确访问HDFS(没有出现异常)。如果我要求通过代码列出文件和目录,它可以毫无问题地读取它们。

现在,问题是如果我尝试读取一个文件(如代码所示),它会在读取时卡住(暂时),直到出现 BlockMissingException

org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-2005327120-10.1.1.55-1467731650291:blk_1073741836_1015 file=/user/myuser/path/to/my/file.txt
at org.apache.hadoop.hdfs.DFSInputStream.chooseDataNode(DFSInputStream.java:888)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:568)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:800)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:847)
at java.io.DataInputStream.read(DataInputStream.java:149)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at uk.ou.kmi.med.datoolkit.tests.access.HDFSAccessTest.main(HDFSAccessTest.java:55)

我已经知道的:

  • 我直接在运行 namenode 的机器上尝试了相同的代码,它工作得很好
  • 我已经检查了 namenode 的日志,并将我本地计算机的用户添加到管理 HDFS 的组中(按照 this threadother related threads 的建议)
  • 按照 this thread 的建议,完全合格的域名应该没有问题,因为我使用的是静态 IP。另一方面,“您的集群在 VM 中运行并且其对客户端的虚拟化网络访问被阻止”可以是一个选项。我会说,如果是那样的话,它不应该允许我对 HDFS 执行任何操作(见下一点)
  • 集群在带有防火墙的网络上运行,我已经正确打开并转发端口 54310(我可以访问 HDFS 用于其他目的,如创建文件、目录和列出它们的内容)。我想知道是否还有其他端口需要打开才能读取文件

最佳答案

你能确保 Datanode 也可以从客户端访问吗?连接在 AWS 中配置的 Hadoop 时,我遇到了类似的问题。我能够通过在所有数据节点和我的客户端系统之间建立连接来解决这个问题

关于java - 在 Hadoop 2 中从 Java 远程读取 HDFS 文件时出现 BlockMissingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38742371/

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