1

ユースケースは次のとおりです。

入力URLはマップによって読み取られ、後でフィルタリング後に出力されます。次に、パーティショナーはホスト名に基づいてそれらをパーティション化します。

map-reduceジョブを実行した後、出力URLにグローバル制限があります。これをすべてのレデューサーに均等に分散します。すなわち。グローバル制限が1000で、レデューサーの数が5の場合、すべてのレデューサーは最大で(1000/5 = 200)URLを出力として出力します。

問題は、(ユーザー入力のために)2つのホストのみからのURLがあり、これら2つのホストのそれぞれに100000のURLがある場合、これらのURLを処理する2つのレデューサー(同じホスト、同じパーティション)は、それぞれ200のURLのみを制限することです。出力。レストレデューサーは、パーティショニングのために処理するデータを取得せず、0レコードを発行します。

したがって、ホストあたり100000のURLと1000のグローバル制限があったとしても、出力には400のURLのみ(200のURL /ホスト)があります。

4

2 に答える 2

1

Hadoop には、グローバルカウンターのサポートが組み込まれています。独自のカウンターを定義し、マッパーまたはリデューサー コードからそれらをインクリメント/読み取ることができます。

于 2012-04-05T09:14:32.373 に答える
1

ホスト名でパーティション分割する必要がない場合は、ランダム パーティショナーで問題を解決できます。

ホスト名でパーティション分割する必要がある場合、簡単な答えはないと思います。各レデューサーは、どれだけのレコードが来るかを知りません。各レデューサーは、100000 レコードまたは受け取るだけのレコードを蓄積する必要があります。レデューサーでクリーンアップ関数をオーバーライドする必要があります。リデューサーは、「クリーンアップ」関数で (おそらくカウンターを介して) 互いに話し合う必要があり、必要なレコードの数を決定し、クリーンアップ関数でレコードのみを書き出す必要があります。

どう思いますか?

于 2012-04-05T15:33:49.337 に答える