ハッカーを目指す白Tのブログ

夏は白のTシャツを着ています。ラジオが好きです。(ラジオネーム: 隠れキリジダン)

HadoopのMapReduceについて

ECサイトのリコメンド機能や、広告の最適化等、多くのWEBサービスで活用されているHadoopMapReduce処理についてまとめてみた。

1. そもそもHadoopとは何か

Hadoopとは、ビッグデータの分析処理を、複数のマシンに分散させることで、高速化するミドルウェアである。Apache Software FoundationがOSSで開発・公開している。これまで、複数マシンへの処理の分散は、通信、監視、障害時の対応などの観点から、エンジニアにとって困難なものであったが、これを使うことでエンジニアが処理を分散することを意識しなくて良いほど容易に分散処理を行えるようになった。例えば、Hadoopを使うことで、米VISA社は、これまで1ヵ月かかっていたような重い処理(130億件のトランザクションデータの処理)を、13分に短縮した。
Hadoopは、大きく分けてMapReduceという処理モデルとHDFSというファイル管理システムで構成されている。
そして、分散処理の型としては、masterがslaveに対してタスクを振り分けるpush型のものと、slaveがmasterからタスクをとってくるpull型のものがあるが、push型のものに属する。Hadoopにおける、MapReduce処理のmasterはJob Tracker、slaveはTask Trackerと呼び、HDFSのmasterは、Name Node, (Secondary Name Node)、slaveはData Nodeと呼ぶ。

2. なぜHadoopは生まれたのか

なぜHadoopが生まれたのか。それは昨今、企業や政府、個人が扱えるデータが膨大なものとなったからである。そうしたビッグデータを分析することでお金や価値を生み出せるようになり、それに伴い、その分析処理の高速化が求められるようになった。ビッグデータに関しては5分でわかる!動画スライド「ビッグデータ利活用が注目される2つの背景」 | ビッグデータマガジンで、うまくまとまっている。

3. HadoopMapReduce処理とは

今回は、Hadoopの中でもGoogleによって提唱されたプログラミングモデルである、MapReduceについて解説する。
HadoopMapReduce処理は、大きく分けて「Map」「Shuffle」「Reduce」の3つの処理からなる。
(1)Map処理 :  インプットしたビッグデータを構造化する処理。
具体的には、ビックデータをkeyとvalueを持つhashに変換する処理。
(2)Shuffle処理&Sort処理 :  構造化したデータを整列する処理。
具体的には、Map処理で生成されたhashを、keyでソートし、keyと同じkeyを持つvalueのhashを生成する。
この処理の後、master node が slave node にreduce処理を分散する際に、hashを同じサーバーにまとめてくれる。
(3)Reduce処理 :  整列されたデータに対する計算などの処理。
具体的には、arrayの要素数を数えたり、各hashのvalue数を数えたりと、整列されたデータを使った様々な計算処理。

この中で、Hadoopのユーザーはmap処理とreduce処理を入力するが、shuffle処理に関しては自動的にHadoopによって行われる。

また、map処理とreduce処理は複数マシンに処理が分散されるが、shuffle処理は一つのマシンで処理される。したがって、Hadoopは、MapReduce処理におけるmap処理とreduce処理が重いような処理に対して使うことで、その処理を高速化できる。

そして、MapReduce処理が使われる例として、テキストマイニングや、画像分析等が挙げられる。
以下に、テキストマイニングにおける、MapReduce処理の簡単な例を記述しておく。

#"IN"という英単語が文字列の中で何回使われているか調べる処理をしたいとする
#以下のような文字列があったとき
"A BIRD IN THE HAND IS WORTH TWO IN THE BUSH"

#map処理で、以下のようなarrayを生成し
[ {'A' => 1}, {'BIRD' => 1}, {'IN' => 1}, {'THE' => 1}, {'HAND' => 1}, {'IS' => 1}, {'WORTH' => 1}, {'TWO' => 1}, {'IN' => 1}, {'THE' => 1}, {'BUSH' => 1} ]

#shuffle処理によって、以下のようなarrayに変換され
[ {'A' => 1}, {'BIRD' => 1}, {'BUSH' => 1} , {'HAND' => 1}, {'IN' => 1}, {'IN' => 1}, {'IS' => 1}, {'THE' => 1}, {'THE' => 1}, {'TWO' => 1}, {'WORTH' => 1} ]
↓
[ {'A' => 1}, {'BIRD' => 1}, {'BUSH' => 1} , {'HAND' => 1}, {'IN' => [1, 1]}, {'IS' => 1}, {'THE' => [1, 1]},  {'TWO' => 1}, {'WORTH' => 1} ]

#reduce処理で、今回は"IN"という英単語が文字列の中で何回使われているか調べたいから、'IN'がkeyのvalueの要素数を数える
#=>2

参照URL

1.5分でわかる!動画スライド「ビッグデータ利活用が注目される2つの背景」 | ビッグデータマガジン

以上