【问题标题】:Reading file from HDFS using HDFS Java API使用 HDFS Java API 从 HDFS 读取文件
【发布时间】:2013-10-21 12:49:19
【问题描述】:

您好,我正在尝试使用 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);

创建新文件

【问题讨论】:

  • 你能用hadoop dfs -get获取文件吗?我认为该块已损坏。
  • 是的,我可以使用“hadoop dfs -get”获取文件。
  • 这很奇怪,因为dfs -get 使用完全相同的 API。你可以重新检查你是否访问了同一个文件吗?您是否以同一用户身份运行 java 程序?
  • 是的,正在访问同一个文件。实际上我正在尝试访问远程 HDFS,但我没有以任何特定用户身份运行。这会是个问题吗?

标签: java hadoop hdfs


【解决方案1】:

您可以通过两种方式进行检查。

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

请检查两者。

【讨论】:

  • 权限没问题。将检查网络路径。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多