Yahoo! JAPAN Tech Blog

1コアあたりの性能向上が緩やかになってきているため、処理速度を向上させるには並列処理へ移行する必要がでている。PCレベルであればマルチコアでの並列化ということになり、もっと大規模でスケーラビリティの高い処理を実現するにはグリッドやクラウドコンピューティングと呼ばれるような分散コンピューティングを実現していく必要がでてくる。

分散コンピューティングはシステムアーキテクチャの設計から実装まで煩雑になると敬遠されがちだが、簡単に実現するための方法がないわけではない。OSSプロダクトではApache Hadoopが代表的な存在だ。Hadoopは大量のデータ処理を分散処理するためのプラットフォーム。Hadoopの流儀にしたがって機能を実装すれば自動的に分散処理を実現できるという優れものだ。

しかし分散コンピューティングというと研究室レベルでの活用とか、GoogleやYahoo!、IBMといった大企業しか使えないのではないかと思われがちだ。そこでYahoo! JAPAN Tech Blog: Hadoopで、かんたん分散処理を紹介したい。Yahoo! Japanでの活用事例を取り上げながらHadoopの活用を紹介している。特にベースとなっているMapReduceモデルをわかりやすく紹介しているところに注目したい。

HadoopではMap関数とReduce関数を実装する。あとはHadoopプラットフォームに放り込めば自動的に設定されたマシン群において分散処理される。処理はMap→Shuffle→Reduceの順に行われる。Mapは入力データの振り分け、Shuffleはデータの整列、Reduceはデータのまとめ上げを担当する。Shuffleはすでに実装されているため、利用者が作るのはMapとReduceだ。

Hadoopで、かんたん分散処理では単語数カウンタを例に処理の様子が紹介されている。「THE END OF MONEY IS THE END OF LOVE」といった文章から単語数をカウントする場合を考えると、次のようにデータがそれぞれから出力されることになる。なおデータは値と鍵の組み合わせとして処理される。

  1. データ: THE END OF MONEY IS THE END OF LOVE
  2. Map: <THE, 1> <END, 1> <OF, 1> <MONEY, 1> <IS, 1> <THE, 1> <END, 1> <OF, 1> <LOVE, 1> 単語にそれぞれ鍵として1を割り当てる
  3. Shuffle: <END, 1> <END, 1> <IS, 1> <LOVE, 1> <MONEY, 1> <OF, 1> <OF, 1> <THE, 1> <THE, 1> 値で整列する
  4. Shuffle: <END, [1, 1]> <IS, 1> <LOVE, 1> <MONEY, 1> <OF, [1,1]> <THE, [1,1]> 同じ値のものをグループ化する
  5. Reduce: <END, 2> <IS, 1> <LOVE, 1> <MONEY, 1> <OF, 2> <THE, 2> 鍵を加算する

Hadoopで、かんたん分散処理はここからがおもしろい。Yahoo! Japan 地域サービス事業部ではHadoopをデータ解析やログ解析、クローラに使っているそうだが、日常業務のちょっとした処理もHadoopでこなしているという。たとえば大規模ファイルからランダムに10,000件のデータを取り出したい場合、Mapで割り当てる鍵をランダムな数値にして、Reduceで値だけ取り出して最初の10,000件のデータただけ取り出せばいいというわけだ。Hadoopが使えるため分散処理が実施できるとこがポイントだ。

Hadoopで、かんたん分散処理ではモデルがシンプルでわかりやすく、さらにMapReduceを組み合わせて複雑な処理が可能であること、必要がなければMapだけ実装すればいいことが説明されている。冒頭ではこれまで1台で6時間6分35秒かかっていたログ集計処理が、Hadoopを使ってマスタ1台/スレーブ19台の構成に変えて5分34秒で処理が完了するようになった例が紹介されている。