转载请标明出处SpringsSpace: http://springsfeng.iteye.com
1. Pig简介
Pig是Yahoo捐献给apache的一个项目,它是SQL-like语言,是在MapReduce上构建的一种高级
查询语言,
把一些运算编译进MapReduce模型的Map和Reduce中,并且用户可以定义自己的功能。这是
Yahoo开发的又一个克隆Google的项目:Sawzall。
2. Pig 安装
(1) 确保JDK6已经安装,并且已经export JAVA_HOME;
(2) 下载最新版pig:0.11.0;
(3) 解压至/usr/custom/pig-0.11.0;
(4) 配置环境变量:
export PIG_HOME=/usr/custom/pig-0.11.0
export PATH=$PIG_HOME/bin:$PATH
3. 启动
Pig有两种模式:
(1) Local Mode, 即本地模式,这种模式下Pig运行在一个JVM里,访问的是本地的文件系统,
只适合于小规模数据集,一般是用来体验Pig。 而且,它并没有用到Hadoop的Local runner,
Pig把查询转换为物理的Plan,然后自己去执行。在终端下输入:
pig -x local
就可以进入Local模式了。
(2) Hadoop模式,这种模式下,Pig才真正的把查询转换为相应的MapReduce Jobs,并提交
到Hadoop集群去运行,集群可以是真实的分布式也可以是伪分布式。要想Pig能认识Hadoop,
你要告诉它Hadoop的版本以及一些关键daemon的信息(也就是Namenoder的Address和
Port)。比如,下面这个可以允许Pig连接到任何Hadoop0.20.*上:
export PIG_HADOOP_VERSION=20
针对HADOOP2.0.2是:
export PIG_HADOOP_VERSION=23
接下来,还要指明集群的Namenode的所在。有两种方法,
一种就是把你Hadoop的conf目录添加到Pig的Classpath上:
export PIG_CLASSPATH=$HADOOP_HOME/etc/hadoop
还有一种就是在Pig目录的conf文件夹(可能需要自己创建)里创建一个pig.properties文件,
然后在里面添加集群的Namenode和Jobtracker的信息:
fs.defaultFS=hdfs://localhost:9000
mapred.job.tracker=localhost:900
建议采用这种方式。
说明:经测试, 在pig-0.11.0版本基于Hadoop-2.0.2-aplha版本时,不需要做上述设置,直
接执行:
pig -x mapreduce
即进入伪分布式下。
启动:在终端中执行命令:pig
执行该命令时默认采用Hadoop模式,也可执行:pig -x mapreduce,该命令明确指明进入
分布式模式下。
4. 使用示例
(1) 上传文件
[kevin@linux-fdc bin]$ hadoop fs -mkdir /log
[kevin@linux-fdc bin]$ hadoop fs -copyFromLocal /usr/custom/pig-0.11.0/tutorial/data
/excite-small.log /log/excite-small.log
查看结果:
(2) 装载统计
grunt> log = LOAD '/log/excite-small.log' AS (user:chararray, time:long, query:chararray);
grunt> lmt = LIMIT log 4;
grunt> DUMP lmt;
grunt> grpd = GROUP log BY user;
grunt> cntd = FOREACH grpd GENERATE group, COUNT(log);
grunt> STORE cntd INTO '/log-output';
查看详细执行步骤:
grunt> illustrate cntd;
5.异常解决: 针对pig-0.11.0, pig-0.10.1版本。
直接下载pig-0.10.1.tar.gz和pig-0.11.0.tar.gz按照上述的配置在Hadoop2.0.2上运行时,
执行DUMP 或STORE命令时将产生异常:
解决方法:下面的解决方法是基于pig-0.10.1版本为基础的,pig-0.11.0的解决方案类似。
(1) cd /${PIG_HOME}
(2) mv pig-0.10.1-withouthadoop.jar pig-0.10.1-withouthadoop.jar.bak
(3) mv pig-0.10.1.jar pig-0.10.1.jar.bak
(4) ant clean jar-withouthadoop -Dhadoopversion=23
编译完成后将在${PIG_HOME}/build目录下生成:
pig-0.10.1-SNAPSHOT-core.jar, pig-0.10.1-SNAPSHOT-withouthadoop.jar
(5) 将上一步生成的两个文件Copy至${PIG_HOME}下,并进行改名:
pig-0.10.1-SNAPSHOT-core.jar --> pig-0.10.1.jar
pig-0.10.1-SNAPSHOT-withouthadoop.jar --> pig-0.10.1-withouthadoop.jar
(6) 此时运行"DUMP lmt;" 是,将抛出异常:
这个问题主要时因为我的笔记本内存较低的原因, 执行: illustrate cntd; 可看见运行结果是正确的: