capacity scheduler の設定その2

jobtracker が tasktracker に仕事を配分する際、全体に均等に割り振るのではなく、偏りが出てしまう場合がある。
このため、各 tasktracker にCPUコア数以上のスロットを設定している場合、あるノードはコア数以上の task を処理している一方、他のノードではコア数以下の task しか動いていない、という状態になることがある。

capacity scheduler には
mapred.capacity-scheduler.maximum-tasks-per-heartbeat
という設定があり、これをいじることで改善できる。
これは、一度の heartbeat で最大何個の task を jobtracker に配分するか、という意味だそうだ。
デフォではこれが Short.MAX_VALUE になっており、tasktracker が jobtracker に heartbeat した時に、開いてるスロットに入れられる分だけ仕事を入れられてしまう。
この値を各ノードのスロット数より小さい値にすれば、ある程度は負荷が平準化される。