はじめに
Hadoopとは,Googleの基盤技術であるMapReduceをJavaでオープンソース実装したもので,分散処理のフレームワークです。Hadoopを使うと,1台のサーバでは時間の掛かるような処理を,複数のサーバで分散処理させることができます。「処理を割り振ったサーバが壊れた場合どうするか」などの耐障害性の問題もHadoopが管理してくれるため,利用者は処理のアルゴリズムのみに集中することができるのです。素晴らしいですね。最近ではYahoo!やはてななど,様々な企業でも利用されるようになってきています。
Hadoop導入の背景
筆者はクックパッド株式会社に勤めています。クックパッドというサイトが有名だと思いますが,他にも携帯版クックパッドであるモバれぴや,クックパッドでの検索データを提供するたべみるといったサービスを運営しています。
2009年12月現在,クックパッドはユーザ数が848万人,30代女性の3人に1人が利用するサイトとなっています。たくさんの方が毎日の献立を考える際にクックパッドを利用してくださっていて,日々大量の検索データが溜まっています。また,クックパッドではもっともっと料理が楽しくなるように,ユーザが本当に望んでいる(利用したい)食材が店頭に並ぶようになることを目指しています。そのために,膨大な検索データを週や月,地域といった側面から分かりやすくデータ解析したものがたべみるで,「いつどこで,どんなキーワードが検索されているのか」を見ることができます。このたべみるのデータ解析にHadoopを使ってみました。
とはいっても,いきなりHadoopを導入したわけではなく,最初は1台のサーバで(DBを使って)処理していましたが,以下のような問題が出てきて困りました。
- そもそも扱うデータ量が多くて,DB処理が遅い
- DB処理の中でも特にGROUP BYする処理が多く,これが猛烈に遅い
- 1年分のデータ解析で7000時間くらい(推定)掛かりそう
こ,これは何とかしないといけません。そこで,処理時間の短縮を期待してHadoopを試してみることにしたのです。
Hadoop導入時の注意点
時間の掛かる処理でも複数のサーバで分散処理させるので短時間で処理が終わる……良いことだらけのように見えるHadoopですが,DBが扱えないという注意点があります。これは,Hadoopから扱えるデータはHDFS(Hadoop Distributed File System)上にマウントされたデータのみという制約があるためです。つまり,Hadoopを使う場合にはDBを使わないような処理のアルゴリズムで設計しなくてはいけません。
Hadoopを使う
さて,実際にHadoopを使うには2つの方法があります。1つは,もともとHadoopはJavaで作られたものなのでJavaで記述する方法,もう1つはHadoop Streamingという仕組みを使って,Java以外の(標準入出力に対応している)言語で記述する方法です(※1)。
今回はRubyを使いたかったため,Hadoop Streamingを利用しました。
- ※1dt>
- Hadoop Streamingは非常に手軽ですが,オーバーヘッドがありJavaで記述する場合と比べると多少パフォーマンスが落ちるようなので注意してください。
Hadoop Streamingの仕組み
Hadoop Streamingの仕組みについて説明します。Hadoopでは,Map,Shuffle&Sort,Reduceという3つの処理のフェーズがあります。Hadoop Streamingでは,Shuffle&Sortのフェーズは変更することができませんが,MapとReduceのフェーズは標準入出力を介して,利用者が自由にプログラムを記述できます。イメージとしては以下の図のようなものです。
HadoopではMapでの出力データがタブを区切り文字としたkeyとvalueとして扱われ,同じkeyのデータは必ず同じReduceで処理されます。

