Tech Sketch Bucket of Technical Chips by TIS Inc.

Hadoop Pig の使いどころ

Pocket

「PigとHive何が違うの?」

「Difference between Pig and Hive? Why have both?(PigとHive何が違うの?)」 という質問を、先日、StackOverFlowで見かけました。恐らくHadoopを触ると一度は疑問に思う事ではではないでしょうか。

PigとHiveは、共にSQLライクな記法でMapReduceを書けるDSLですが、利用者数においてはHiveに軍配が上がっているようにみえます。
一方で、「Pigをもっと早く試せば良かった」というお話を伺うこともあり、有用(かもしれない)ツールであれば、正しく理解しておいた方がよさそうです。
というわけで、ここではPigの活用を探ります。

Pigの性能

Pigが今一つ利用されていないのは、SQLとの親和性に加え、性能面で、「JavaMapReduce>Hive>Pig」という傾向があるからではないでしょうか。
こちらの 記事 を参考に、自分でも計測してみました。比較の為に双方のコードを下記にあげておきます。

  • Pig ver. 0.10
  • Hive ve. 0.7
  • Pig の実装

  • Hiveの実装、

性能結果

Pig Hive
3mins, 21sec 1min 23sec

同じようなコードですが、想定通り、Pigの方が倍以上遅くなります。メトリクスを調べるとPig はDiskI/OがHiveの倍(Mapの出力バイト数に至ってはHiveの1500倍)でした。全ての処理で同じ結果となるわけでもないでしょうが、確かにHiveに比べ処理効率が悪い点は否めません。

DiskI/O

diskio_mini_line_title.png

CPU

cpu_mini_title.png

Pigの開発しやすさ

それでも、「Pigを使いたい」と言われるのは、Pigの開発容易性による所が大きい、と思われます。
Allan Gateは「 Comparing Pig Latin and SQL for Constructing Data Processing Pipelines 」で「パイプライン処理にFITする」としているのですが、O'ReillyのHadoop本でも、Hiveに対し同じ表現を使っているので、Hiveとの相違をもう少し具体的に列挙してみます。

1.Complex Typesを使える

例えば、Hiveでパスワードファイルをロードして、グループIDで集計すると、user_idの件数は取得できても、具体的なuser_idリストは返せません。SQL構文上のGROUP BYによる集計結果は、集計KeyとMAX/MIN/AVG/COUNTした結果を返すのでこれに準じている為でしょう。
しかし、Pigを用いると結果集合そのものを返す事も可能です。

Pigでは下記のような動作になります。

(0, {(root,x,0,0,root,/root,/bin/bash),(sync,x,5,0,sync,/sbin,/bin/sync),(shutdown,x,6,0,shutdown,/sbin,/sbin/shutdown),(halt,x,7,0,halt,/sbin,/sbin/halt),(operator,x,11,0,operator,/root,/sbin/nologin)} ) ←groupid=0 の集合がそのまま返される
(1,{(bin,x,1,1,bin,/bin,/sbin/nologin)})
(2.{...

2.メタデータが無くても、データを操作できる

Hiveを使う場合は予めテーブル定義が必要であり、型も定義する必要があります。これに対し、Pigはよりデータ構造に対して柔軟です。
まず処理途中のテンポラリテーブルを、LOAD前に定義する必要はなく、

は行毎にカンマ数が異なっていても構わずロードします。(列名は動的に付与されます)
さらに、ある列の値で集計しながら、結果をロードしたり、ComplexTypeにマッピングすることも可能です。

3. パイプライン処理のかきやすさ

具体的にパイプラインが書けるわけではないですが、処理結果を順番に次の処理に渡す形で記述できます。

Hiveでのパイプライン処理は、サブクエリで表現することとなります。
条件が複雑な場合、1文で表現するのは少々煩雑です。

4. Pigはローカルモードで動かせる

尚且つ、実行時に オプションを付与する事で、ローカルファイルを読みスタンドアロンで動かせます。Hadoopサービス群が動いている必要はありません。

まとめ

勿論、どちらもUDFを使えば拡張は可能です。PigとHive双方が得意な処理は異なりますが、頑張れば相互に同じ事が実現可能でしょう。ですので、今回は「MapReduce処理を簡単に書ける」点の比較として、書きやすさの観点で評価をしてみました。
性能の課題はあるものの、Pigは、行毎に項目数が異なるような「柔らかいデータを扱う処理」、あるいは変換処理を繰り返すような「複雑な処理」が使い処といえそうです。

Apache Pig では Pig Philosophy として下記のようなポリシーを定義してます。

  • Pigは、メタデータを持っていなくても、データを操作することができます。
  • Pigは、ネストした構造、あるいはは構造化されていないデータを操作することができます。
  • Pigは、ファイルか、key-valueStoreか、データベースかを超えて、操作を拡張することが簡単にできます。
  • Pigの最初の実装はHadoopですが、Hadoop実装しかしないつもりはありません。

Pigは柔軟性が高く、開発が容易。今後、性能面での向上を期待したいところです。

参考:

「Comparing High Level MapReduce Query Languages」 ~ Hive, Pig, JavaMR, JAQLと言う4つの言語の比較論文。

エンジニア採用中!私たちと一緒に働いてみませんか?