pig安装使用
介绍pig,一个不得不说的hadoop的扩展。
1.2 什么是pig
Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口。
1.3 pig的特点
1、专注于于大量数据集分析(ad-hoc analysis , ad-hoc 代表:a solution that has been custom designed for a specific problem );
2、运行在集群的计算架构上,Yahoo Pig 提供了多层抽象,简化并行计算让普通用户使用;这些抽象完成自动把用户请求queries翻译成有效的并行评估计划,然后在物理集群上执行这些计划;
3、提供类似 SQL 的操作语法;
4、开放源代码;
1.4 pig的主要用户
1、yahoo
2、twitter
1.5 关于pig和hive
对于开发人员,直接使用Java APIs可能是乏味或容易出错的,同时也限制了Java程序员在Hadoop上编程的运用灵活性。于是Hadoop提供了两个解决方案,使得Hadoop编程变得更加容易。
•Pig是一种编程语言,它简化了Hadoop常见的工作任务。Pig可加载数据、表达转换数据以及存储最终结果。Pig内置的操作使得半结构化数据变得有意义(如日志文件)。同时Pig可扩展使用Java中添加的自定义数据类型并支持数据转换。
•Hive在Hadoop中扮演数据仓库的角色。Hive添加数据的结构在HDFS(hive superimposes structure on data in HDFS),并允许使用类似于SQL语法进行数据查询。与Pig一样,Hive的核心功能是可扩展的。
Pig和Hive总是令人困惑的。Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及需要经常分析的工作。Hive与SQL相似促使 其成为Hadoop与其他BI工具结合的理想交集。Pig赋予开发人员在大数据集领域更多的灵活性,并允许开发简洁的脚本用于转换数据流以便嵌入到较大的 应用程序。Pig相比Hive相对轻量,它主要的优势是相比于直接使用Hadoop Java APIs可大幅削减代码量。正因为如此,Pig仍然是吸引大量的软件开发人员。
第2章 安装pig
2.1 下载pig
下载pig的最新版本:
http://www.apache.org/dyn/closer.cgi/pig
我下载的是pig-0.10.0.tar.gz
2.2 安装pig
解压缩
tar zxvf pig-0.10.0.tar.gz
进入目录
cd pig-0.10.0
注意,pig是hadoop的工具,所以不需要修改原hadoop的配置。
将pig加入到环境变量中:
输入
cd ~
进入到用户主目录
vi .bashrc
最下边加入环境变量的配置
保存然后执行
. .bashrc
输入 pig -help进行测试,如果设置成功,则出现如下界面
如果想获取pig的源码,可以使用svn下载
http://svn.apache.org/repos/asf/pig/trunk
2.3 配置hadoop
进入目录$PIG_HOME/conf
修改配置文件,在pig.properties中加入
fs.default.name=hdfs://localhost:9000
mapred.job.tracker=localhost:9001
指向本地伪分布式的hdfs和mapreduce
在本地运行pig
pig -x local
得到如下界面
和hadoop一起运行
直接输入pig或者pig -x mapreduce
有可能出现下面的错误
Cannot find hadoop configurations in classpath (neither hadoop-site.xml nor core-site.xml was found in the classpath).
需要配置~/.bashrc或者/etc/profile,建议配置.bashrc文件,加入
export HADOOP_HOME=/home/hadoop/hadoop-1.0.3
export PIG_CLASSPATH=$HADOOP_HOME/conf
配置完成后可正常进入
第二章使用
题目:请使用Pig latin语言处理access_log.txt日志,计算出每个IP的点击数。
我们看一下命令列表,下面是我们常用的pig latin语言
<EOF>
"cat" ...
"fs" ...
"sh" ...
"cd" ...
"cp" ...
"copyFromLocal" ...
"copyToLocal" ...
"dump" ...
"describe" ...
"aliases" ...
"explain" ...
"help" ...
"kill" ...
"ls" ...
"mv" ...
"mkdir" ...
"pwd" ...
"quit" ...
"register" ...
"rm" ...
"rmf" ...
"set" ...
"illustrate" ...
"run" ...
"exec" ...
"scriptDone" ...
"" ...
<EOL> ...
";" ...
grunt> pwd
hdfs://h1:9000/user/grid/pig
grunt> ls
hdfs://h1:9000/user/grid/pig/access_log.txt<r 2> 7118627 这就是我们要处理的文件
grunt> cat access_log.txt 我们来看一下文件的内容之后进行数据分析
119.146.220.12 - - [31/Jan/2012:23:59:51 +0800] "GET /static/js/jquery-1.6.js HTTP/1.1" 404 299 "http://f.dataguru.cn/forum.php?mod=forumdisplay&fid=53&page=1" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
119.146.220.12 - - [31/Jan/2012:23:59:52 +0800] "GET /static/js/floating-jf.js HTTP/1.1" 404 300 "http://f.dataguru.cn/forum.php?mod=forumdisplay&fid=53&page=1" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
119.146.220.12 - - [31/Jan/2012:23:59:55 +0800] "GET /popwin_js.php?fid=53 HTTP/1.1" 404 289 "http://f.dataguru.cn/forum.php?mod=forumdisplay&fid=53&page=1" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
119.146.220.12 - - [31/Jan/2012:23:59:55 +0800] "GET /static/js/smilies.js?AZH HTTP/1.1" 304 - "http://f.dataguru.cn/forum.php?mod=forumdisplay&fid=53&page=1" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
119.146.220.12 - - [31/Jan/2012:23:59:55 +0800] "GET /data/cache/common_smilies_var.js?AZH HTTP/1.1" 304 - "http://f.dataguru.cn/forum.php?mod=forumdisplay&fid=53&page=1" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
数据算法:
这是一部分dataguru上网日志,从日志内容结构看,ip地址是放在前面的,我们只要抽取出ip地址写入一张ip_text表,然后对ip列进行分组相当于分成若干个小表,每个ip集合为一个小表,再单独算出每个小表总行数即ip点击次数。
(1)加载HDFS文件系统中access_log.txt文件内容放到pig的一个关系(表)里,使用空格作为分隔符,只加载ip列即可。
grunt> ip_text = LOAD 'pig/access_log.txt' USING PigStorage(' ') AS (ip:chararray);
ip_text:代表一个关系,一个表,一个变量,这个表中存放了所有ip记录
LOAD 'pig/access_log.txt':要加载的文件
USING PigStorage(' '):使用空格作为分隔符
ip:chararray:表中第一列名ip,数据类型chararray字符型
(2)查看ip_text表结构与内容
一定要仔细,例如命令结尾符不要丢掉,当我们执行一条pig latin语句时,pig自动转换成MapReduce作业对用户来说是透明的,先创建一个jar包,再提交MR job,生成Hadoop job id在执行,最后显示结果!
grunt> DESCRIBE ip_text; 显示表的结构,只有一列,类型为字符型
ip_text: {ip: chararray}
grunt> DUMP ip_text; 显示表的内容,只截取部分内容
creating jar file Job2594979755419279957.jar
1 map-reduce job(s) waiting for submission
HadoopJobId: job_201210121146_0002
(119.146.220.12)
(180.153.227.41)
(180.153.227.44)
(180.153.227.44)
(180.153.227.44)
(221.194.180.166)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(220.181.94.221)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(119.146.220.12)
(3)对ip列进行分组,并查看分组后表的内容和结构,注意关键字大小写
把每个ip集合分成一个个小表,把分组后的结果存放在 group_ip 这个表中
grunt> group_ip = GROUP ip_text BY ip; 按照ip进行分组赋给group_ip表
grunt> DESCRIBE group_ip; 查看group_ip表结构
group_ip: {group: chararray,ip_text: {(ip: chararray)}}
我们一眼就看出group_ip表是一个嵌套表,第一个field是group,这就是分组后的ip值
第二个field是一个嵌套的小表又叫包,是前面分组ip的整个集合
grunt> DUMP group_ip; 又提交一个MR job运行
Pig script settings are added to the job Pig脚本自动转换MR job
creating jar file Job2785495206577164389.jar 创建jar包
jar file Job2785495206577164389.jar created jar包创建完毕
map-reduce job(s) waiting for submission. 提交job
HadoopJobId: job_201210121146_0003 job id:job_201210121146_0003
(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),(221.194.180.166),
(4)统计每个小表总行数即ip点击次数
grunt> count_ip = FOREACH group_ip GENERATE group,COUNT($1) AS count_ip;
FOREACH group_ip:逐行扫描group_ip表,赋给count_ip表
GENERATE group:读取分组ip值
COUNT($1) AS count_ip:统计嵌套小表(包)总行数即ip点击次数,把此列取别名叫count_ip方便倒序排列,$1统计第一列,等价于COUNT(ip_text.ip)
grunt> sort_count_ip = ORDER count_ip BY count_ip DESC; 按照count_ip列从大到小排序
# grunt> sort_count_ip = ORDER count_ip BY count_ip ASC; 从小到大排序
(5)查看sort_count_ip表结构和内容
grunt> DESCRIBE sort_count_ip; 显示表的结构,有二列
sort_count_ip: {group: chararray,count_ip: long} 第一个field是group字符型(分组ip值),第二个field是count_ip长类型(ip点击次数)
grunt> DUMP sort_count_ip; 显示表的内容,只截取部分结果,先输出统计信息后显示结果
HadoopVersion PigVersion UserId StartedAt FinishedAt Features
0.20.2 0.9.2 grid 2012-11-03 21:13:05 2012-11-03 21:18:39 GROUP_BY,ORDER_BY
Success!
Input(s):
Successfully read 28134 records (7118627 bytes) from: "hdfs://h1:9000/user/grid/pig/access_log.txt"
Output(s):
Successfully stored 476 records (14515 bytes) in: "hdfs://h1:9000/tmp/temp1703385752/tmp-1916755802"
Counters:
Total records written : 476
Total bytes written : 14515
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0
Job DAG:
job_201210121146_0004 -> job_201210121146_0005,
job_201210121146_0005 -> job_201210121146_0006,
job_201210121146_0006
(218.20.24.203,4597)
(221.194.180.166,4576)
(119.146.220.12,1850)
(117.136.31.144,1647)
(121.28.95.48,1597)
(113.109.183.126,1596)
(182.48.112.2,870)
(120.84.24.200,773)
(61.144.125.162,750)
(27.115.124.75,470)
(115.236.48.226,439)
(59.41.62.100,339)
(89.126.54.40,305)
(114.247.10.132,243)
(125.46.45.78,236)
(220.181.94.221,205)
(218.19.42.168,181)
(118.112.183.164,179)
(116.235.194.89,171)
(6)把sort_count_ip表内容写入HDFS文件系统中,即固化到硬盘存入文件
grunt> STORE sort_count_ip INTO 'pig/sort_count_ip';
Counters:
Total records written : 476
Total bytes written : 8051
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0
Job DAG:
job_201210121146_0007 -> job_201210121146_0008,
job_201210121146_0008 -> job_201210121146_0009,
job_201210121146_0009
2012-11-03 21:28:41,520 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!
当我们看到Success时就说明我们已经保存成功!
(7)查看保存在HDFS中的结果文件
grunt> ls
hdfs://h1:9000/user/grid/in <dir>
hdfs://h1:9000/user/grid/out1 <dir>
hdfs://h1:9000/user/grid/out2 <dir>
hdfs://h1:9000/user/grid/pig <dir>
grunt> cd pig
grunt> ls
hdfs://h1:9000/user/grid/pig/access_log.txt<r 2> 7118627
hdfs://h1:9000/user/grid/pig/sort_count_ip <dir>
grunt> cat sort_count_ip
218.20.24.203 4597
221.194.180.166 4576
119.146.220.12 1850
117.136.31.144 1647
121.28.95.48 1597
113.109.183.126 1596
182.48.112.2 870
120.84.24.200 773
61.144.125.162 750
27.115.124.75 470
115.236.48.226 439
59.41.62.100 339
89.126.54.40 305
114.247.10.132 243
125.46.45.78 236
220.181.94.221 205
218.19.42.168 181
118.112.183.164 179
116.235.194.89 171
综上我们圆满完成了本次任务
参考文献
http://f.dataguru.cn/forum.php?mod=viewthread&tid=27593&fromuid=303 casliyang
http://f.dataguru.cn/thread-26828-1-3.html sunev_yu
http://f.dataguru.cn/forum.php?mod=viewthread&tid=27866&fromuid=303 chengat1314
http://f.dataguru.cn/thread-27576-1-2.html camel21
http://www.cnblogs.com/siwei1988/archive/2012/07/23/2604710.html