ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog

テクノロジー

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台からでも、効果を実感できると思います。

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

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました

このページの先頭へ