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

posted @ 2013-01-06 15:42  xinyonde  阅读(745)  评论(0编辑  收藏  举报