0

こんにちは、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); を使用して新しいファイルを作成できます。

4

2 に答える 2

-1

https://stackoverflow.com/a/37661092/5797400 - これが役立つかもしれません。に対する私の解決策could not obtain block: BlockMissingExceptionです。
リンクの要点は次のとおりです。

  1. Namenode はデータを直接読み書きしません。
  2. クライアント (HDFS への直接アクセスを使用する Java プログラム) は Namenode と対話して、HDFS 名前空間を更新し、読み取り/書き込み用のブロックの場所を取得します。
  3. クライアントは Datanode と直接対話して、データの読み取り/書き込みを行います。
于 2016-06-06T15:27:25.623 に答える