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今天的測試寫到這裏,後邊的部分會陸續跟你們分享。