Pig安装及本地模式测试,体验

Stella981
• 阅读 338

Pig是Apache的一个开源项目,用于简化MapReduce的开发。研究了一段时间,略有心得。系废话不多说,我们直接步入实际测试。

 Pig的运行有两种模式,本地单击模式和集群模式。我目前只是测试学习,是为了检验Pig的运行流程以及学习语法,没必要使用分布式模式,分布式模式下也都是大同小异的。 

我的环境: 

   1. 系统: Ubuntu 12.04 64位 

   2. JDK:Oracle JDK1.7.0_15 

   3. Pig:0.9.2 

和Apache其他项目一样,安装Pig都很简单,解压到系统任意目录,设置环境变量就能使用。

export PIG_HOME=path
export PATH=$PATH:$PIG_HOME/bin

设置环境变量后注销后登录或者打开终端输入:source /etc/profile 使新加入的环境变量生效 最后在终端中输入:pig -version,正常应该出现如下字样

Warning: $HADOOP_HOME is deprecated.

Apache Pig version 0.9.2 (r1232772) 
compiled Jan 18 2012, 07:57:19

到这里Pig的安装算是成功了。(当然如果不成功检查你的JDK安装及环境变量是否正确) 现在你可以输入:

pig -x local

进入一个外壳程序。

Pig安装及本地模式测试,体验

学习Hadoop一般的入门都是Oreilly的《《Hadoop权威指南》》中文版,其中测试MapReduce的第一个程序就是统计一个文本文件中单词出现的次数。Pig是为了简化MapReduce开发的,肯定也是能实现这个的。我以这个为例,写一个测试的例子。 

我准备了一个文件,文件名为:nie.txt 里边是一片普通的英文文章,比较长,大约52KB。 

我在自己的home下建立了一个workspace的文件夹,我是把它当作开始目录的。(为什么说这个?因为Pig Load数据的时候相对路径的起始文件路径很重要,搞错了就会出现文件找不到的错误。我开始就犯了这个错误) 

nie.txt文件的路径为: ~/workspace/nie.txt 而我进入Pig外壳程序的起始路径是:~/workspace/ 下面是我的Pig脚本:

words = load 'nie.txt' using PigStorage(' ') as (line); --以空格作为分隔符把内容分词读入
grpd = group words by line;     --以每个单词聚类,真实的是一个MapReduce的Map阶段
cntd = foreach grpd generate group, COUNT(words); -- 这里既上一步Map完成紧接着Reduce阶段进行统计
dump cntd;  --直接在终端打印结果便于查看

把它保存到workspace命名为test1.txt。我们直接运行

pig -x local test1.pig

大约10多秒中经过大量的输出,最终会得到结果。

(So,1)
(We,1)
(as,7)
(at,1)
(be,3)
(he,2)
(if,1)
(in,12)
(is,10)
(it,9)
(no,2)
(of,21)
(on,3)
(or,1)
(so,1)
(to,11)
(us,2)
(we,1)

前面是单词,后面是计数。当然我的结果很长,已经冲出终端了。

OK,我们的第一个例子已经完美的运行了。下面我解释一下代码。

如上所见,Pig也支持注释的,他的注释方式有2中,

一种是SQL的注释方式,如上面的--, --行后边的内容都会忽略

另一种是Java中的注释方式, /* 注释内容 */ ,它的注释可以一行也可以跨行(Java的程序员是不是很友好?)。

另外Pig Latin[忘了介绍了,Pig的脚本有专业的名字,叫Pig Latin,不知道神码意思]也是用;[分号]换行的,一条语句可以写在一行也可以多行。Pig在运行前会检查Pig Latin,并且对Pig Latin进行编译,用以确定程序逻辑和分析MapReduce。

如果程序有简单逻辑错误,运行前都不会编译通过。如我写的时候把group words by line中的line意识的写成了word,运行时出现了:

2013-04-13 22:21:12,619 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/zhenqin/workspace/pig_1365862872616.log
2013-04-13 22:21:12,713 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file:///
2013-04-13 22:21:13,225 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1025: 
 Invalid field projection. Projected field [word] does not exist in schema: line:bytearray.
Details at logfile: /home/zhenqin/workspace/pig_1365862872616.log

提示没有定义word, 错误是不是也很友好? 哈哈。。。

下面我解释一下我出现过的问题。我在起初测试时进入Pig时不是从workspace进入的,我是从pighome,以bin/pig运行的,而我的统计文件存储在 ~/workspace/下,尽管我在Pig Latin脚本中使用了 load ‘/home/zhenqin/workspace/’或者 load ‘file:///home/zhenqin/workspace/’ 都报错,无法找到文件。为此我纠结了很长时间。

原来Pig的外壳程序Grunt也是有当前路径的。因此可以使用cd 跳转当前路径。

如我从pighome下进入Grunt,执行ls命令出现如下:

grunt> ls
file:/opt/pig-0.9.2/testfile:/opt/pig-0.9.2/tutorialfile:/opt/pig-0.9.2/libfile:/opt/pig-0.9.2/ivyfile:/opt/pig-0.9.2/CHANGES.txt87506
file:/opt/pig-0.9.2/RELEASE_NOTES.txt2224
file:/opt/pig-0.9.2/LICENSE.txt11358
file:/opt/pig-0.9.2/conffile:/opt/pig-0.9.2/licensefile:/opt/pig-0.9.2/NOTICE.txt2120
file:/opt/pig-0.9.2/binfile:/opt/pig-0.9.2/build.xml77427
file:/opt/pig-0.9.2/pig-0.9.2.jar17585882
file:/opt/pig-0.9.2/README.txt1307
file:/opt/pig-0.9.2/ivy.xml13509
file:/opt/pig-0.9.2/scriptsfile:/opt/pig-0.9.2/pig-0.9.2-withouthadoop.jar6018058

当然上面的ls cd等命令都类似Linux的命名,如:chmod,chown,cp,mkdir,mv,cat,rm[相当于rm -R ]等。

它同时也支持Hadoop的一些命名,如:

copyFromLocal localfile hdfsfile
copyToLocal   hdfsfile  localfile

在Pig 0.8以上的版本,输入sh 后跟命令, 还可以支持原生的Linux命令,如:

grunt> sh ls -l
总用量 6
-rw------- 1 zhenqin zhenqin 52220  2月  3  2012 nie.txt
-rw-rw-r-- 1 zhenqin zhenqin  2896  4月 13 22:03 pig_1365861790591.log
-rw-rw-r-- 1 zhenqin zhenqin  2896  4月 13 22:21 pig_1365862872616.log
-rw-rw-r-- 1 zhenqin zhenqin   443  4月 13 22:21 test1.pig
-rw-rw-r-- 1 zhenqin zhenqin   210  4月 12 21:35 test2.pig
-rw-rw-r-- 1 zhenqin zhenqin   245  4月 12 22:40 test3.pig

今天的测试写到这里,后边的部分会陆续跟大家分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Fossil book 中文版翻译
Fossil是一个集成了BUG跟踪以及WIKI的DVCS分布式版本控制系统,只有一运行程序且跨平台。使用简单,支持单用户及多用户模式。我目前将官方的Fossilbook翻译成中文,目的只是为了学习下Fossil,翻译是最好的方式之一了,同时也可以产生一个学习的副产品目前翻译托管在chiselapp.com(https://www.osc
Stella981 Stella981
2年前
Hadoop完整搭建过程(二):伪分布模式
1伪分布模式伪分布模式是运行在单个节点以及多个Java进程上的模式。相比起本地模式,需要进行更多配置文件的设置以及ssh、YARN相关设置。2Hadoop配置文件修改Hadoop安装目录下的三个配置文件:etc/hadoop/coresite.xmle
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Hadoop完整搭建过程(一):本地模式
1本地模式本地模式是最简单的模式,所有模块都运行在一个JVM进程中,使用本地文件系统而不是HDFS。本地模式主要是用于本地开发过程中的运行调试用,下载后的Hadoop不需要设置默认就是本地模式。2准备工作笔者喜欢把JDK放在/usr/local下,运行前请确保设置了JAVA_HOME,注
Wesley13 Wesley13
2年前
mysql select将多个字段横向合拼到一个字段
表模式:CREATE TABLE tbl_user (  id int(11) NOT NULL AUTO_INCREMENT,  name varchar(255) DEFAULT NULL,  age int(11) DEFAULT NULL,  PRIMARY KEY (id)
Wesley13 Wesley13
2年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
京东云开发者 京东云开发者
5个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了