1

(タイトルは、Hadoopsが複数のファイルにわたって出力を分割することを反映するために分割する必要があります)

複数の Hadoop ジョブを連鎖させています。初期のジョブの 1 つは、他のジョブよりも桁違いに小さい出力を生成するため、これを DistributedCache に入れたいと考えています。それは難しい部分です。これを行うために私が書いたコードは次のとおりです。

FileSystem fs = FileSystem.get(conf);
Path pathPattern = new Path(distCache, "part-r-[0-9]*");
FileStatus [] list = fs.globStatus(pathPattern);
for (FileStatus status : list) {
    DistributedCache.addCacheFile(status.getPath().toUri(), conf);
}

これは、私のローカル マシンと、セットアップした仮想クラスターで正常に動作します。ただし、この質問DistributedCache.getCacheFiles()とは異なり、AWS では戻り値が空のリストであることを理由に失敗します。

基本的に、1 つの MR ジョブからシャードされた出力をプログラムで読み取り、それを DistributedCache に入れる方法が必要です。レデューサーの数はプログラムが実行されるたびに変わる可能性があるため、ハード ファイル名を指定することはできません。S3 と HDFS がどのように連携するかを完全には理解していないため、FileSystem と対話してシャードされた出力を読み取るのに苦労しています。AWS で機能する方法でこれを行うにはどうすればよいですか?

参考までに、私は Hadoop 1.0.x を使用しています。1.0.4 (4 つの Ubuntu 12.10 仮想マシン) と 1.0.3 (AWS) の組み合わせです。

4

1 に答える 1

1

AWS で動作させるための簡単な修正であることが判明しました。

FileSystem fs = distCache.getFileSystem(conf);

その後、AWS はそのディレクトリの下にあるシャードを確認でき、問題なく実行されました。私の質問の前のコードが標準クラスターで問題なく機能していたときに、AWS が機能するためにこれが必要だった理由はまだわかりませんが、これで完了です。

于 2013-02-22T22:15:10.030 に答える