次に、Hadoopが期待したほどスケールアウトしないときの対策を検証した。典型的な原因の一つは「キー分布の偏り」という現象で、数ノード規模のシステムでも影響が大きい。
HadoopのMapReduceには、Mapperの出力をReducerへ配布するShuffleという処理がある。Shuffleの際は取引先コードなどのキーを基にデータをとりまとめて配布する。
全取引先から同量の仕入れを行う場合のように、キー分布が一様であれば、図6上のように各Reducerに均等にデータが配布される。しかし、特定の取引先からの仕入れが多いなどでキー分布に偏りがあると、図6下のように特定のReducerにデータが多く配布される。その結果、データが集中したReducerの処理時間が全体に影響し、性能が落ちる。キー分布に偏りがある状態でReducerを増やしても特定のReducerにデータが集中する点は同じなので、スケールアウトもしなくなる。
そのため、Hadoopによるバッチ処理では、キー分布の偏りの程度を調査し、対策を実施する必要がある。ここでは次の二つを紹介しよう。
対策1:キー分布をあらかじめ調べて、各Reducerへ均等にデータを振り分けるようにShuffleする。キー分布を調べるオーバーヘッドが発生するが、キー分布の偏りが比較的小さい場合に良好な結果が得られる。
対策2:Reducerへ渡すキーに、本来のキーではなく、分布が一様になるような別のキーを割り当てる。オーバーヘッドは小さいが、別のキーをどう指定するのかが重要になる。
この検証では対策2の効果を調べた。「べき分布」という偏りが非常に大きい状態のデータを作り、(b)仕入データ更新のMapReduce処理1における、対策2の効果を測定している。データ量は1000万件、ノード数は12である。