0

マッパー/リデューサーインスタンスは、永続的に存続するjvm内でどのように再利用されますか?

たとえば、次のようなことをしたいとしましょう。

public class MyMapper extends MapReduceBase implements Mapper<K1, V1, K2, V2> {

    private Set<String> set = new HashSet<String>();

    public void map(K1 k1, V1 v1, OutputCollector<K2, V2> output, Reporter reporter) {
        ... do stuff ...

        set.add(k1.toString()); //add something to a list so that it can be used later

        ... do other stuff ...


        if(set.contains("someString"))
            emitSomeKindOfOutput(output);
        else
            emitSomeOtherKindOfOutput(output);
    }

}

同じマッパーを複数のタスク/ジョブに使用できる場合、メンバー セットには以前のタスク/ジョブからの他のジャンクが含まれているため、問題が発生する可能性があります。この種の再利用は Hadoop で可能ですか? レデューサーの場合はどうですか?

4

2 に答える 2

2

あなたは間違いなく安全です。Mapper と Reducer インスタンスは再利用されません。初期化またはクリーンアップを実行する必要がある場合は、MapReduceBase によって提供される2 つのメソッドconfigureをオーバーライドできます。closeこれは、コード サンプルでは必要ありません。

set静的変数の場合、ほとんどのサイト構成で必要とされていなくても、安全clearのためにメソッドでそれをclose()使用する必要があります (基本的に、新しい JVM はデフォルトでマップごとにフォークされるためreuse.jvm.num.tasks、JVM の再利用を有効にするように構成する必要があります)。2 つのマップ タスクが同じ JVM で同時に実行されることはありません。

于 2013-03-12T21:01:02.077 に答える
0

私の知る限り、Hadoop はシェアード ナッシング アーキテクチャに基づいているため、「プライベート セット セット」変数は異なるマッパー間で共有されません。したがって、あなたが言及したように、「以前のマッパーからのがらくた」を取得することに疑問の余地はありません。

于 2013-03-12T14:16:59.930 に答える