2009年3月 3日

アーキテクチャ

Hadoopで、かんたん分散処理

  • このエントリーをはてなブックマークに追加

こんにちは、地域サービス事業部の吉田一星です。

今回は、Hadoopについて、Yahoo!JAPANでの実際の使用例を交えながら書きたいと思います。

Hadoopとは、大量のデータを手軽に複数のマシンに分散して処理できるオープンソースのプラットフォームです。

複数のマシンへの分散処理は、プロセス間通信や、障害時への対応などを考えなければならず、プログラマにとって敷居が高いものですが、
Hadoopはそういった面倒くさい分散処理を一手に引き受けてくれます。

1台では処理にかなり時間がかかるような大量のデータも、複数マシンに分散させることで、驚くべきスピードで処理を行うことができます。

例えば、今まで1台でやっていた、あるログ集計処理を、Hadoop(マスタ1台、スレーブ19台)で行うようにしたところ、

Hadoop 5分34秒
従来の処理 6時間6分35秒

集計処理のやり方が違うので単純比較はできませんが、Hadoopの威力がおわかりいただけるかと思います。
もちろん、サーバの台数をもっと増やせば、それだけ処理能力は向上しますが、数GB程度のデータ処理ならば、数台でも十分に効果を実感できるのではないでしょうか。

MapReduce

Hadoopを説明する上で、避けては通れないMapReduceについて説明します。

MapReduceは、Hadoopで用いられるプログラミングモデルで、Googleの論文が元になっています。
ユーザはMap関数とReduce関数を用意するだけで、あとはHadoopが勝手に複数のサーバで分散処理をしてくれます。

Mapは入力データを読み込みフィルタリングする役割、ReduceはMapから渡されたデータをまとめ上げて結果を出力する役割をします。
Map、Reduceはそれぞれ独立して多数のサーバに分散して処理されます。

例えば、あるテキストの中で出現する単語をカウントする処理(WordCount)を考えてみましょう。

THE END OF MONEY IS THE END OF LOVE

というテキストがあったとすると、各単語の出現数は、

THE END OF MONEY IS LOVE
2 2 2 1 1 1

ですが、これをMapReduceで処理してみます。

Map

Mapは、「THE END OF MONEY IS THE END OF LOVE」というテキストを入力として読み込みます。
そして、それぞれの単語に「1」という値を割り当てます。

THE END OF MONEY IS THE END OF LOVE
1 1 1 1 1 1 1 1 1

MapReduceのデータは、KeyとValueのペアで表されます。
Key、Valueのペアを<Key,Value>と表せば、Map処理は、入力テキストから次のような<Key,Value>を作り出すことです。


20090303_1


Shuffle


Mapの出力をキー順にソートし、同じKeyをもつペアを束ねるのがShuffleです。(オプションで数値順にソートなども指定可能)

キー順にソートすることにより、同じKeyをもつペア同士が隣り合います。

そして、隣り合った同じKeyをもつペアは、束ねられます。

Shuffleは、MapからReduceにデータを渡す際に自動的に行われます。

  • 入力
    THE END OF MONEY IS THE END OF LOVE
    1 1 1 1 1 1 1 1 1
  • キー順にソート
    END END IS LOVE MONEY OF OF THE THE
    1 1 1 1 1 1 1 1 1
  • 同じKeyを束ねる
    END IS LOVE MONEY OF THE
    1 1 1 1 1 1 1 1 1

20090303_2


Reduce


Shuffleの結果を入力として処理を行います。

WordCountでは、同じKeyのValueを足し合わせます。



  • 入力

    END IS LOVE MONEY OF THE
    1 1 1 1 1 1 1 1 1
  • Reduce後
    END IS LOVE MONEY OF THE
    2 1 1 1 2 2

20090303_3


このように各単語の出現数がカウントされて出力されるわけです。

実際の使用例

地域サービス事業部では、Hadoopをログ解析、クローラやデータ解析などに使っていますが、日々のちょっとした業務でも活躍しています。例えば、

大量のデータの中から、ランダムに10000件抽出したい

なんてことがありました。これをどうMapReduceで処理するか考えてみます。

ランダムに行の数字を選び出して、その数字の行だけを出力して・・・と考えていくと難しく感じますが、
Shuffleのキー順ソートを利用して、ランダムソートしてしまえばいいわけです。


20090303_4


こんな入力データがあるとすると、keyにランダムな数字、valueに入力行を割り当てます。


20090303_5


Shuffleで、キー順にソートされます。(オプションを指定して数値順にすることもできます)

20090303_6


Reduceで、Valueをそのまま出力します。

20090303_7


あとはMapReduceの結果を、head -10000なりで取り出せば、ランダムサンプリングができます。

MapReduceの魅力

MapReduceは割り切ったモデルですが、その分プログラマーにはわかりやすいですし、
複数のMapReduceを組み合わせることで、かなり複雑な処理も行うこともできます。

必ずしもMapとReduceを組み合わせる必要はなく、Mapのみを使うことも可能、ということもポイントです。

例えば、大量の画像のフォーマットを変換したい、といった場合は、Mapだけを利用して画像の変換処理を書きます。
Shuffleのソート処理や、Reduceで同じキーをまとめてさらに処理が必要である場合以外は、Mapだけで処理を行うのがよいと思います。

MapReduceは、CouchDBでは、クエリ言語に代わるものとして採用されており、Greenplumというデータウェアハウスプラットフォームにも採用されるなど、
徐々に広がりを見せはじめています。

終わりに

Hadoopは、「高度な知識が必要」とか、「100台以上じゃないと効果が実感できない」とか、「Yahoo!ぐらい巨大なデータを扱う所じゃないと意味がない」など、
誤解をされているように感じます。

しかし、Hadoopは、面倒な分散処理を、プログラマが「簡単に」扱えることを目的としたプラットフォームです。

何時間かかかるようなデータ処理を日常的に行っている方は、是非Hadoopの導入を検討してみてください。

まずは、2〜3台からでも、効果を実感できると思います。

関連記事(2010/2/1追記)
>>Hadoopを使いこなす(1)
(2010/3/1追記)
>>Hadoopを使いこなす(2)

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加