Hadoop生态圈之Pig

简介

Pig是一个基于Hadoop的大规模数据分析工具,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。[1]
相比Java的MapReduce api,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据变换操作,包括在MapReduce中被忽视的连接Join操作。[2]

使用的版本
hadoop:2.7.4
pig:0.16.0

配置

1、下载
http://mirrors.shuosc.org/apache/pig/pig-0.16.0/
我这里下载的是0.16.0,目前最新的是0.17.0
2、解压到适当目录后,配置环境变量
PIG_HOME 值是pig的根目录
PIG_CLASSPATH 值是hadoop目录下的etc/hadoop
PTAH 值是pig的bin目录
3、输入pig,默认是执行的mapreduce类型
可以选择执行类型,local和mapreduce以及tez

pig -x, -exectype - Set execution mode: local|mapreduce|tez, default is mapreduce.

local模式

1、建立pig测试文件夹,启动pig shell 本地模式

这里写图片描述

2、password文件内容

这里写图片描述

3、统计当前工作目录下password文件中用户

这里写图片描述

核心命令

grunt> A = load 'password' using PigStorage(':');

grunt> B = foreach A generate $0 as id;

grunt> dump B;

4、统计结果

这里写图片描述

命令参考:Hadoop Pig安装及测试

mapreduce模式

这是pig的默认模式,在终端如果只输入pig就会以mapreduce运行
试着在这个模式上执行上面的核心命令,会报错

Failed!

Failed Jobs:
JobId   Alias   Feature Message Outputs
job_1510640240196_0008  A,B MAP_ONLY    Message: Job failed!    hdfs://192.168.31.40:9000/tmp/temp-1299691098/tmp835924451,

Input(s):
Failed to read data from "hdfs://192.168.31.40:9000/user/liuxunming/password"

Output(s):
Failed to produce result in "hdfs://192.168.31.40:9000/tmp/temp-1299691098/tmp835924451"

Counters:
Total records written : 0
Total bytes written : 0
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0

Job DAG:
job_1510640240196_0008


2017-11-27 16:01:18,715 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Failed!
2017-11-27 16:01:18,723 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias B
Details at logfile: /Users/liuxunming/pigtest/pig_1511769651826.log

(注:192.168.31.40 这个是我本地的局域网ip,因为刚开始测试pig是在本地伪分布式环境下测试的)
有人说是因为jobtracker没有启动导致的,然而我这里是hadoop 2.7.4版本,已经不存在这个进程
后来在csdn bbs论坛里搜到一篇自问自答到帖子,他也遇到里同样的问题,解决方法就是换了hadoop的版本就行
然后我就换了公司集群 2.6.5 版本的hadoop上去尝试,结果确实不报这个错误了,报了historyserver进程未启动的错误

mr-jobhistory-daemon.sh start historyserver

之后就如第一种模式的运行结果一样,执行成功
至此Pig初步试用完毕
后续:今天在本地测试了wordcount发现也报同样类型的错误,就是在作业管理界面的logs里,都是说找不到java,所以说上面的问题可能不是hadoop的问题,至少目前来说,本地的单机hadoop都无法正常运行官方示例程序。

/bin/bash: /bin/java: No such file or directory

在stackoverflow上搜到同样的错误,他的解决方法是更改hadoop-env.sh中的java_home为绝对路径[4]

This was solved when I kept hard coded paths in hadoop-env.sh for JAVA_HOME and JAVA. Though these environment variables are set, somehow Hadoop fails to recognize them.

然而对于我这里的问题并没有效果

经典案例

wordcount[3]

a = LOAD '111.txt' as (line:chararray); 
words = FOREACH a GENERATE flatten(TOKENIZE(line)) as w; 
g = GROUP words by w;
wordcount = FOREACH g GENERATE group,COUNT(words); 
dump a

其中输入文件为存放在hdfs上/user/root目录下的一个名为111.txt的文件,文件具体内容如下

www.flyertea.com hm.baidu.com
www.flyertea.com eclick.baidu.com
www.flyertea.com eclick.baidu.com
pos.baidu.com www.flyertea.com
www.flyertea.com hm.baidu.com rec.m.sm.cn
www.flyertea.com
eclick.baidu.com

最终执行结果如下

(rec.m.sm.cn,1)
(hm.baidu.com,2)
(pos.baidu.com,1)
(eclick.baidu.com,3)
(www.flyertea.com,6)

我们再看一下普通的mapreduce的执行情况

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /user/root/111.txt /xm/112901

普通的mapreduce执行结果

eclick.baidu.com    3
hm.baidu.com    2
pos.baidu.com   1
rec.m.sm.cn 1
www.flyertea.com    6

其实归根结底,pig最后也转化成mapreduce运行的
观察Hadoop Cluster Metrics 作业管理界面
发现两种方式的执行耗时基本一致,上例pig耗时18秒,mr耗时14秒
pig执行完成后直接显示结果,不像mr还得手动cat结果才行,总之各有千秋。

猜你喜欢

转载自blog.csdn.net/diyangxia/article/details/78663260
今日推荐