2012-04-05 4 views
1

ここではユースケースです:すべてのレデューサーによって生成されるレコードの数をまとめて制限します

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

map-reduceジョブを実行した後に出力URLにグローバルな制限があります。私はこれをすべての還元剤に均等に分配します。 すなわちグローバルリミットが1000、リダクサ数が5の場合、すべてのリデューサは出力として最大1000/5 = 200のURLを出力します。

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

私は100000個のURL /ホストと1000個のグローバル制限を持っていますが、出力には400個のURLしかありません(200個のURL /ホスト)。

答えて

1

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

ホスト名でパーティションを作成する必要がある場合は、簡単な回答はないと思います。各レデューサーは、どのくらいのレコードが来るのか分からない。各レデューサーは、100000レコードを受信するか、受信したレコードを累積する必要があります。減速機のクリーンアップ機能をオーバーライドする必要があります。 Reducersは、 "クリーンアップ"機能で(カウンター、多分)お互いに話をして、必要なレコードの数を決定し、クリーンアップ機能のレコードのみを書き出す必要があります。

あなたはどう思いますか?

+0

私は同じホストからのURLが一緒にグループ化され、さらなるロジックを簡素化するので、ホスト名でパーティション分割する必要があります。クリーンアップは、ハーフープマップフローの一部または提案されたメカニズムの一部ですか?もっと詳しく説明してください。 –

+0

あなたはあなたのレデューサークラスでこの機能を上書きすることができます。 reduce関数では、レコードを書き込むのではなくコンテナに格納するだけです。クリーンアップ機能では、通信を行い、現在のレデューサーが書き出す必要があるレコードの数を決定できます。次のページのクリーンアップ機能を探してください:http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/mapreduce/Mapper.html – root1982

1

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

+0

ありがとうございました。カウンターを使って試してみます。私はカウンタを(変数を共有する方法で)維持することは、より大きな入力のためのパフォーマンスに打撃を与えるが、今のところ私のための選択肢はないと思う。 –

関連する問題