使用HDFS Java API从HDFS读取文件

时间:2013-10-21 12:49:20

标签: java hadoop hdfs

您正在尝试使用Java API从HDFS读取文件。

连接到HDFS并列出文件工作正常。

但是在尝试阅读文件时遇到了跟随异常

函数调用:fs.copyToLocalFile(path,dPath);

java.io.IOException: Could not obtain block: blk_-747325769320762541_16269493 file=/user/s3t.txt
    at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.chooseDataNode(DFSClient.java:2266)
    at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.blockSeekTo(DFSClient.java:2060)
    at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.read(DFSClient.java:2221)
    at java.io.DataInputStream.read(Unknown Source)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:68)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:47)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:100)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:230)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:163)
    at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1222)
    at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1203)
    at Access.main(Access.java:59)

注意:我可以使用fs.createNewFile(myPath)创建新文件;

2 个答案:

答案 0 :(得分:0)

你可以用两种方式检查。

  1. 检查文件,用户和文件组以及您的用户和组的权限,您必须具有访问该文件的权限。
  2. 当您正在远程访问文件时,可能是网络路径问题。
  3. 请检查两者。

答案 1 :(得分:-1)

https://stackoverflow.com/a/37661092/5797400 - 这可能有所帮助。这是我could not obtain block: BlockMissingException的解决方案 这是链接的基本要点:

  1. Namenode不直接读取或写入数据。
  2. 客户端(使用直接访问HDFS的Java程序)与Namenode交互以更新HDFS命名空间并检索用于读/写的块位置。
  3. 客户端直接与Datanode交互以读取/写入数据。