ここではHadoopとはどういったソフトウェアなのかを、イメージ重視でざっくりと説明します。
Hadoopはご存知の通り、複数のマシンで分散して処理を行うためのフレームワークです。
多数のコンピュータに並列で処理を実行させることで、1台のコンピュータでは取り扱えないような大規模なデータを高速に処理することができます。
具体的には下記のような家父長的家族関係のような仕組みで並列処理を行っています。
Hadoopが持つ主な機能に、HDFSとMapReduceがあります。
HDFSは1つのファイルを分散して持っておくことができる仕組み、MapReduceは1つの処理を分散して実行することができる仕組みです。
HDFSはHadoop(象さん) Distributed(分散) File(ファイル) System(システム)の略です。
でっかいファイルを複数のパソコンに分散して持たせることで、1台のマシンでは扱いきれないようなサイズでも取り扱えるようになります。
例えば10TBのファイルがあったとします。最近のHDDは最大で3TBくらいの容量なので、当然一般家庭のマシンではこんなファイルは取り扱えません。
しかしこれを複数のマシンに分散して取り扱うことができれば、10TBだろうが10PBだろうがマシンさえ並べれば取り扱えるようになります。
実際にHadoopがやっていることは上のイメージよりはもう少し複雑です。ブロック毎にデータを管理するとか、HDDが壊れた時などのために複製(レプリカ)を作っておくとか、マシンが壊れても問題なく動作が続くように子供たちの死活管理をしてくれるとか、性能や可用性を高めるためにいろいろ頑張ってくれます。
特にレプリカの作り方は、同じマシン内に同じ情報が偏らない様にとか、同じラック上に偏らないようにとか、同じデータセンター内に偏らないようにとか、いろいろ考えて作ってくれているようです。
でも自宅で使う分にはラックが複数あるはずもなく、そんなHadoopの気遣いも無駄なものになります。
上の絵で、父親のところに「NameNode」、子供のところに「DataNode」という言葉が書かれています。
HDFSではお父様のことを「NameNode」と呼びます。どのデータがどの子供に保存されているかを管理してます。子供は自分が持っているデータがどのファイルのどの部分なのかを理解してないので、親が吹っ飛ぶとデータが読めなくなります。
子供たちは「DataNode」と呼びます。データを記憶します。NameNodeと一定期間ごとに通信をしていて、DataNodeが死亡したらNameNodeはその子を諦めてレプリカを持ってる他のパソコンからデータを取るようにしたり、死んだ子の代わりに新しく他のマシンにレプリカを配布したりします。
MapReduceは複数のマシンで分散して処理を行います。
HDFSのところではNameNodeとDataNodeという名前だった親子関係ですが、MapReduceではJobTrackerとTaskTrackerという名前になります。
お父様であるJobTrackerは、子供に対して「この処理やれ」「あの処理やれ」といったようにあれこれ命令をします。
例えばテキストファイルに出現する単語数を数えるプログラムがあったとします。
ファイルの全行を1台のマシンでカウントすると時間がかかるので、父親は「上からこれだけ分は長男がやれ」「その後ここまでの分は次男がやれ」といったように分割して子供に命令します。
子供が「親父ー、終わったぞー」と報告するとお父様からは「じゃ、次はこっちのデータをやれ」と無慈悲な命令が飛びます。また、子供が作業の途中で居眠りをしてしまい結果が返ってこなかった場合は、父親はその子に命令するのを諦め、返ってこなかった分の処理は他の子に命令を引渡します。
子供たちがそれぞれカウントした単語数は最後に集計処理にかけられ、結果がファイルに出力されます。
単語を数える処理をMap、数え終わった単語を集計する処理をReduceと呼びます。2人合わせてぐりとぐMapReduceです。
MapReduceはそんな感じの仕組みなので、巨大なファイルを1行ずつ読んで集計する処理なんかには向いてます。大量に出力されたログの分析なんかは良く利用されるシーンの1つです。
逆に円周率の計算とか(サンプルにはあるけど精度が低い)、計算結果に対して計算を重ねるような処理はあまり向いていなかったりします。
本項では以下の6つの単語がでてきました。
・NameNode(HDFS親)
・DataNode(HDFS子)
・JobTracker(MapReduce親)
・TaskTracker(MapReduce子)
・Mapper(MapReduce処理)
・Reducer(MapReduce集計)
特に上4つはHadoopの導入の際にも出てくる単語なので、インストール作業を始める前にイメージを頭に入れておくと良いと思います。