さて今回から新しいテーマです。
分散計算フレームワークであるHadoopを導入から実践までを連載します。よろしくお願いします。
Googleの技術から生まれたHadoop
わたしたちは日常、ごく当たり前にGoogleのサービスを使っています。
あそこの店の情報を知りたい、有名人xxさんってどんな人?、あの大事件を振り返って調べたい、などなど。生活に密着した情報だったり、過去を振り返って社会現象を調べたり、あるいは芸能人のゴシップネタを検索したりと、知りたいことは人それぞれで目的も全く違いますが、Googleの検索を利用すれば一発で目的の情報(あるいは近い情報)にたどり着くことができます。
世界中の何億というWebページについて文言によってインデックス化してなければとうていできない芸当です。そしてウェブページは新たに作られ、または消えてしまうものでもあります。ものすごく膨大なテキストデータの解析を行っているわけですが、いったいどのような技術が使われているんでしょうか?
答えは、Googleの内製インフラのひとつであるMapreduceです。という仕組みによって大規模解析は行われています。
Mapreduceの技術そのものは論文で公開されており、その概要に触れることができます。Mapreduceの技術詳細仕様については社外秘となっており、論文以外は世に出ていません。
しかし驚くべき事に、その論文をベースにゼロから開発されたのが、Hadoop MapReduceです。Hadoopプロジェクトは現在Apache Software Foundationで開発・管理されており、ソースコードは全てオープンソースなため、誰でも入手が可能となっています。
Hadoopで開発されているシステムとGoogleのシステムは、表1のように対比が可能です。
表1 CoogleのMapreduceとHadoopの比較
機能 | Googleでは… | Hadoopでは… |
ファイルシステム | Google File System | Hadoop Distributed File System |
計算フレームワーク | Mapreduce | Hadoop MapReduce |
データベース | BigTable | Hadoop HBase |
この連載では主に、Hadoop MapReduceとHadoop Distributed File Systemについて触れたいと思います。
Hadoop MapReduceの概要
最初に書いたように、何億ページという膨大なデータを処理するには1台のコンピュータでは処理の限界に容易に到達してしまいます(図1左参照)。しかし、Hadoopの技術を用いることでデータの分割が行われ(Hadoop Distributed File System)、分割されたファイルに対する処理(Map)、それぞれのMap処理の結果を処理する(Reduce)という風にプロセスが遷移します(図1右参照)。そして最終的な出力結果を出力します。
ずいぶん簡略化された図になりましたが、入力データの分割により並列に処理が可能になり、それぞれの結果を集約することであたかも1台のサーバで処理を行ったかのように結果を得ることができます。
繰り返しになりますが、上の処理を行うには、2つの技術が必要となります。1つはHadoop Distributed File Systemで、もう1つがHadoop MapReduceです。
Hadoop Distributed File Systemについて
Hadoop Distributed File System(以下HDFS)は、ネットワーク上に分散したファイルシステムです。ファイルをブロックという単位に分割し(通常64MB)、データノードと呼ばれるPC群にデータを分散させます。それらのデータノード群を管理するのがネームノードと呼ばれるPCで、これはHDFSを構成するPC群では1台だけとなっています。ネームノードが停止するとHDFSには一切アクセスが不能となりますので、注意が必要です。
ブロック単位に分割することで、巨大なファイルは多くのデータノードに分散されます。しかし、ブロック化しない場合はその巨大なファイルが収まるだけのさらに巨大なストレージが必要となります。
スケールアップ(1台のPCをハイスペックにする)ではなくスケールアウト(PCを追加して全体としてのリソースを増やす)で対応できるようにというのがHDFSの理念でもあります。このように散らばったブロックを意識することなくアクセスできるように、コマンドラインのインターフェースが用意されています。基本的にはUNIXやftpのコマンドに習っており、ほぼ直感的に使えるモノばかりです。
表2に一例を挙げます(hadoop dfs と入力すると、helpで全てのコマンドが確認できます)。
表2 UNIX/ftpコマンドとHDFSコマンドの一例
UNIX/ftpコマンド | HDFSコマンド | 処理の概要 |
ls | hadoop dfs -ls | HDFS内のファイルリストを出力する。 |
rm -r | hadoop dfs -rmr hdfspath | HDFS内のファイルやディレクトリを再帰的に削除する。 |
put | hadoop dfs -put localpath hdfspath | ローカルのファイルやディレクトリをHDFSにコピーする。 |
get | hadoop dfs -get hdfspath localpath | HDFSのファイルやディレクトリをローカルにコピーする。 |
そしてブロック化されていることは、MapReduce処理において大きな意味を持ちます。
Hadoop MapReduceについて
Hadoop MapReduce(以下MapReduce)はデータ処理のフレームワークで、機能的にはMapとReduceタスクの2つに分割されます。以下にMapReduceの流れを示します。
- ① Mapタスクは、データの最初の入力を受け持つタスクで、この処理においてデータはキーとバリューの形式に変換されます(変換します)。
- ② Mapされたデータはキーバリュー形式で出力され、キー順にソートされ、さらにキーごとにバリューを配列にまとめた状態でReduceタスクに渡されます。
- ③ Reduceタスクは、受け取ったキーについてバリューを処理し、最終的な出力を行います。
このような流れでMapReduce処理が行われますが、ユーザが処理を作らないといけない部分は①と③のMapタスク、Reduceタスクになります。②はHadoopの機能として勝手にやってくれます。そのためにはデータ構造がキーバリュー形式であるという前提が必要になります。
つまり、データ形式を規定することで、ユーザは2つの処理を作るだけで計算フレームワークを享受できるわけです。
しかしこれだけではまだMapReduceらしさは発揮できていません。ここで重要になってくるのが、前述のHDFSによるファイルの分散です。入力データをHDFS上に置くことにより、Hadoopは入力データが存在するデータノードでMapタスクを実行しようとします。つまり、ファイルが分散すればするほどMapタスクは並列で処理を進めることが可能となるわけです。
極端な例を出すと、1台のPCで100秒かかるMapタスクが、100台のPCに分散されると1秒で処理が終わってしまうと言うことです(実際には処理のオーバーヘッドがあるので単純に言えませんが)。
ざっくりと説明してきましたが、これが大まかなHDFS, MapReduceの仕組みです。次回は環境構築をやってみましょう。