あなたが私を助けてくれることを願っています。hadoop map-reduce で頭を悩ませている問題があります。Hadoop バージョン 1.0.3 を使用して、map-reduce で「-files」オプションを正常に使用しています。ただし、「-archives」オプションを使用すると、ファイルはコピーされますが、解凍されません。私は何が欠けていますか?ドキュメントには、「アーカイブ (zip、tar、および tgz/tar.gz ファイル) はスレーブ ノードでアーカイブ解除されます」と記載されていますが、それは私が見ているものではありません。
テキスト ファイル「alice.txt」、zip ファイル「bob.zip」(b1.txt と bdir/b2.txt を含む)、tar ファイル「claire.tar」(c1.txt を含む)の 3 つのファイルを作成しました。および cdir/c2.txt)。次に、Hadoop ジョブを呼び出します。
hadoop jar myJar myClass -files ./etc/alice.txt -archives ./etc/bob.zip,./etc/claire.tar <input_path> <output_path>
ファイルは確かにそこにあり、整形式です:
% ls -l etc/alice.txt etc/bob.zip etc/claire.tar
-rw-rw-r-- 1 hadoop hadoop 6 Aug 20 18:44 etc/alice.txt
-rw-rw-r-- 1 hadoop hadoop 282 Aug 20 18:44 etc/bob.zip
-rw-rw-r-- 1 hadoop hadoop 10240 Aug 20 18:44 etc/claire.tar
% tar tf etc/claire.tar
c1.txt
cdir/c2.txt
次に、問題のファイルが存在するかどうかをマッパーでテストします。次のように、「lineNumber」はマッパーに渡されるキーです。
String key = Long.toString(lineNumber.get());
String [] files = {
"alice.txt",
"bob.zip",
"claire.tar",
"bdir",
"cdir",
"b1.txt",
"b2.txt",
"bdir/b2.txt",
"c1.txt",
"c2.txt",
"cdir/c2.txt"
};
String fName = files[ (int) (lineNumber.get() % files.length)];
String val = codeFile(fName);
output.collect(new Text(key), new Text(val));
サポート ルーチン「codeFile」は次のとおりです。
private String codeFile(String fName) {
Vector<String> clauses = new Vector<String>();
clauses.add(fName);
File f = new File(fName);
if (!f.exists()) {
clauses.add("nonexistent");
} else {
if (f.canRead()) clauses.add("readable");
if (f.canWrite()) clauses.add("writable");
if (f.canExecute()) clauses.add("executable");
if (f.isDirectory()) clauses.add("dir");
if (f.isFile()) clauses.add("file");
}
return Joiner.on(',').join(clauses);
}
Guava 'Joiner' クラスの使用。マッパーからの出力値は次のようになります。
alice.txt,readable,writable,executable,file
bob.zip,readable,writable,executable,dir
claire.tar,readable,writable,executable,dir
bdir,nonexistent
b1.txt,nonexistent
b2.txt,nonexistent
bdir/b2.txt,nonexistent
cdir,nonexistent
c1.txt,nonexistent
c2.txt,nonexistent
cdir/c2.txt,nonexistent
アーカイブ ファイルはそこにありますが、展開されていません。私は何が欠けていますか?-archives を使用する代わりに DistributedCache.addCacheArchive() を使用してみましたが、問題はまだあります。