Hadoop學習筆記—16.Pig框架學習
一、關於Pig:別以為豬不能幹活
1.1 Pig的簡介
Pig是一個基於Hadoop的大規模數據分析平臺,它提供的SQL-LIKE語言叫Pig Latin,該語言的編譯器會把類SQL的數據分析請求轉換為一系列經過優化處理的MapReduce運算。Pig為復雜的海量數據並行計算提供了一個簡單的操作和編程接口。
Compare:相比Java的MapReduce API,Pig為大型數據集的處理提供了更高層次的抽象,與MapReduce相比,Pig提供了更豐富的數據結構,一般都是多值和嵌套的數據結構。Pig還提供了一套更強大的數據變換操作,包括在MapReduce中被忽視的連接Join操作。
Pig包括兩部分:
- 用於描述數據流的語言,稱為Pig Latin。
- 用於執行Pig Latin程序的執行環境,當前有兩個環境:單JVM中的本地執行環境和Hadoop集群上的分布式執行環境。
Pig內部,每個操作或變換是對輸入進行數據處理,然後產生輸出結果,這些變換操作被轉換成一系列MapReduce作業,Pig讓程序員不需要知道這些轉換具體是如何進行的,這樣工程師可以將精力集中在數據上,而非執行的細節上。
1.2 Pig的特點
(1)專註於於大量數據集分析;
(2)運行在集群的計算架構上,Yahoo Pig 提供了多層抽象,簡化並行計算讓普通用戶使用;這些抽象完成自動把用戶請求queries翻譯成有效的並行評估計劃,然後在物理集群上執行這些計劃;
(3)提供類似 SQL 的操作語法;
(4)開放源代碼;
1.3 Pig與Hive的區別
對於開發人員,直接使用Java APIs可能是乏味或容易出錯的,同時也限制了Java程序員在Hadoop上編程的運用靈活性。於是Hadoop提供了兩個解決方案,使得Hadoop編程變得更加容易。
?Pig是一種編程語言,它簡化了Hadoop常見的工作任務。Pig可加載數據、表達轉換數據以及存儲最終結果。Pig內置的操作使得半結構化數據變得有意義(如日誌文件)。同時Pig可擴展使用Java中添加的自定義數據類型並支持數據轉換。
?Hive在Hadoop中扮演數據倉庫的角色。Hive添加數據的結構在HDFS,並允許使用類似於SQL語法進行數據查詢。與Pig一樣,Hive的核心功能是可擴展的。
Pig和Hive總是令人困惑的。Hive更適合於數據倉庫的任務,Hive主要用於靜態的結構以及需要經常分析的工作。Hive與SQL相似促使 其成為Hadoop與其他BI工具結合的理想交集。Pig賦予開發人員在大數據集領域更多的靈活性,並允許開發簡潔的腳本用於轉換數據流以便嵌入到較大的應用程序。Pig相比Hive相對輕量,它主要的優勢是相比於直接使用Hadoop Java APIs可大幅削減代碼量。正因為如此,Pig仍然是吸引大量的軟件開發人員。
二、Pig的安裝配置
2.1 準備工作
下載pig的壓縮包,這裏使用的是pig-0.11.1版本,已經上傳至了百度網盤中(URL:http://pan.baidu.com/s/1o6IDfhK)
(1)通過FTP工具上傳到虛擬機中,可以選擇XFtp、CuteFTP等工具
(2)解壓縮
tar -zvxf pig-0.11.1.tar.gz
(3)重命名
mv pig-0.11.1 pig
(4)修改/etc/profile,增加內容如下,最後重新生效配置文件source /etc/profile
export PIG_HOME=/usr/local/pig
export PATH=.:$HADOOP_HOME/bin:$PIG_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH
2.2 設置Pig與Hadoop關聯
進入$PIG_HOME/conf中,編輯pig.properties文件,加入以下兩行內容:
fs.default.name=hdfs://hadoop-master:9000
mapred.job.tracker=hadoop-master:9001
三、Pig的使用實例
3.1 文件背景
結合本筆記第五篇《自定義類型處理手機上網日誌》的手機上網日誌為背景,我們要做的就是通過Pig Latin對該日誌進行流量的統計。該日誌的數據結構定義如下圖所示:(該文件的下載地址為:http://pan.baidu.com/s/1dDzqHWX)
PS:在使用Pig之前先將該文件上傳至HDFS中,這裏上傳到了/testdir/input目錄中
hadoop fs -put HTTP_20130313143750.dat /testdir/input
3.2 Load:把HDFS中的數據轉換為Pig可以處理的模式
(1)首先通過輸入Pig進入grunt,然後使用Load命令將原始文件轉換為Pig可以處理的模式:
grunt>A = LOAD ‘/testdir/input/HTTP_20130313143750.dat‘ AS (t0:long,
msisdn:chararray, t2:chararray, t3:chararray, t4:chararray, t5:chararray, t6:long, t7:long, t8:long, t9:long, t10:chararray);
(2)通過Pig對指令的解析,幫我們轉換成為了MapReduce任務:
(3)通過以下命令可以查看結果:
grunt>DUMP A;
3.3 FOREACH:把A中有用的字段抽取出來
(1)這裏我們需要統計的只是手機號以及四個流量數據,因此我們通過遍歷將A中的部分字段抽取出來存入B中:
grunt> B = FOREACH A GENERATE msisdn, t6, t7, t8, t9;
(2)通過以下命令可以查看結果:
grunt>DUMP B;
3.4 GROUP:分組數據
(1)有用信息抽取出來後,看到結果中一個手機號可能有多條記錄,因此這裏通過手機號進行分組:
grunt> C = GROUP B BY msisdn;
(2)通過以下命令可以查看結果:
grunt>DUMP C;
3.5 GENERATE:流量匯總
(1)在對手機號進行分組之後,我們可以看到某個手機號對應著多條流量記錄數據,因此繼續使用FOREACH遍歷分組數據,然後對四個流量數據進行匯總,這裏使用了聚合函數SUM():
grunt> D = FOREACH C GENERATE group, SUM(B.t6), SUM(B.t7), SUM(B.t8), SUM(B.t9);
(2)通過以下命令可以查看結果:
grunt>DUMP D;
3.6 STORE:將統計結果存儲到HDFS中進行持久化
(1)在對流量統計完畢之後,結果仍然是在Pig中,這裏就需要對其進行持久化操作,即將結果存儲到HDFS中:
grunt> STORE D INTO ‘/testdir/output/wlan_result‘;
(2)通過HDFS Shell查看存儲結果:
hadoop fs -text /testdir/output/wlan_result/part-r-*
參考資料
(1)yanghuahui,《Hadoop Pig簡介、安裝與使用》:http://www.cnblogs.com/yanghuahui/p/3768270.html
(2)cloudsky,《Hadoop使用(六)Pig》:http://www.cnblogs.com/skyme/archive/2012/06/04/2534876.html
(3)rzhzhz,《Pig與Hive的對比》:http://blog.csdn.net/rzhzhz/article/details/7557607
原文鏈接:http://www.cnblogs.com/edisonchou/
Hadoop學習筆記—16.Pig框架學習