(1) 安装Pig, 先下载Pig-0.9.2-tar.gz(本人hadoop版本是1.0.1),然后上传到hadoop集群/usr/目录下,然后解压:tar –xzf Pig-0.9.2-tar.gz,并重命名为pig;
(2) 在/etc/profile文件里面添加下面内容:
vim /etc/profile
#set pig path
export PIG_HOME=/usr/pig
export PATH=${PIG_HOME}/bin:${PATH}
export PIG_CLASSPATH=/usr/hadoop/conf (需要把hadoop/conf目录下的文件拷贝到pig/conf目录下,并添加classpath;由于本人的hadoop的classpath已经指向了hadoop的conf目录,所以可以不添加上面的黄色背景的一句,添加也不会错误!)
然后source /etc/profile 使其生效;
(3) 在/usr/pig/目录下 新建logs目录,mkdir logs;并修改文件vim pig.properties,在其中添加指向logs的路径:pig.logfile=/usr/pig/logs
(4) 然后测试pig配置是否成功:如下所示,证明基本上配置完成!
[[email protected] ~]$ pig
2015-03-25 18:56:41,348 [main] INFO org.apache.pig.Main - Logging error messages to: /usr/pig/logs/pig_1427281001347.log
2015-03-25 18:56:41,551 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://172.16.2.42:9000
2015-03-25 18:56:41,786 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: http://172.16.2.42:9001
grunt>
(5) 接下来就进行实战了:问题说明:由于电信公司一般把通话记录CDR存放在传统的关系数据库中,需要统计或者查询时,只需要简单的几条sql语句即可查找出来;但是随着数据量的不断增大,特别数据量达到海量级别时,如果还是从传统数据库来进行查找的话,将是非常费时的;由于查询可以分解为过滤,聚合,统计等步骤,用分布式(mapreduce)的方式来处理是十分适合的。
(6) 假设关系数据库有一个CDR对应的表CDR_TABLE,其字段分别为start_time(开始时间), end_time(结束时间),calling_number(主叫号码),called_number(被叫号码),cdr_type(通话类型);如下所示:每一行代表一条通话记录:
1312444562132 1312444580006 13712341234 13712341235 1
1312444159800 1312444170000 13712345678 10086 2
假设:查询任务是查询 开始时间是 XXX,被叫号码是10086,通话类型是2的通话记录;因为操作对每一条记录都是独立的,因此可以将表中所有数据存放在hdfs的一个文件cdr.txt中,由于cdr.txt在HDFS中是存放在多台计算机中,之间没有相关性,因此可以将计算分布到这些机器,从而减少数据转输的网络开销,达到高的吞吐量。存放后如下所示:
grunt> cat /user/hadoop/cdr.txt
1312444562132 1312444580006 13712341234 13712341235 1
1312444159800 1312444170000 13712345679 10086 2
1312544159800 1312554170000 13712345677 10086 2
1312644159800 1312654170000 13712345676 10086 2
1312744159800 1312764170000 13712345675 10086 2
1312844159800 1312854170000 13712345674 13552132453 2
1312944159800 1312974170000 13712345673 10086 2
1313444159800 1313454170000 13712345672 10086 2
1314444159800 1314544170000 13712345678 10086 2
grunt>
(7) 现在有pig来实现mapreduce的方法:
grunt> A = LOAD 'hdfs://172.16.2.42:9000/user/hadoop/cdr.txt' USING PigStorage('\t') AS (start_time:long, end_time:long,calling_number:long, called_number:long, cdr_type:int);
2015-03-25 19:27:58,624 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. name
Details at logfile: /usr/pig/logs/pig_1427282702115.log
grunt>
出现上述错误:经过google和baidu的尝试后也没能把问题解决,但是从中得到一个信息,就是有人说pig和hive安装在同一台机器上时,会引起一些冲突,但是没有说具体的解决方法;
经过一番的调试后,终于找出了问题的所在:为之前搭建hive环境并运行hive程序时,需要把hive/lib目录下的jar包拷贝到hadoop/lib目录下,然后在/etc/profile里面设置classpath路径指向hadoop/lib下面,这样估计引起了一些冲突,经过详细的排解,发现只需要把从hive拷贝到hadoop的一个jar包删除,即可把问题解决:这个jar包就是:antlr-runtime-3.0.1.jar,现在只需要把hadoop/lib目录下的这个包删除即可,这样既不影响hive的程序运行,也不运行pig程序的运行,执行下面命名:
[[email protected] lib]$ rm -r antlr-runtime-3.0.1.jar
删除后,重新执行pig程序:
grunt> A = LOAD 'hdfs://172.16.2.42:9000/user/hadoop/cdr.txt' USING PigStorage('\t') AS (start_time:long, end_time:long,calling_number:long, called_number:long, cdr_type:int);
grunt> B = FILTER A BY start_time > 1300835802 AND called_number ==10086 AND cdr_type ==2;
2015-03-25 20:13:00,021 [main] WARN org.apache.pig.PigServer - Encountered Warning IMPLICIT_CAST_TO_LONG 2 time(s).
grunt> STORE B INTO 'hdfs://172.16.2.42:9000/user/hadoop/CDR/cdr_result.txt' using PigStorage(); //输入这句后程序才真正运行起来,这完全是分布式,用户不需要关心mapreduce的具体实现方法,因为这是都有pig来实现,这大大降低了程序员的编程难度,显得人性化!
2015-03-25 20:14:42,788 [main] WARN org.apache.pig.PigServer - Encountered Warning IMPLICIT_CAST_TO_LONG 2 time(s).
。。。。。。
2015-03-25 20:14:45,026 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 1 map-reduce job(s) waiting for submission.
****hdfs://172.16.2.42:9000/user/hadoop/cdr.txt
。。。。。。
2015-03-25 20:15:10,767 [main] INFO org.apache.pig.tools.pigstats.SimplePigStats - Script Statistics:
HadoopVersion PigVersion UserId StartedAt FinishedAt Features
1.0.1 0.9.2 hadoop 2015-03-25 20:14:42 2015-03-25 20:15:10 FILTER
Success!
。。。。。。
2015-03-25 20:15:10,773 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!
查看hdfs上的输出结果:
grunt> cat /user/hadoop/CDR/cdr_result.txt
1312444159800 1312444170000 13712345679 10086 2
1312544159800 1312554170000 13712345677 10086 2
1312644159800 1312654170000 13712345676 10086 2
1312744159800 1312764170000 13712345675 10086 2
1312944159800 1312974170000 13712345673 10086 2
1313444159800 1313454170000 13712345672 10086 2
1314444159800 1314544170000 13712345678 10086 2
grunt>
运行成功!