Pig是Apache的一个开源项目,用于简化MapReduce的开发。研究了一段时间,略有心得。系废话不多说,我们直接步入实际测试。
Pig的运行有两种模式,本地单击模式和集群模式。我目前只是测试学习,是为了检验Pig的运行流程以及学习语法,没必要使用分布式模式,分布式模式下也都是大同小异的。
我的环境:
1. 系统: Ubuntu 12.04 64位
2. JDK:Oracle JDK1.7.0_15
3. Pig:0.9.2
和Apache其他项目一样,安装Pig都很简单,解压到系统任意目录,设置环境变量就能使用。
2 |
export PATH=$PATH:$PIG_HOME/bin |
设置环境变量后注销后登录或者打开终端输入:source /etc/profile 使新加入的环境变量生效 最后在终端中输入:pig -version,正常应该出现如下字样
1 |
Warning: $HADOOP_HOME is deprecated. |
3 |
Apache Pig version 0.9.2 (r1232772) |
4 |
compiled Jan 18 2012, 07:57:19 |
到这里Pig的安装算是成功了。(当然如果不成功检查你的JDK安装及环境变量是否正确) 现在你可以输入:
进入一个外壳程序。
学习Hadoop一般的入门都是Oreilly的《《Hadoop权威指南》》中文版,其中测试MapReduce的第一个程序就是统计一个文本文件中单
词出现的次数。Pig是为了简化MapReduce开发的,肯定也是能实现这个的。我以这个为例,写一个测试的例子。
我准备了一个文件,文件名为:nie.txt 里边是一片普通的英文文章,比较长,大约52KB。
我在自己的home下建立了一个workspace的文件夹,我是把它当作开始目录的。(为什么说这个?因为Pig Load数据的时候相对路径的起始文件路径很重要,搞错了就会出现文件找不到的错误。我开始就犯了这个错误)
nie.txt文件的路径为: ~/workspace/nie.txt 而我进入Pig外壳程序的起始路径是:~/workspace/ 下面是我的Pig脚本:
1 |
words = load 'nie.txt' using PigStorage( ' ' ) as (line); |
2 |
grpd = group words by line; |
3 |
cntd = foreach grpd generate group, COUNT(words); |
把它保存到workspace命名为test1.txt。我们直接运行
大约10多秒中经过大量的输出,最终会得到结果。
前面是单词,后面是计数。当然我的结果很长,已经冲出终端了。
OK,我们的第一个例子已经完美的运行了。下面我解释一下代码。
如上所见,Pig也支持注释的,他的注释方式有2中,
一种是SQL的注释方式,如上面的--, --行后边的内容都会忽略
另一种是Java中的注释方式, /* 注释内容 */ ,它的注释可以一行也可以跨行(Java的程序员是不是很友好?)。
另外Pig Latin[忘了介绍了,Pig的脚本有专业的名字,叫Pig
Latin,不知道神码意思]也是用;[分号]换行的,一条语句可以写在一行也可以多行。Pig在运行前会检查Pig Latin,并且对Pig
Latin进行编译,用以确定程序逻辑和分析MapReduce。
如果程序有简单逻辑错误,运行前都不会编译通过。如我写的时候把group words by line中的line意识的写成了word,运行时出现了:
1 |
2013-04-13
22:21:12,619 [main] INFO org.apache.pig.Main - Logging error messages
to: /home/zhenqin/workspace/pig_1365862872616.log |
2 |
2013-04-13 22:21:12,713 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file :/// |
3 |
2013-04-13 22:21:13,225 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1025: |
4 |
Invalid field projection. Projected field [word] does not exist in schema: line:bytearray. |
5 |
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命令出现如下:
02 |
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 |
03 |
file :/opt/pig-0.9.2/RELEASE_NOTES.txt2224 |
04 |
file :/opt/pig-0.9.2/LICENSE.txt11358 |
05 |
file :/opt/pig-0.9.2/conffile:/opt/pig-0.9.2/licensefile:/opt/pig-0.9.2/NOTICE.txt2120 |
06 |
file :/opt/pig-0.9.2/binfile:/opt/pig-0.9.2/build.xml77427 |
07 |
file :/opt/pig-0.9.2/pig-0.9.2.jar17585882 |
08 |
file :/opt/pig-0.9.2/README.txt1307 |
09 |
file :/opt/pig-0.9.2/ivy.xml13509 |
10 |
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的一些命名,如:
1 |
copyFromLocal localfile hdfsfile |
2 |
copyToLocal hdfsfile localfile |
在Pig 0.8以上的版本,输入sh 后跟命令, 还可以支持原生的Linux命令,如:
3 |
-rw------- 1 zhenqin zhenqin 52220 2月 3 2012 nie.txt |
4 |
-rw-rw-r-- 1 zhenqin zhenqin 2896 4月 13 22:03 pig_1365861790591.log |
5 |
-rw-rw-r-- 1 zhenqin zhenqin 2896 4月 13 22:21 pig_1365862872616.log |
6 |
-rw-rw-r-- 1 zhenqin zhenqin 443 4月 13 22:21 test1.pig |
7 |
-rw-rw-r-- 1 zhenqin zhenqin 210 4月 12 21:35 test2.pig |
8 |
-rw-rw-r-- 1 zhenqin zhenqin 245 4月 12 22:40 test3.pig |
今天的测试写到这里,后边的部分会陆续跟大家分享。