HadoopはGoogleの技術者が発表した論文を元に実装されたオープンソースで、 その論文で述べられたGoogle File System及びMapReduceは分散処理の原理群を基にしています。

Hadoopの生みの親であるDoug Cutting氏は、元々Web検索エンジンNutchを開発していましたが、これはWebに存在する膨大なファイル群に対しスケールしないことが分かってきました。そこで、2003年に発表された論文を元に実装を進め、検索エンジンの大部分はNutch Distributed Filesystem (NDFS、分散ファイルシステム)とMapReduceで実行できるように移植を行いました。その結果実装されたHadoopの用途は検索に留まらないため、新たなプロジェクトとして独立し、Yahoo!を中心に開発が進められ、現在に至ります。また、Nutchもオープンソースの検索エンジンとして幅広く利用されています。

HDFS/MapReduce

図2-1 Hadoopのしくみ

図2-1に示すように、HadoopはファイルシステムであるHDFS(Hadoop Distributed Filesystem)及び分散処理のフレームワークであるMapReduceから構成されます。HDFSは複数のノードから構成され、ファイルあるいはデータをブロックに分割しますが、クライアントからはUNIXのファイルシステムのように1つのファイルシステムとして扱えるだけでなく、UNIXのコマンドに良く似たコマンドでデータを操作できます。

HDFSはデータをブロック単位で抽象化することでファイルシステムの管理を単純化するだけでなく、ブロックを複製し、複数ノードから構成されるクラスタ全体に分散させることで、耐障害性及び処理のパフォーマンスを高めています。そのため、このブロックを保存したノードが故障しても、他のノードに同じブロックが存在する限り、データは失われません。ブロックサイズを通常のファイルシステムより大きめ(デフォルトで64M)にすることで、処理全体におけるシークタイムの比率を小さくしています。

加えて、データブロックを並列に読む込むことでスループットを向上していますが、データアクセスのレイテンシを犠牲にします。また、保存するデータ量が増えてきた場合は、新たにノードを追加するだけで対処できるというスケーラビリティを実現しています。ネームノードはHDFSのマスタであり、全ファイルの全ブロックの名前空間だけでなく、ファイルシステム全体の管理を行うため、HDFSに保存可能なデータブロックはネームノードのメモリ量に依存します。したがって、ブロックサイズを大きくすることで、このメモリ量を減らすことができます。

図2-2 Hadoop MapReduceによる処理概要

図2-2に示すように、MapReduceはデータノードにあるブロックを処理します。この処理をMapとReduceの2つのフェーズに分解して実行します。MapとReduceの間にあるShuffleは、Mapの出力をソートし、Reduceの入力として転送します。

Mapではブロックから入力したデータを、keyとValueへのマッピングを実行し、出力します。HDFS内でデータがブロック単位で抽象化されているため、Mapはノード内のブロックに対して処理を実行します。ブロックがクラスタ内のノードに分散されていれば、各ノード上で処理を実行できます。

したがって、Mapの設計は最終的な結果に合わせ、入力データからkey及びValueとなる項目を決定し、それを記述することになります

ReduceはShuffleを通して、Mapの出力結果を同じkey毎に集約します。したがって、Reduceはノード間の処理を実行します。

Hadoopはこれらの処理をデータが各ノード上で実行するため、ノード数を増やすことで、処理可能なMap及びReduceの数を増やせます。

MapReduceのメリットとデメリット

MapReduceは分散処理のフレームワークであり、設計者はロジックに集中できるため、開発効率もあがるメリットがあります。分散処理の効率化のために、投機的実行があります。これはHadoopのHDFS内にブロックの複製があることが前提になります。ただし、ブロックのサイズが等しいことは、その処理に要する時間も等しいことを保障しません。

例えば、Mapから出力されるキー毎のデータペアに偏りがある場合、特定のReducerにデータペアが集中し、処理時間がかかる場合があります。Mapperの内部で他のアプリケーション、例えばNLTKなどの自然言語処理、あるいはOpneCVなどの画像解析のツールを呼び出せば、これらツールによる処理を並列に実行することができます。

実際にHadoopが効果を発揮するデータサイズは大きいだけでなく、小さい場合もあります。例えば、行列演算などをする場合、中間データのサイズが入力データよりも増えてしまい、サーバ一台のメモリに載らなくなることがあります。また、データの結合などでも同様の問題が発生することがあります。その場合、Hadoopは複数サーバ上での分散処理を実行するため、サーバの台数を増やすことで、データサイズに関わらず、同一プログラムで処理ができます。

Hadoopを利用するメリットは、比較的に安価(普通のサーバマシンあるいはPC)な環境でも (1)バッチで大量のデータを処理できる
(2)処理を高速化できる

ことがあります。これらの機能をHadoopは安価なハードウェアでも実現します。

一方、デメリットには、

(1)データのランダムアクセスに弱い
(2)データが少ない場合は、処理やコストのメリットを受け難い
(3)サーバの台数が増えたり、各サーバのアイドリングタイムが長くなる事がある

ことがあります。

ビックデータへのHadoop適用検討には、データのサイズや処理目的に加えて以上のメリットやデメリットを参考に判断することになると思います。

Hadoopはよくデータベースと比べられます。Hadoopはシーケンシャルアクセスによるバッチ処理に特化した作りになっており、インデックスが無い為にランダムアクセス機能はサポートしていない点で違います。Hadoopが原材料の倉庫(HDFS)であり、加工や製造を行う(MapReduce)のに対し、データベースは加工済みの製品を整然と管理したお店の陳列棚で、SQLがベテランの店員というイメージが近いかもしれません。

川前徳章(かわまえ のりあき)
工学博士、NTTコムウェア 研究開発部 勤務。専門は情報検索、統計的機械学習、マーケティングサイエンス。現在は感性検索とコンテンツジェネレータの研究と開発に従事。東京電機大学 安田研究室協力研究員。
関連記事:Hadoopでレコメンドシステムを作ろう