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

时间:2016-08-03 11:32:26

标签: java hadoop

我正在使用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,如创建文件,目录和列出其内容)。我想知道是否还有其他端口需要打开文件阅读

1 个答案:

答案 0 :(得分:0)

您是否可以确保客户端也可以访问Datanode?连接AWS中配置的Hadoop时,我遇到了类似的问题。我能够通过符合所有数据节点和我的客户端系统之间的连接来解决问题