MapReduceについて
最近、大規模分散処理について学ぼうという機運が高まっており、Hadoopについて学んでいるのでその備忘録です。(勉強を始めたばかりなので、間違っていることもあるかもしれませんが、その場合は指摘していただけると嬉しいです)
今回は、MapReduceに関する記事になります。
一応、HDFS(Hadoop Distributed File System)について書いた記事の続きのつもりで書いているので、Hadoop・HDFSってなんぞやって人はそこから読んでもらうと良いかもしれません。
https://minmin-21.hatenablog.com/entry/2019/08/19/185459minmin-21.hatenablog.com
MapReduceとは
MapReduceとはHadoopで使われている、大規模データの並列分散処理のアルゴリズムです。
MapReduceの説明に入る前に、まずは前提としてHadoopでの分散処理の概要について説明したいと思います。
Hadoopにおける分散処理概要
Hadoopでは分散処理の仕組みとして、以下のようなマスタースレーブ方式をとっており、大きく3つの要素から構成されています。(HDFSとほとんど似たような感じです。)
- Hadoopクライアント
- JobTracker
- TaskTrackerに対して、処理タスクの割り当てを行うサーバー
- TaskTrackerの状況監視も行う
- TaskTracker
- JobTrackerからの指示を受けて、実際に処理を行うサーバー
- JobTrackerに定期的に状況報告を行う(ハートビート)
最終的な処理結果はHDFSに書き出して終了という感じです。
アルゴリズム概要
今回は説明のために以下のように、複数の食料品店の在庫データから全ての店舗を合計した各食料品の在庫数を調べる、ということを例にして説明していきたいと思います。
MapReduceのアルゴリズムは、Map, Shuffle, Reduceの3つのフェーズから構成されています。
各ステップについて、それぞれ詳しく見ていきたいと思います。
Mapフェーズ
このフェーズでは、HDFSに保存されているデータを読み込んで、Key-Valueの形にデータを変換し、データに対して意味づけを行います。
具体的には、以下のような感じです。
DataNodeとMapperタスクを行うTaskTrackerは同じにした方が、通信コストがなくなるので処理を早くすることができますが、必ずしも同じにする必要はありません。(データのローカリティと言います)
Shuffleフェーズ
Shuffleフェーズでは、Mapフェーズで意味付けしたデータの整理を行い、Reduceフェーズに向けてどの処理をどのTaskTrackerに割り当てるかを決定します。
具体的には、以下のような感じです。
「各TaskTrackerにどのデータを処理を担当させるか割り当て」のフェーズでは、実際にデータを動かしてまとめるのではなく、どのTaskTrackerに割り当てるかを決めるだけです。概念をわかりやすく説明するために、図ではまとめているように見せています。(間違ってたらすみません。。)
Reduceフェーズ
このフェーズでは、Shuffleフェーズで割り当てられたタスクを実行するために、担当分のデータを取得し処理を行います。
今回の場合、各データの集計処理を行います。
具体的には以下のような感じです。
Shuffleフェーズではどのデータを担当するか割り当てているだけなので、Reduceフェーズの始めに各TaskTrackerは担当分のデータを他のTaskTrackerからコピーしてきます。
どのTaskTrackerに担当のデータがあるかの情報はJobTrackerに問い合わせることで取得しています。
まとめ
これまでに説明した各フェーズをまとめた図を以下においておきます。
最後に
Hadoop(主にMapReduce)について学ぶ時に、以下の書籍・資料が非常に分かりやすかったので、詳しく勉強したい・この記事じゃ分からんって人は、以下の資料を見てみることをお勧めします。
- 書籍
- 資料
参考
- パターンでわかるHadoop MapReduce -ビッグデータのデータ処理入門- 三木大知著
- 40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
- 分散処理技術「Hadoop」とは:NTTデータのHadoopソリューション