Hadoop Pig簡介、安裝、試用


相比Java的MapReduce api,Pig為大型數據集的處理提供了更高層次的抽象,與MapReduce相比,Pig提供了更豐富的數據結構,一般都是多值和嵌套的數據結構。Pig還提供了一套更強大的數據變換操作,包括在MapReduce中被忽視的連接Join操作。

 Hadoop版本:2.2.0

 Pig版本:0.12.1

 

Pig介紹

Pig包括兩部分:

  • 用於描述數據流的語言,稱為Pig Latin。
  • 用於執行Pig Latin程序的執行環境,當前有兩個環境:單JVM中的本地執行環境和Hadoop集群上的分布式執行環境。

 Pig內部,每個操作或變換是對輸入進行數據處理,然后產生輸出結果,這些變換操作被轉換成一系列MapReduce作業,Pig讓程序員不需要知道這些轉換具體是如何進行的,這樣工程師可以將精力集中在數據上,而非執行的細節上。

 

安裝Pig

好,作為一切的開始,我們先安裝一個Pig環境。

從http://hadoop.apache.org/pig/releases.html下載穩定版本,當前穩定版本是0.12.1,然后解壓到任意目錄,並且修改環境變量

tar xzf pig-0.12.1.tar.gz

export PIG_INSTALL=/root/pig/pig-0.12.1
export PATH=$PATH:$PIG_INSTALL/bin

 

本地模式

Grunt是Pig的外殼程序(shell)。本地模式下,Pig運行在單個JVM中,訪問本地文件系統,該模式用於測試或處理小規模數據集

[root@hadoop-namenodenew pig]# pig -x local
grunt>

 

MapReduce模式

在MapReduce模式下,Pig將查詢翻譯為MapReduce作業,然后在Hadoop集群上執行。Pig版本和Hadoop版本間,有要求,筆者這邊的版本如下

Hadoop 2.2.0
Pig 0.12.1

注意:Pig 0.12.1默認是被編譯成與Hadoop的舊版本的,所以這邊需要重新編譯下Pig,運行如下命令,編譯時間比較長,耐心等待。參考時間:16min

ant clean jar-all -Dhadoopversion=23

否則運行Pig任務時,會有如下錯誤:

 Hadoop: java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected

然后,Pig是放在Hadoop集群上的,所以設置下HADOOP_HOME等環境變量

export HADOOP_HOME=/root/hadoop/hadoop-2.2.0
export PATH=$PATH:/root/hadoop/hadoop-2.2.0/bin

運行Pig的MapReduce模式,命令如下:

pig
或者:pig -x mapreduce

 

運行Pig程序示例

運行一個簡單的示例,就是把linux下的/etc/passwd文件的第一列提取出來輸出,用MapReduce模式跑,效果就是輸入所有用戶名

首先把/etc/passwd文件put到hadoop的hdfs上,命令如下

hadoop fs -put /etc/passwd /user/root/passwd

然后進入Pig shell,運行命令,以':'分隔提取A,然后把A的第一列放入B,dump打出B

[root@hadoop-namenodenew]# pig
grunt> A = load 'passwd' using PigStorage(':');
grunt> B = foreach A generate $0 as id;        
grunt> dump B;

輸出如下:

(省略幾萬字....)
Input(s):
Successfully read 29 records (1748 bytes) from: "hdfs://192.168.12.67:8020/user/root/passwd"

Output(s):
Successfully stored 29 records (325 bytes) in: "hdfs://192.168.12.67:8020/tmp/temp1558767875/tmp-1327634226"

Counters:
Total records written : 29
Total bytes written : 325
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0

Job DAG:
job_1401631066126_0005

(省略幾萬字....)

(root)
(bin)
(daemon)
(adm)
(lp)
(sync)
(shutdown)
(halt)
(mail)
(uucp)
(operator)
(games)
(gopher)
(ftp)
(nobody)
(dbus)
(vcsa)
(rpc)
(abrt)
(rpcuser)
(nfsnobody)
(haldaemon)
(ntp)
(saslauth)
(postfix)
(sshd)
(tcpdump)
(oprofile)
(riak)

 

Pig適用場景

Pig並不適合所有的數據處理任務,和MapReduce一樣,它是為數據批處理而設計的,如果想執行的查詢只涉及一個大型數據集的一小部分數據,Pig的實現不會很好,因為它要掃描整個數據集或其中很大一部分。

隨着新版本發布,Pig的表現和原生MapRedece程序差距越來越小,因為Pig的開發團隊使用了復雜、精巧的算法來實現Pig的關系操作。除非你願意花大量時間來優化Java MapReduce程序,否則使用Pig Latin來編寫查詢的確能幫你節約時間。

 

附錄:

執行Pig程序的方法

  • 腳本:Pig可以運行包含Pig命令的腳本文件,例如,pig script.pig,對於很短的腳本可以通過使用-e選項直接在命令行中輸入腳本字符串。
  • Grunt:Pig shell,就是上文的運行模式
  • 嵌入式方法:也可以在Java中運行Pig程序,和使用JDBC運行SQL程序很像,詳情:https://wiki.apache.org/pig/EmbeddedPig

 Pig與RDBMS、Hive比較

  • Pig Latin是一種數據流編程語言,而SQL是一種描述性編程語言。換句話說,Pig程序是相對於輸入的一步步操作,其中每一步是對數據的一個簡答的變換。相反,SQL語句是一個約束的集合,這些約束的集合在一起,定義了輸出。
  • 示例也可以看出,Pig其實是對Java的Mapreduce的封裝,進一步的抽象,運行的也是java程序,並在此基礎上提供其他特性。
  • Hive介於Pig和傳統RDBMS(關系數據庫管理系統Relational Database Management System)之間,Hive的設計目的是讓精通SQL既能的分析師能夠在存放在HDFS的大規模數據集上運行查詢。
  • Hive在很多方面和傳統數據庫類似,但是它底層對HDFS和MapReduce的依賴意味着它的體系結構有別於傳統數據庫。
  • Hive本身不存儲數據,完全依賴於HDFS和MapReduce,Hive可以將結構化的數據文件映射為一張數據庫表,Hive中表純邏輯,就是表的元數據。而HBase是物理表,定位是NoSQL。

 后記

  • 以上只是簡單介紹了下Pig,提供安裝和運行demo,也算是對自己知識面的擴充以及加深對Hadoo體系的了解。
  • 關於Pig多值和嵌套的數據結構,以及Join的關系操作都沒有涉及,如果后期有深入了解的必要,博文將繼續。。。

 

參考:

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

http://stackoverflow.com/questions/21300612/error-in-pig-while-loading-data

https://wiki.apache.org/pig/EmbeddedPig

《Hadoop權威指南》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM