hadoop 之pig

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

pig 也是hadoop中的一員,是爲了簡化原生的mapreduce,不用運行jar便可以做mapreduce,只需要輸入幾行命令表達式即可完成操作具體可看下面示例

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的關係操作都沒有涉及.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章