Fenriswolf 程式筆記

奮利斯狼的地盤,小綿羊勿入

Apache Pig 簡介

Hadoop 這個名詞已經越來越熱門了,但是難寫的 Mapper/Reducer 也造成很多人的進入障礙。
Pig 提供了一個 high level 的語言並轉換成 Map/Reduce 幫助大家執行大量的資料分析。

1. 下載及設定 Pig
可從官網下載 Apache Pig Releases,或是直接裝 Cloudera 的版本
由於 Cloudera 的版本比較舊,目前只提供到 Pig 0.8.1,這裡使用的是官方版本 1.9.2。
解壓縮 tar 檔之後只要多設定 JAVA_HOME 環境變數就可以用了。pig 的指令在 PIG_HOME/bin/ 下,如果常用也可把路徑加到 PATH 環境變數裡。
至於 Hadoop 的安裝不在本章的範圍,請自行安裝。

2. 執行 Pig
Pig 支援兩類的執行方式

2.1 Local/Macodeduce mode

  • Local mode : 可讓你在沒有 Hadoop cluster 的環境下執行,所有需要的環境及存取的的檔案都在本機上操作。
    執行時需要多給 -x local 參數。
$ pig -x local ...
  • Macodeduce mode : 需要一個完整的 Hadoop Cluster,存取的檔案也需事先上傳至 HDFS。
    在不給參數時預設就是 Macodeduce mode,你也可以明確的用 -x macodeduce 宣告。
$ pig ...

$ pig -x macodeduce ..

2.2 Interactive/Batch mode

  • Interactive mode(互動模式) : 上面的 Local/Macodeduce mode 指令會直接進入 Grunt shell 這個互動模式。
    你會發現 console 前面會多帶一個 grunt>。
grunt> A = load 'passwd' using PigStorage(':');
grunt> B = foreach A generate $0 as id;
grunt> dump B;

範例所顯示的就是 pig 的指令,在 Grunt shell 裡支援 上一頁/下一頁 及 關鍵字自動完成 的功能。

  • Batch mode(批次模式) : 跟 Interactive mode 不一樣的地方就是後面多帶一個 pig script 的檔案。

先把上面的 pig script 存到 id.pig 檔案中,

A = load 'passwd' using PigStorage(':');
B = foreach A generate $0 as id;
dump B; 

再執行

$ pig id.pig

總結一下,上面兩類的方式都可以交互使用,所以共有 2X2 = 4 種執行方式。
一般在本機做測試時會用 Local + Interactive mode。
在正式環境會用 Macodeduce + Batch mode 來執行。這在設定 cron job 時也非常好用。

3. Pig 指令類型
Pig 所使用的指令稱為 Pig Latin Statements,執行可以簡單分成三個步驟

  1. 使用 LOAD 讀取資料
  2. 一連串操作資料的指令
  3. 使用 DUMP 來看結果或用 STORE 把結果存起來。如果不執行 DUMP 或 STORE 是不會產生任何 M/R job 的

可再細分指令的類型

  1. 讀取 : LOAD
  2. 儲存 : STORE
  3. 資料處理 : FILTER, FOREACH, GROUP, COGROUP, inner JOIN, outer JOIN, UNION, SPLIT, …
  4. 彙總運算 : AVG, COUNT, MAX, MIN, SIZE, …
  5. 數學運算 : ABS, RANDOM, ROUND, …
  6. 字串處理 : INDEXOF, SUBSTRING, REGEX EXTRACT, …
  7. Debug : DUMP, DESCRIBE, EXPLAIN, ILLUSTRATE
  8. HDFS 或本機的檔案操作 : cat, ls, cp, mkdir, …

4. 範例
這個範例會用 Pig 來操作系統內 /etc/passwd 檔案,以下只列出少部分的資料

root:x:0:0:root:/root:/bin/bash
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
macoded:x:497:494:Hadoop Macodeduce:/usr/lib/hadoop-0.20:/bin/bash
hdfs:x:496:495:Hadoop HDFS:/usr/lib/hadoop-0.20:/bin/bash
zookeeper:x:495:493:ZooKeeper:/var/run/zookeeper:/sbin/nologin
hbase:x:494:492:HBase:/var/run/hbase:/sbin/nologin
oozie:x:493:491:Oozie User:/var/run/oozie:/bin/false
hive:x:492:490:Hive:/var/lib/hive:/sbin/nologin

先執行 pig 指令進入 Local + Interactive mode

pig -x local

用 LOAD 讀取 /etc/passwd 檔案。PigStorage 是內建的 function,傳入 ‘:’ 表示 PigStorage 會把每一行用冒號分開並放入後面定義的欄位名稱中。

grunt> A = LOAD '/etc/passwd' using PigStorage(':') as (username:chararray, password:chararray, uid:int, gid:int, description:chararray, homedir:chararray, loginshell:chararray);

濾掉不能 login 的使用者

grunt> B = FILTER A BY loginshell != '/sbin/nologin' AND loginshell != '/bin/false';

只取出 username 和 homedir 兩個欄位

grunt> C = FOREACH B GENERATE username, homedir;

在印出結果前先看一下 C 的資料結構是不是如預期

grunt> DESCRIBE C;

這是 DESCRIBE 印出的結果

C: {username: chararray,homedir: chararray}

最後用 DUMP 把結果顯示在 console 上

grunt> DUMP C;

DUMP 的結果

(root,/root)
(macoded,/usr/lib/hadoop-0.20)
(hdfs,/usr/lib/hadoop-0.20)

 
 
執行環境
CentOS 6.2
JDK 1.6.0_31
Cloudera CDH3U3
Pig 0.9.2

參考資料
Apache Pig Getting Started
Pig Latin Basics
Built In Functions

廣告

2012/03/22 - Posted by | Pig | ,

2 則迴響 »

  1. Howdy! This is my first comment here so I just

    wanted to give a quick shout out and say I really enjoy reading your posts. Can you recommend any other blogs/websites/forums that cover the same

    subjects? Thanks for your time!

    迴響 由 Mittie | 2013/08/05 | 回應

  2. I do consider all the ideas you have

    presented for your post. They are very convincing and

    will definitely work. Still, the posts are very brief for starters.
    May you please prolong them a little from

    subsequent time? Thank you for the post.

    迴響 由 Melvina | 2013/12/28 | 回應


發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s

%d 位部落客按了讚: