SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

「Jaql」を使ってMapReduceをより簡単に

Jaql(a query language desired for JSON)の使い方

  • X ポスト
  • このエントリーをはてなブックマークに追加

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」という名称で置き、実行していきます。

注:

 この名前のデータは、某所で公開されているデータですが、利用許可なども別にとっていませんので、お使いになる場合にはご自身の責任の範囲で作成して行ってください。筆者は、変換プログラムを作って抽出しましたが、責任を負えないので生データを提供することはひかえさせていただきます。名前だけの羅列のため、個人情報にはあたりません。

次のページ
4. Jaqlの基礎

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

米持 幸寿(ヨネモチ ユキヒサ)

日本アイ・ビー・エム公認 ソフトウェア・エバンジェリスト。alphaWorks、developerWorks、インキュベーション系製品、アセットなどのテクノロジーの推進をしつつ、テクノロジー戦略、エバンジェリストチームをリードしている。講演や執筆も多数。主な著書に「かんたんサーバーサイドJava」(翔泳社)、「Webサービス完全解説」(翔泳社)がある。developerWorks Japan ブログ 「米持幸寿のブログ

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5646 2010/12/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング