2、3年前は一部のWeb関連企業や最新技術に対するアンテナが敏感な企業、あるいは研究機関などの特定の層からの注目を集めていたHadoopが、今や多くの企業から関心を集めている。ITエンジニアだけではなく管理者層や経営者層にまでHadoopが広く知られるようになった。しかし筆者の感覚だと、Hadoopが「速い」「スケーラビリティーがある」といった断片的な特徴だけが独り歩きしており、能力を発揮できる領域やその理由については、Hadoopそのものの知名度ほどには正しい理解が浸透しているとは言えない印象である。

 そもそも単純に「速い」とか、その理由を「分散システムだから」と安易に結論づけるのはHadoopに対する誤解を生む危険性がある。そこで連載第2回は、Hadoopがその能力を発揮できる領域を説明し、その処理速度やスケーラビリティーがどのように実現されているのかを解説する。

 本記事によって、Hadoopが2つのコンポーネント「分散処理基盤 MapReduceフレームワーク」と「分散ファイルシステム HDFS」で構成されていること、および各コンポーネントの役割や動きを理解した読者が、一歩進んでHadoopが本来の能力を発揮できる正しい選択をできるようになるための足がかりを示す。

Hadoopが能力を発揮できる問題領域

 冒頭でも述べたが、Hadoopは速いと単純に考えることは危険である。Hadoopにも得意とする問題領域があり、その得意な問題領域の中でスケーラビリティーを発揮し、高速な処理を実現できる。Hadoopの採用を決めたり、十分に活用したりするためには、この点に留意する必要がある。

 Hadoopは分散システムなので、スケーラビリティーを発揮できる問題の性質としては、「対象の問題が複数の単純な問題に分割できること」が挙げられる。MapReduceフレームワークは、処理は同じだが入力データが異なる複数のMapタスク/Reduceタスクで構成されるという構造上、この制約に従う。

 例えばあるチェーン店の都市別の売り上げリポートを作成する処理を考えてみよう。手元には各店舗の売り上げが記録されたデータセットがあるものとする(図1)。

図1●あるチェーン店各店舗の売り上げが記録されたデータセットの処理
図1●あるチェーン店各店舗の売り上げが記録されたデータセットの処理
[画像のクリックで拡大表示]

 まずはMapReduceフレームワークの仕組みに当てはめ、MapフェーズとReduceフェーズそれぞれどのような処理を行うか考えよう。Mapフェーズでは、データセット中の個々のレコードに対してどの都市についてのレコードなのかをひも付ける。そしてReduceフェーズでは同じ都市でタグ付されたレコードを集約する。

 続いてMapフェーズとReduceフェーズでの処理を、それぞれ複数のMapタスクとReduceタスクで構成することを考えよう。1つのMapタスクでは、入力となるデータセット中の一部のサブセットの処理を担当し、そのサブセット中のレコード1件1件についてどの都市についてのレコードかという情報をタグ付けする。個々のMapタスクの処理結果を合わせると、結果的に入力データセット全体について処理したことになる。

 続いて個々のReduceタスクでは都市1つ分のデータセットのサブセットを集約処理する。個々のReduceタスクはそれぞれ異なる都市についてデータセットのサブセットを処理し、全体として当初の問題を解ける。