2017-08-03 9 views
2

MapReduceジョブのコードを記述する際に、手動でレジューサーの数を設定すると、特定のレデューサーに送信されるデータが大きくなる可能性があります。そのような場合、減速タスクは複数のノードで同時に実行できますか?おそらく、鍵に対応するList<Value>のデータを分割し、後で内部的にマージするか?還元剤は複数のノードを動的に使用できますか?

還元剤が使用するノードの数をオートスケールできない場合は、キーに対応する値の分布が不均一な場合、どのように処理しますか? default hadoop MapReduce partitionerは、ハッシュの値に基づいてパーティションを分割し、キーに対応するList<Value>のサイズを考慮しません。

答えて

2

いいえ、レジューサーは自動スケールされません。作業負荷が大きすぎると、クラッシュします。

できるだけ(おそらく)できるのは、作業負荷をレデューサー間で均等に分配する独自のカスタムパーティショナーを作成することです。データのサンプリングや見積もり、さらには追加の計算ジョブを実行しなければならない場合があり、問題のニーズを満たすまともなロードバランシングアルゴリズムを作成する必要がある場合があります。

キーごとの値のサイズに基づいて負荷を分散するのではなく、レジューサーが実行する計算に基づいて負荷を分散することができます(これらの2つは常に同じではありません)。

+0

大丈夫ですが、2つのことがあります。 1.レデューサーに割り当てられるノードリソースのパーセンテージを定義することは可能ですか? 2.特定のケースで手動でレデューサーの数を設定する必要がある場合、特定のレデューサーの過負荷問題を軽減するために何ができるのですか? –

+1

@DhruvMullick私は1についての答えがないのは恐れています.2に関しては、サンプリングをしたくない場合は、最も重い負荷がかかると思われるキーをレデューサーに割り当てるカスタムパーティショナーを手動で設定できます(つまり、他のキーは同じレデューサーに送られません)。たとえば、WordCountでは、最も頻繁な文字(例えば、文字 's')から始まるすべての単語を、自分自身の減速機および他のすべての単語にランダムに送ります。 – vefthym

関連する問題