3

あなたが私を助けてくれることを願っています。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() を使用してみましたが、問題はまだあります。

4

1 に答える 1

0

分散キャッシュは、アーカイブ ファイルをタスクのローカル作業ディレクトリに解凍しません。各タスク トラッカーにはジョブ全体の場所があり、そこで解凍されます。

DistributedCache をチェックしてこの場所を見つけ、そこでファイルを探す必要があります。DistributedCacheの Javadoc には、この情報を取得するマッパーの例が示されています。

-files および -archives ジェネリック オプションを定義するときにシンボリック リンクを使用できます。マップ/リデュース タスクのローカル作業ディレクトリにシンボリック リンクが作成され、これが簡単になります。

hadoop jar myJar myClass -files ./etc/alice.txt#file1.txt \
    -archives ./etc/bob.zip#bob,./etc/claire.tar#claire

そして、アーカイブ内のファイルを開こうとするときに、マッパーでフラグメント名を使用できます。

new File("bob").isDirectory() == true
于 2013-08-22T23:54:33.953 に答える