wiki:HadoopMapDetail

MAPがすること

作者:kosuke

参考: http://wiki.apache.org/hadoop/HadoopMapReduce

1. マスタが入力データを分割する。

マスタが分割したデータをMapを担当するスレーブに送る。一般的には、分割された数だけのMapに分散される。この分割されたデータは、 FileSplitsと呼ばれる。もし、マスタに入力するファイルが小さいため、ストレージのseektimeがあまり影響しない用なら、分割する必要がない。分けるときには、入力ファイルの論理的構造に関係なく分割される。例えば、行が整ったテキストファイルは適当なファイルは気まぐれなサイズに分割される。また、MapのタスクはFileSplitの数だけある。

2. 分割されたデータを読み取る

1.で分割したデータ(FileSplit?)をmapのクラスタに分散させる。その分散されたFileSplitは、 RecordReader?(InputFormatで定められたインターフェイス)を使って、読み込まれる。InputFormatは、 FileSplitからkey-valueを生み出すフォーマットである。もちろん、InputFormatは、規則性のない境界で分割したデータ(FileSplit?)を処理しなければならない。

3.意味のないkey-valueを作り出す

2.で紹介したInputFormatでfilesplitsをkeyとvalueに変換する。このときの、keyとvalueはまったく意味がないものである。

4. key-valueをMapperにわたす。

key-valueがRecordReaderから読み込まれる。次に、読み込まれたkey-valueをユーザーが作ったMapper(map関数)に渡す。Mapperはなにが入力されてもMapperを実行する。実行すると、新たなkey-valueが出力される。このときに、 OutputCollector?.collectを呼び出して出力する。出力されたkey-valueはそれぞれ、keyclassと valueclassを使って、SequenseFile?(この場合は[A,(b,c・・・)]のような形式)へ書き込む。SequenseFileは、ファイル情報を持っている。また、全てのレコード(一度に読み書きできるまとまったデータ)は同じタイプである。

5. Mapから出力する。

生成された中間ファイル(SequenseFile?)をシャッフルする。シャッフルとは、中間ファイルをkeyごとのグループに分けて、そのグループをReduceのスレーブに送ることだ。この時の、グループの数が、Reduceの数になる。