さて、Mapperの処理をイメージするために、具体的に幾つかMapperの処理を考えてみましょう。例えば、アクセスログから必要な情報だけを残して不要な情報は取り除く、というのはよくある例です。Mapperの出力はReducerにネットワークを介して渡されるので、不要なデータはなるべく渡さないほうが高速に処理することができます(図2-3)。
また、処理の開始時間と終了時間から、その処理に何秒かかったかを計算するような処理は値を別の形式に変換するMapperでしょう(図2-4)。
Hadoop Streamingで処理をする場合には出力は必ず“key<タブ>value”という形式にする必要があります。この形式で出力しないとShuffleフェーズでの振り分け処理が正しく動作しないので気を付けてください。
次はShuffleフェーズでデータがShuffle & Sortされます。通常はMapフェーズの出力がそのままShuffleフェーズにデータが渡されますが、Combinerという処理を指定すると、Mapフェーズの出力がCombinerで処理された後、Shuffleフェーズへとデータが渡されます。
Combinerは主にMapフェーズの同一keyに対する出力件数が多い場合に、出力サイズを減らして全体の処理を高速化させるためなどに利用されます。Shuffleフェーズはネットワーク越しに別のノードへのアクセスが発生するため、場合によってはこの段階のデータ量をCombinerで減らしておくことで大幅な高速化が見込めます(図2-5)(図2-6)。
CombinerはそれぞれのMapperに対して独立で実行されるので、複数のMapperの出力がまとめて1つのCombinerへと渡るわけではありません。また、1つのMapperの処理が完全に終了する前に実行されることもあります。Combinerが実行されるタイミングをユーザー側は制御することができないので使う場合は注意してください。
なお、ShuffleフェーズではMapperの出力のkeyに注目し、同じkeyのデータは必ず同じReducerへと渡してくれるように設計されています(図2-7)。
もっと一般的に、Reducerの数よりもkeyの数の方が多い場合には、このように1つのReducerに複数のkeyが渡されます(図2-8)。
さらに、各ReducerではSortまで行ってくれるため、そのあとのReducerの処理が大変やりやすくなります。これらの処理は自動的に行われるため、ユーザー側で何かしなければいけないわけではありませんが、この挙動を利用する形でMapperやReducerを記述する必要があります。Hadoopを利用するために最低限把握しておかないといけない仕様だといってもよいでしょう(図2-9)。
Copyright © ITmedia, Inc. All Rights Reserved.