2. Apache Hadoopで動かす準備
Jaqlの実装が、Apache Hadoop用に公開されています。動かしたほうが理解しやすいと思いますので、対応するLinux環境が準備できる方は、ぜひ試してください。なぜApache Hadoopかというと、MapReduceのジョブの記述に適しているからです(これは筆者の個人的な意見ですが、MapReduceでなくても有益な言語だと思います)。
実際にApache Hadoopクラスターで動かすと、クラスター上にMapReduceジョブが「コンパイル」されてサブミットされるため、Apache Hadoopクラスター上に存在する巨大データの処理をJaqlで記述することができます。
最初に試すために簡単な方法は、コマンドプロンプトで対話式で実行することです。これは「Jaqlシェル」と呼んでいます。
前提条件
これは、Apache Hadoopの前提条件ともなりますが、サポートされているLinux、Javaが必要です。本記事では、RedHat Enterprise Linux 5.4 + IBM SDK for Java 6.0で稼働確認しています。
JaqlはHadoopで実行されますが、以下のダウンロードパッケージにはHadoopも含まれていますので、別途用意しなくても意外と簡単に試すことができます。
ダウンロード
ダウンロードサイトから、「jaql-0.5.1_12_07_2010.tgz」をダウンロードし、Linuxディレクトリーに展開します。
データの準備
Jaqlに読み込ませるデータは、ローカルファイルかHDFS上のどちらにあっても構いません。先ほどのようなデータを、UTF-8などでテキストファイルに準備してください。
シェルの実行
Linuxのコマンドプロンプト(シェル)から、「jaql-0.5.1/bin」へcdし、「jaqlshell」を実行して、シェル(コマンドプロンプト)を起動します。このコマンドでは、Hadoopのミニクラスターが起動しますので、簡単に試すことができます。
[root@name ~]# jaqlshell Initializing Jaql. Starting DataNode 0 with dfs.data.dir: /tmp/jaql/dfs/dfs/data/data1,/tmp/jaql/dfs/dfs/data/data2 Waiting for the Mini HDFS Cluster to start... Generating rack names for tasktrackers Generating host names for tasktrackers jaql> quit; Shutting down jaql. Shutting down the Mini HDFS Cluster Shutting down DataNode 0 [root@name ~]#
HadoopクラスターのJobTrackerおよびHDFSのnameノードが稼働するマシンで、「jaqlshell -c」を実行すれば、既存のHadoopクラスターでも実行可能です(内部的には、HADOOP環境変数が設定されている場合、HADOOP_HOME/conf/*.xmlなどの構成情報を参照してJobTrackerやnameノードに接続します)。
シェルなので、コマンドを入力して結果を得る、ということをくり返します。以下の操作を覚えておくとよいかと思います。
- 「空エンター」:
改行です。改行ではコマンドは実行されず、続きが入力できます。 - 「;エンター」:
セミコロン「;」でコマンド入力終了の意味となり、そこで実行されます。 - 「quit;エンター」:
シェルを終了します。
まだ少し不安定な場合があり、動作がおかしくなったらいったんjaqlshellを終了して再起動したほうがよい場合があります。quit;でも抜けられない場合は、Ctl-Cなどで強制終了してください。
jaqlコマンドをファイルに保存しておき、-cなどのオプションに続けてそのファイル名を指定することで、バッチ的に処理させることもできます。ファイルの最後に「quit;」を追加しておかないと、プロンプトが出て停まるのでご注意を。また、「-b」オプションを付けることで、スクリプトの出力結果だけ表示されるようなるので、それをUNIXコマンドへパイプ「|」で接続するなど、再利用しやすくなります。
サブフォルダー「jaqllog」の下に、MapReduceのログが書き込まれます。Jaqlを実行しているとき、tailなどで表示しておくとジョブの実行状況が表示されますので、雰囲気が伝わってよいかと思います。
3. ここで取り扱うデータ
ここでは、子供の名前一覧を使って、Jaqlの動作を確認していきます。以下のようなデータが大量に含まれているJSONファイルをUTF-8で準備し、利用します。名前(name)、人数(head-count)、ランク(position)、が各行に含まれています。
[ {"head-count": 78,"name": "鈴木 健太","position": 1}, {"head-count": 73,"name": "佐藤 匠","position": 2}, {"head-count": 67,"name": "鈴木 里奈","position": 3}, {"head-count": 67,"name": "鈴木 翔太","position": 4}, {"head-count": 62,"name": "高橋 里奈","position": 5}, : : 以下同様 ]
データは、JSONファイルをテキストファイルで準備します。jaqlshellを実行するマシンにあってもよいですが、その場合、途中HDFSへロードしたほうが大量データの処理は有利です(HDFSにMapRreduceからアクセスする)。いずれにせよ、HDFSへ持っていくので、データは最初からHDFSにあったほうがよいでしょう。
ここでは、このファイルをjaqlshellを起動したフォルダーに「NameRank.json」という名称で置き、実行していきます。
この名前のデータは、某所で公開されているデータですが、利用許可なども別にとっていませんので、お使いになる場合にはご自身の責任の範囲で作成して行ってください。筆者は、変換プログラムを作って抽出しましたが、責任を負えないので生データを提供することはひかえさせていただきます。名前だけの羅列のため、個人情報にはあたりません。