Pig安裝及簡單實例
前面講到了如何用MapReduce進行數據分析。當業務比較復雜的時候,使用MapReduce將會是一個很復雜的事情,比如你需要對數據進行很多預處理或轉換,以便能夠適應MapReduce的處理模式。另一方面,編寫MapReduce程序,發布及運行作業都將是一個比較耗時的事情。
Pig的出現很好的彌補了這一不足。Pig能夠讓你專心于數據及業務本身,而不是糾結于數據的格式轉換以及MapReduce程序的編寫。本質是上來說,當你使用Pig進行處理時,Pig本身會在后臺生成一系列的MapReduce操作來執行任務,但是這個過程對用戶來說是透明的。
Pig的安裝
Pig作為客戶端程序運行,即使你準備在Hadoop集群上使用Pig,你也不需要在集群上做任何安裝。Pig從本地提交作業,并和Hadoop進行交互。
1)下載Pig
前往http://mirror.bit.edu.cn/apache/pig/ 下載合適的版本,比如Pig 0.12.0
2)解壓文件到合適的目錄
tar –xzf pig-0.12.0
3)設置環境變量
export PIG_INSTALL=/opt/pig-0.12.0
export PATH=$PATH:$PIG_INSTALL/bin
如果沒有設置JAVA環境變量,此時還需要設置JAVA_HOME,比如:
export JAVA_HOME=/usr/lib/jvm/java-6-sun
4)驗證
執行以下命令,查看Pig是否可用:
pig –help
Pig執行模式
Pig有兩種執行模式,分別為:
1) 本地模式(Local)
本地模式下,Pig運行在單一的JVM中,可訪問本地文件。該模式適用于處理小規模數據或學習之用。
運行以下命名設置為本地模式:
pig –x local
2) MapReduce模式
在MapReduce模式下,Pig將查詢轉換為MapReduce作業提交給Hadoop(可以說群集 ,也可以說偽分布式)。
應該檢查當前Pig版本是否支持你當前所用的Hadoop版本。某一版本的Pig僅支持特定版本的Hadoop,你可以通過訪問Pig官網獲取版本支持信息。
Pig會用到HADOOP_HOME環境變量。如果該變量沒有設置,Pig也可以利用自帶的Hadoop庫,但是這樣就無法保證其自帶肯定庫和你實際使用的HADOOP版本是否兼容,所以建議顯式設置HADOOP_HOME變量。且還需要設置如下變量:
export PIG_CLASSPATH=$HADOOP_HOME/etc/hadoop
下一步,需要告訴Pig它所用Hadoop集群的Namenode和Jobtracker。一般情況下,正確安裝配置Hadoop后,這些配置信息就已經可用了,不需要做額外的配置。
Pig默認模式是mapreduce,你也可以用以下命令進行設置:
pig –x mapreduce
運行Pig程序
Pig程序執行方式有三種:
1) 腳本方式
直接運行包含Pig腳本的文件,比如以下命令將運行本地scripts.pig文件中的所有命令:
pig scripts.pig
2) Grunt方式
Grunt提供了交互式運行環境,可以在命令行編輯執行命令。
Grund同時支持命令的歷史記錄,通過上下方向鍵訪問。
Grund支持命令的自動補全功能。比如當你輸入a = foreach b g時,按下Tab鍵,則命令行自動變成a = foreach b generate。你甚至可以自定義命令自動補全功能的詳細方式。具體請參閱相關文檔。
3) 嵌入式方式
可以在java中運行Pig程序,類似于使用JDBC運行SQL程序。
Pig Latin編輯器
PigPen是一個Ecliipse插件,它提供了在Eclipse中開發運行Pig程序的常用功能,比如腳本編輯、運行等。下載地址:http://wiki.apache.org/pig/PigPen
其他一些編輯器也提供了編輯Pig腳本的功能,比如vim等。
簡單示例
我們以查找最高氣溫為例,演示如何利用Pig統計每年的最高氣溫。假設數據文件內容如下(每行一個記錄,tab分割):
1990 21
1990 18
1991 21
1992 30
1992 999
1990 23
以local模式進入pig,依次輸入以下命令(注意以分號結束語句):
records = load ‘/home/user/input/temperature1.txt’ as (year: chararray,temperature: int);
dump records;
describe records;
valid_records = filter records by temperature!=999;
grouped_records = group valid_records by year;
dump grouped_records;
describe grouped_records;
max_temperature = foreach grouped_records generate group,MAX(valid_records.temperature);
--備注:valid_records是字段名,在上一語句的describe命令結果中可以查看到group_records 的具體結構。
dump max_temperature;
最終結果為:
注意:
1)如果你運行Pig命令后報錯,且錯誤消息中包含如下信息:
WARN org.apache.pig.backend.hadoop20.PigJobControl- falling back to default JobControl (not using hadoop 0.20 ?)
java.lang.NoSuchFieldException:runnerState
則可能你的Pig版本和Hadoop版本不兼容。此時可重新針對特定Hadoop版本進行編輯。下載源代碼后,進入源代碼根目錄,執行以下命令:
ant clean jar-withouthadoop-Dhadoopversion=23
注意:版本號是根據具體Hadoop而定,此處23可用于Hadoop2.2.0。
2)Pig同一時間只能工作在一種模式下,比如以MapReduce模式進入后,只能讀取HDFS文件,如果此時你用load 讀取本地文件,將會報錯。