Pig安裝及本地模式測試,體驗

Pig是Apache的一個開源項目,用於簡化MapReduce的開發。研究了一段時間,略有心得。系廢話很少說,咱們直接步入實際測試。 程序員

 Pig的運行有兩種模式,本地單擊模式和集羣模式。我目前只是測試學習,是爲了檢驗Pig的運行流程以及學習語法,不必使用分佈式模式,分佈式模式下也都是大同小異的。  shell

個人環境:  apache

   1. 系統: Ubuntu 12.04 64位  分佈式

   2. JDK:Oracle JDK1.7.0_15  grunt

   3. Pig:0.9.2  oop

和Apache其餘項目同樣,安裝Pig都很簡單,解壓到系統任意目錄,設置環境變量就能使用。 學習

export PIG_HOME=path
export PATH=$PATH:$PIG_HOME/bin

設置環境變量後註銷後登陸或者打開終端輸入:source /etc/profile 使新加入的環境變量生效 最後在終端中輸入:pig -version,正常應該出現以下字樣 測試

Warning: $HADOOP_HOME is deprecated.

Apache Pig version 0.9.2 (r1232772) 
compiled Jan 18 2012, 07:57:19
到這裏Pig的安裝算是成功了。(固然若是不成功檢查你的JDK安裝及環境變量是否正確) 如今你能夠輸入:

pig -x local
進入一個外殼程序。


學習Hadoop通常的入門都是Oreilly的《《Hadoop權威指南》》中文版,其中測試MapReduce的第一個程序就是統計一個文本文件中單詞出現的次數。Pig是爲了簡化MapReduce開發的,確定也是能實現這個的。我以這個爲例,寫一個測試的例子。  ui

我準備了一個文件,文件名爲:nie.txt 裏邊是一片普通的英文文章,比較長,大約52KB。  lua

我在本身的home下創建了一個workspace的文件夾,我是把它看成開始目錄的。(爲何說這個?由於Pig Load數據的時候相對路徑的起始文件路徑很重要,搞錯了就會出現文件找不到的錯誤。我開始就犯了這個錯誤) 

nie.txt文件的路徑爲: ~/workspace/nie.txt 而我進入Pig外殼程序的起始路徑是:~/workspace/ 下面是個人Pig腳本:

words = load 'nie.txt' using PigStorage(' ') as (line); --以空格做爲分隔符把內容分詞讀入
grpd = group words by line;     --以每一個單詞聚類,真實的是一個MapReduce的Map階段
cntd = foreach grpd generate group, COUNT(words); -- 這裏既上一步Map完成緊接着Reduce階段進行統計
dump cntd;  --直接在終端打印結果便於查看
把它保存到workspace命名爲test1.txt。咱們直接運行

pig -x local test1.pig
大約10多秒中通過大量的輸出,最終會獲得結果。

(So,1)
(We,1)
(as,7)
(at,1)
(be,3)
(he,2)
(if,1)
(in,12)
(is,10)
(it,9)
(no,2)
(of,21)
(on,3)
(or,1)
(so,1)
(to,11)
(us,2)
(we,1)
前面是單詞,後面是計數。固然個人結果很長,已經衝出終端了。

OK,咱們的第一個例子已經完美的運行了。下面我解釋一下代碼。

如上所見,Pig也支持註釋的,他的註釋方式有2中,

一種是SQL的註釋方式,如上面的--, --行後邊的內容都會忽略

另外一種是Java中的註釋方式, /* 註釋內容 */ ,它的註釋能夠一行也能夠跨行(Java的程序員是否是很友好?)。

另外Pig Latin[忘了介紹了,Pig的腳本有專業的名字,叫Pig Latin,不知道神碼意思]也是用;[分號]換行的,一條語句能夠寫在一行也能夠多行。Pig在運行前會檢查Pig Latin,而且對Pig Latin進行編譯,用以肯定程序邏輯和分析MapReduce。

若是程序有簡單邏輯錯誤,運行前都不會編譯經過。如我寫的時候把group words by line中的line意識的寫成了word,運行時出現了:

2013-04-13 22:21:12,619 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/zhenqin/workspace/pig_1365862872616.log
2013-04-13 22:21:12,713 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file:///
2013-04-13 22:21:13,225 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1025: 
 Invalid field projection. Projected field [word] does not exist in schema: line:bytearray.
Details at logfile: /home/zhenqin/workspace/pig_1365862872616.log
提示沒有定義word, 錯誤是否是也很友好? 哈哈。。。

下面我解釋一下我出現過的問題。我在起初測試時進入Pig時不是從workspace進入的,我是從pighome,以bin/pig運行的,而個人統計文件存儲在 ~/workspace/下,儘管我在Pig Latin腳本中使用了 load ‘/home/zhenqin/workspace/’或者 load ‘file:///home/zhenqin/workspace/’ 都報錯,沒法找到文件。爲此我糾結了很長時間。

原來Pig的外殼程序Grunt也是有當前路徑的。所以可使用cd 跳轉當前路徑。

如我從pighome下進入Grunt,執行ls命令出現以下:

grunt> ls
file:/opt/pig-0.9.2/testfile:/opt/pig-0.9.2/tutorialfile:/opt/pig-0.9.2/libfile:/opt/pig-0.9.2/ivyfile:/opt/pig-0.9.2/CHANGES.txt87506
file:/opt/pig-0.9.2/RELEASE_NOTES.txt2224
file:/opt/pig-0.9.2/LICENSE.txt11358
file:/opt/pig-0.9.2/conffile:/opt/pig-0.9.2/licensefile:/opt/pig-0.9.2/NOTICE.txt2120
file:/opt/pig-0.9.2/binfile:/opt/pig-0.9.2/build.xml77427
file:/opt/pig-0.9.2/pig-0.9.2.jar17585882
file:/opt/pig-0.9.2/README.txt1307
file:/opt/pig-0.9.2/ivy.xml13509
file:/opt/pig-0.9.2/scriptsfile:/opt/pig-0.9.2/pig-0.9.2-withouthadoop.jar6018058
固然上面的ls cd等命令都相似Linux的命名,如:chmod,chown,cp,mkdir,mv,cat,rm[至關於rm -R ]等。

它同時也支持Hadoop的一些命名,如: 

copyFromLocal localfile hdfsfile
copyToLocal   hdfsfile  localfile
在Pig 0.8以上的版本,輸入sh 後跟命令, 還能夠支持原生的Linux命令,如:

grunt> sh ls -l
總用量 6
-rw------- 1 zhenqin zhenqin 52220  2月  3  2012 nie.txt
-rw-rw-r-- 1 zhenqin zhenqin  2896  4月 13 22:03 pig_1365861790591.log
-rw-rw-r-- 1 zhenqin zhenqin  2896  4月 13 22:21 pig_1365862872616.log
-rw-rw-r-- 1 zhenqin zhenqin   443  4月 13 22:21 test1.pig
-rw-rw-r-- 1 zhenqin zhenqin   210  4月 12 21:35 test2.pig
-rw-rw-r-- 1 zhenqin zhenqin   245  4月 12 22:40 test3.pig
今天的測試寫到這裏,後邊的部分會陸續跟你們分享。 
相關文章
相關標籤/搜索