2

私はHadoopを学び始めましたが、MapReduceに少し混乱しています。結果がネイティブにキーと値のペアのリストであるタスクの場合、すべてが明確に見えます。しかし、結果が単一の値(たとえば、入力小数の2乗の合計、または入力ポイントの重心)であるタスクをどのように解決すればよいかわかりません。

一方では、マッパーのすべての結果を同じキーに入れることができます。しかし、この場合、私が理解している限り、唯一のレデューサーがデータのセット全体を管理します(合計または平均座標を計算します)。それは良い解決策のようには見えません。

私がイメージングできるもう1つの方法は、マッパーの結果をグループ化することです。たとえば、例0〜999を処理したマッパーは0に等しいキーを生成し、1000〜1999は1に等しいキーを生成します。レデューサーの結果が複数ある限り、レデューサーのチェーンを構築する必要があります(結果が1つだけになるまでリデュースが繰り返されます)。計算効率ははるかに高く見えますが、少し複雑です。

Hadoopに、データ全体を単一の値に削減する効率を最大化するために、レデューサーの重ね合わせを実行する既成のツールがあることを願っています。見つかりませんでしたが。

結果が単一の値であるタスクを解決するためのベストプラクティスは何ですか?

4

3 に答える 3

1

私の見解では、あなたは間違った角度から問題に取り組んでいます。

入力の二乗を合計する必要がある問題を参照してください。1行あたりの数値で構成される多数の大きなテキスト入力ファイルがあると仮定します。

次に、理想的には、マッパーで合計を並列化してから、レデューサーで合計を合計します。

例えば:

map: (input "x", temporary sum "s") -> s+=(x*x)

マップの最後に、グローバルキーを持つすべてのマッパーの一時的な合計を出力します。

削減段階では、基本的にマッパーからすべての合計を取得し、合計を合計します。これは、巨大な入力ファイルに比べてかなり小さいことに注意してください(n倍の単一整数。nはマッパーの数です)。したがって、単一のレデューサーは実際にはスケーラビリティのボトルネックではありません。

マッパーとレデューサーの間の通信コストを削減したいのですが、すべてのデータを単一のレデューサーにプロキシしてそこから読み取るのではなく、何も並列化されません。

于 2012-10-10T15:47:08.763 に答える
1

可換削減の観点からタスクを再定式化できる場合は、コンバイナーを確認する必要があります。どのように見ても、シャッフルするデータの量を大幅に減らすことができます。

于 2012-10-10T16:50:27.200 に答える
0

あなたが提起する特定のユースケースの分析は的を射ていると思います。これらのユースケースは、Hadoopで実行できることのかなり包括的な範囲に含まれ、Hadoopが処理するように設計されていないことは確かに他にもあります。同じ問題を解決する必要がある場合は、データが大きすぎることがわかっていない限り、最初のアプローチに従います。その後、2段階のアプローチに従います。

于 2012-10-10T15:25:55.790 に答える