2013-10-21 193 views
0

您好,我尝试使用Java API从HDFS读取文件。使用HDFS从HDFS读取文件Java API

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

但在尝试读取文件我得到后续的例外

函数调用:fs.copyToLocalFile(路径,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中)新文件;

+0

你可以使用'hadoop dfs -get'获取文件吗?我认为该块已损坏。 –

+0

是的,我可以使用“hadoop dfs -get”获取文件。 – dnivra

+0

这很奇怪,因为'dfs -get'使用完全相同的API。你可以重新检查,如果你正在访问相同的文件?你是否以同一个用户的身份运行java程序? –

回答

0

你可以用两种方法检查。

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

请检查两者。

+0

权限不是问题。将检查网络路径。 – dnivra

-1

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

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