Hadoopハンズオンセミナーに参加してきました

4月14日に新横浜のAcroquest Technology社で開催された、第2回 初心者向け Hadoop ハンズオンセミナーに参加してきました。
第2回 初心者向け Hadoop ハンズオンセミナー : ATND
初心者向けと銘打っているだけあって、Hadoop環境の構築手順から当日のセミナー内容まで丁寧でわかりやすく、とても勉強になりました。

普段の業務ではRDBMSばかり相手にしているため、Hadoopについての知識はほとんどありませんでした。
そのため、多くの新しい概念を学びました。


1. 入出力データはファイルベース、置く場所はHDFS

Hadoopでは、HDFSと呼ばれる、通常とは異なるファイルシステムを使います。
このファイルシステムの上に、処理したいデータ(ログファイルなどの巨大なファイル)を配置します。
HDFSを扱うには、下記のようにhadoopコマンドを使います。

$ hadoop fs -mkdir /sample
$ hadoop fs -copyFromLocal ファイル名 /sample

ここでの /sample は、HDFS上のパスで、ローカルのパス体系とは別の空間にあります。

HDFSは、大量の安価なサーバでクラスタを組めるようにするため、いつどのサーバが故障してもデータの損失がないように、コピーをいくつも作って保持します。
この時、ディスクを効率的に使うため、ある程度の一定の大きさ(デフォルトだと64MB)に小分けにして保持するとのことでした。
元ファイルやコピーの場所は、すべてNameNodeと呼ばれるマスターサーバが管理しているそうです。
ちなみに、データ自体が置かれるスレーブサーバはDataNodeと呼ばれます。

HDFSという名前は聞いたことがあった程度でしたが、ローカルのパス体系とは別の空間に入力データをつっこむ、というのが新しい感覚でした。


2. Mapはファイル1行からKey-Valueを生み出す処理、ReduceはKeyに紐づくValueのリストをどうにかする処理

Hadoopは、MapとReduceという処理を繰り返すことにより、目的の処理を行います。
Mapとは、ファイルを読み込んでHadoopの処理系につっこむ処理を指し、Reduceとは、Hadoopの処理系から渡された結果をファイルに書き出す処理を指します。

セミナーでは、ある期間に発生した地震の、日時とマグニチュードが記載されているCSVファイルを読み込んで、日付ごとの地震の回数や、マグニチュードの平均値を出す、という課題が与えられました。
この課題を解くために作成したMapとReduceの処理は次の通りです。

・Map
ファイル1行が引数として渡されるので、それをカンマで分割し、1カラム目にある日付と4カラム目にあるマグニチュードを、それぞれKeyとValueにしてHadoopの処理系に書き出す。

・Reduce
Hadoopの処理系が同じKeyに紐付くValueをリストにして渡してくれるので、地震の数を数えたいならリストの長さ、マグニチュードの平均値を出したいなら全てを足して個数で割った数値を、Keyとともに書き出す。

つまり、”Hadoop”を端的に言うと、”大量に与えられるKey-ValueをKeyごとにまとめ、同じKeyに紐づくValueを集めてリストにして返す”といったところでしょうか。
それを実現するのは非常に難しいのでしょうが、目的は至ってシンプルでした。

MapReduceという単語は何度も聞いていましたが、MapとReduceがそれぞれどういう処理を指すのか、今まではイメージが湧きませんでした。
しかし、課題で実際にコードを書いてみて、はっきりとイメージがつかむことができました。
能書きを読むだけでなく、サンプルやチュートリアルを動かしてみる、写経する、ということの大事さを改めて感じました。



3. プログラムのある所にデータを持ってくるのはなく、データのある所にプログラムを持っていく

普段はRDBMSを扱っているので、処理サーバからDBにアクセスし、データを取ってきて処理する、というのは当たり前でした。
しかし、Hadoopが相手にするデータはPB(ペタバイト)級のビッグデータ
これを全部読み込むのはおろか、データを持ってくることさえも、かなり大変な作業です。

Hadoopでは、上で書いたMapとReduceの一連の処理を”ジョブ”と呼び、それをクラスタのサーバにばらまいて処理します。
これが、従来のシステムとHadoopが大きく異なる概念ではないでしょうか。
セミナーでも、考え方を変えないと理解が難しい所だ、と仰っていました。


他にも、MapReduceという処理の仕方をしないといけないのはビッグデータを扱うための制約だと考えること、とか、Hadoopの処理をしなくても巨大なファイルを単にHDFS上に置いておいて使い道は後で考えるのも良し、など、新しい感覚をたくさん学びました。

年初に、2012年のキーワード10個のひとつにビッグデータの文字があったのを記憶しています。
今回、Hadoopについて丁寧に説明して頂いた上、実際に課題でコードを書いてみることで、頭の中のイメージがとてもクリアになりました。
非常に有意義なセミナーに参加できました。
セミナーを開催して下さった関係者の皆様、ありがとうございました。