Edited at

Apache Pig で大規模データセットを分散処理する

More than 5 years have passed since last update.


Apache Pig とは

Apache Pig は簡潔に Hadoop でのクエリーを記述することのできる高水準な言語です。

このように高水準な記述で大規模なデータセットを扱えるドメイン固有言語のようなものは他にもいくつかありますが、現時点では Pig はその柔軟さや拡張性という面からかなり優位性が高いのではないかと思います。

種類
説明

Pig
手軽に使えて複雑な処理も可能であり柔軟性が高い、パフォーマンスは低め

Hive
SQL ライクな文法が使用可能で Pig よりパフォーマンスが高い

Hadoop Streaming
Ruby や Python など慣れ親しんだ言語で MapReduce を記述できるが、実装そのものは自力で記述する必要が有る

Java
当然ながら最もハイパフォーマンスでありその分生産性は低い、毎日実行される処理など性能を追い求める場合はこれ

実務で利用するなら、アドホックな分析には Pig を多用、毎晩実行するような定型処理だけガッツリとチューニングした Java プログラムを利用、といった風に使い分けるのが現実的かと思います。


Pig を使うための準備をする


パッケージの追加

Debian / Ubuntu を開発環境に使っていることを前提にします。 Cloudera の CDH3 のリポジトリを利用するのが最も手軽かと思います。

Debian の場合こうします。

# 公開鍵の追加

curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add -

# ソースリストの記述
sudo vim /etc/apt/sources.list.d/cdh3.list
# deb http://archive.cloudera.com/debian squeeze-cdh3 contrib
# deb-src http://archive.cloudera.com/debian squeeze-cdh3 contrib

sudo apt-get update
sudo apt-get install hadoop-pig

Pig にはテスト目的のローカルモード、分散実行用の Hadoop モードといったものがあり、開発のためにはまずローカルモードでジョブが普通に実行できる状態を目指します。


Java のインストール

GNU/Linux ディストリビューションには OpenJDK などが用意されているかとは思いますが、 Pig のために Oracle JDK を公式サイトからダウンロードします。

あなたとJAVA, 今すぐダウンロード

ちなみに筆者はプログラミング言語環境について以前にも書いたように /opt に入れますので /opt/java/jdk/current/bin あたりにパスを通し、また JAVA_HOME などの環境変数も適切に設定します。


動作確認をする

きちんと動作するかどうかの確認には Pig のチュートリアルを実行してみるのが良いでしょう。

wget -O  tutorial.tar.gz "https://cwiki.apache.org/confluence/download/attachments/27822259/pigtutorial.tar.gz?version=1&modificationDate=1311188529000"

tar xzvf tutorial.tar.gz
cd pigtmp
pig -x local script1-local.pig

ローカルモードで Pig を実行すると Hadoop のときのように出力先のディレクトリに part-r-00000 や _SUCCESS といったファイルが生成されます。


Pig スクリプトを記述する

文法について日本語の情報としてはこのあたりに良質な情報がありますので参考にすると良いでしょう。

よくありそうなケースとして次のようなシナリオを考えてみます。

タブ区切りに区切られたテキストの中に、主キー、開始時刻印、終了時刻印、件数が格納されている。これらのレコードを件数ごとにグルーピングしたい。

Pig であれば記述は 3 行程度で済みます。

raw = LOAD 'input.txt' USING PigStorage('\t') AS (key: chararray, start: chararray, end: chararray, counts: int);

grouped = GROUP raw BY counts;
STORE grouped INTO 'result' USING PigStorage();

1 行めはデータの形式を定義、 2 行めでグルーピングすなわち特定のデータごとにレコードをまとめる処理を記述、 3 行目で result というディレクトリに結果を出力しています。

ローカルモードと Hadoop モードでは、主に入出力ファイルが圧縮されたアーカイブかどうかといった点が異なります。しかしその他の大部分は同じです。

SQL に似てますから直感的な記述が可能ですし、これを Hadoop クラスタで実行すればそのまま分散処理ができるというわけです。便利ですね。


参考

大規模なデータセットを効率的に扱うための Pig 超入門

http://blog.livedoor.jp/sasata299/archives/51457409.html

10分でHadoop-Pigの基本文法を理解する

http://d.hatena.ne.jp/yutakikuchi/20130107/1357514830

Apache Pig でデータを処理する

http://www.ibm.com/developerworks/jp/linux/library/l-apachepigdataquery/

Getting Started (v0.12.1)

http://pig.apache.org/docs/r0.12.1/start.html

Pig Latin Basics (v0.12.1)

http://pig.apache.org/docs/r0.12.1/basic.html

Pig UDF Manual (v0.12.1)

http://pig.apache.org/docs/r0.12.1/udf.html