1

マッパーで収集された少数のメタデータをレデューサーに渡すにはどうすればよいですか?私の特定の問題では、2つの長い値のみを渡したいので、これらにMultipleOutputFormatまたはMultipleOutputsを使用しません。

私が試したいくつかの亜種:

(1)

マッパー

    context.getCounter("Countergroup", "Counter").increment(1);

レデューサー

    counter = context.getCounter("Countergroup", "Counter").getValue(); 

カウンターは定期的に更新されないため、Reducerの関数呼び出しの結果は0になります。



(2)

マッパー

    context.getConfiguration().setInt("Counter", countTotal);

レデューサー

    counter = context.getConfiguration().getInt("Counter", 0);          

確かに、実行中のジョブ中に構成を変更することはできません(試す価値がありました)。

この問題についてはすでに質問がありますが、実用的な答えは見つかりませんでした。また、APIが変更されました。Hadoop0.20.2を使用しています。



同様の質問:

MapperからReducerに値を渡す

レデューサーからマッパーのカウンターにアクセスする (これは有望に見えますが、0.20.2 APIでは機能しないようです)

4

1 に答える 1

1

カウンターを使用して問題の解決策が見つからない場合(特定の場合にマッパーからレデューサーに2つの長い値を渡す)、別のアプローチで順序反転パターンを利用できます。

このパターンでは、マップから追加のキーと値のペアを発行します。キーは何かであり、これが最初のキーレデューサーが受け取ります(レデューサーがソートされた順序でキーを受け取るという事実を利用します)。たとえば、放出するキーが1〜1000の数値である場合、ダミーキーは「0」である可能性があります。レデューサーはソートされた順序でキーを受け取るため、他のキーの前にダミーキーを処理することが保証されます。

さらに、新しいAPIにはSetUp()メソッドとCloseUp()メソッドがあり(古いAPIにも同様のメソッドがありますが、名前は覚えていません)、各ノードで1回だけ実行されるという事実を利用します。そのノードのすべてのmap/reduceタスクの開始/終了の前/後。

于 2012-05-25T19:19:56.417 に答える