次に、Hadoopが期待したほどスケールアウトしないときの対策を検証した。典型的な原因の一つは「キー分布の偏り」という現象で、数ノード規模のシステムでも影響が大きい。

 HadoopのMapReduceには、Mapperの出力をReducerへ配布するShuffleという処理がある。Shuffleの際は取引先コードなどのキーを基にデータをとりまとめて配布する。

 全取引先から同量の仕入れを行う場合のように、キー分布が一様であれば、図6上のように各Reducerに均等にデータが配布される。しかし、特定の取引先からの仕入れが多いなどでキー分布に偏りがあると、図6下のように特定のReducerにデータが多く配布される。その結果、データが集中したReducerの処理時間が全体に影響し、性能が落ちる。キー分布に偏りがある状態でReducerを増やしても特定のReducerにデータが集中する点は同じなので、スケールアウトもしなくなる。

図6●キーの分布に偏りがあるとスケールアウトしなくなる理由<br>ここではReducer1が多くのデータを処理する必要があり、処理完了までの時間が長くなる様子を示した。Reducerの数を増やしても、キーの分布に偏りがあればReducer1の処理がやはりネックになる
図6●キーの分布に偏りがあるとスケールアウトしなくなる理由
ここではReducer1が多くのデータを処理する必要があり、処理完了までの時間が長くなる様子を示した。Reducerの数を増やしても、キーの分布に偏りがあればReducer1の処理がやはりネックになる
[画像のクリックで拡大表示]

 そのため、Hadoopによるバッチ処理では、キー分布の偏りの程度を調査し、対策を実施する必要がある。ここでは次の二つを紹介しよう。

対策1:キー分布をあらかじめ調べて、各Reducerへ均等にデータを振り分けるようにShuffleする。キー分布を調べるオーバーヘッドが発生するが、キー分布の偏りが比較的小さい場合に良好な結果が得られる。

対策2:Reducerへ渡すキーに、本来のキーではなく、分布が一様になるような別のキーを割り当てる。オーバーヘッドは小さいが、別のキーをどう指定するのかが重要になる。

 この検証では対策2の効果を調べた。「べき分布」という偏りが非常に大きい状態のデータを作り、(b)仕入データ更新のMapReduce処理1における、対策2の効果を測定している。データ量は1000万件、ノード数は12である。