Hadoop Pig简介、安装、试用

时间:2022-05-22 17:21:51

相比Java的MapReduce api,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据变换操作,包括在MapReduce中被忽视的连接Join操作。

 Hadoop版本:2.2.0

 Pig版本:0.12.1

 

Pig介绍

Pig包括两部分:

  • 用于描述数据流的语言,称为Pig Latin。
  • 用于执行Pig Latin程序的执行环境,当前有两个环境:单JVM中的本地执行环境和Hadoop集群上的分布式执行环境。

 Pig内部,每个操作或变换是对输入进行数据处理,然后产生输出结果,这些变换操作被转换成一系列MapReduce作业,Pig让程序员不需要知道这些转换具体是如何进行的,这样工程师可以将精力集中在数据上,而非执行的细节上。

 

安装Pig

好,作为一切的开始,我们先安装一个Pig环境。

从http://hadoop.apache.org/pig/releases.html下载稳定版本,当前稳定版本是0.12.1,然后解压到任意目录,并且修改环境变量

tar xzf pig-0.12.1.tar.gz

export PIG_INSTALL
=/root/pig/pig-0.12.1
export PATH
=$PATH:$PIG_INSTALL/bin

 

本地模式

Grunt是Pig的外壳程序(shell)。本地模式下,Pig运行在单个JVM中,访问本地文件系统,该模式用于测试或处理小规模数据集

[root@hadoop-namenodenew pig]# pig -x local
grunt
>

 

MapReduce模式

在MapReduce模式下,Pig将查询翻译为MapReduce作业,然后在Hadoop集群上执行。Pig版本和Hadoop版本间,有要求,笔者这边的版本如下

Hadoop 2.2.0
Pig
0.12.1

注意:Pig 0.12.1默认是被编译成与Hadoop的旧版本的,所以这边需要重新编译下Pig,运行如下命令,编译时间比较长,耐心等待。参考时间:16min

ant clean jar-all -Dhadoopversion=23

否则运行Pig任务时,会有如下错误:

 Hadoop: java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected

然后,Pig是放在Hadoop集群上的,所以设置下HADOOP_HOME等环境变量

export HADOOP_HOME=/root/hadoop/hadoop-2.2.0
export PATH
=$PATH:/root/hadoop/hadoop-2.2.0/bin

运行Pig的MapReduce模式,命令如下:

pig
或者:pig
-x mapreduce

 

运行Pig程序示例

运行一个简单的示例,就是把linux下的/etc/passwd文件的第一列提取出来输出,用MapReduce模式跑,效果就是输入所有用户名

首先把/etc/passwd文件put到hadoop的hdfs上,命令如下

hadoop fs -put /etc/passwd /user/root/passwd

然后进入Pig shell,运行命令,以':'分隔提取A,然后把A的第一列放入B,dump打出B

[root@hadoop-namenodenew]# pig
grunt
> A = load 'passwd' using PigStorage(':');
grunt
> B = foreach A generate $0 as id;
grunt
> dump B;

输出如下:

(省略几万字....)
Input(s):
Successfully read
29 records (1748 bytes) from: "hdfs://192.168.12.67:8020/user/root/passwd"

Output(s):
Successfully stored
29 records (325 bytes) in: "hdfs://192.168.12.67:8020/tmp/temp1558767875/tmp-1327634226"

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

Job DAG:
job_1401631066126_0005

(省略几万字....)

(root)
(bin)
(daemon)
(adm)
(
lp)
(
sync)
(shutdown)
(halt)
(mail)
(uucp)
(operator)
(games)
(gopher)
(
ftp)
(nobody)
(dbus)
(vcsa)
(rpc)
(abrt)
(rpcuser)
(nfsnobody)
(haldaemon)
(ntp)
(saslauth)
(postfix)
(sshd)
(tcpdump)
(oprofile)
(riak)

 

Pig适用场景

Pig并不适合所有的数据处理任务,和MapReduce一样,它是为数据批处理而设计的,如果想执行的查询只涉及一个大型数据集的一小部分数据,Pig的实现不会很好,因为它要扫描整个数据集或其中很大一部分。

随着新版本发布,Pig的表现和原生MapRedece程序差距越来越小,因为Pig的开发团队使用了复杂、精巧的算法来实现Pig的关系操作。除非你愿意花大量时间来优化Java MapReduce程序,否则使用Pig Latin来编写查询的确能帮你节约时间。

 

附录:

执行Pig程序的方法

  • 脚本:Pig可以运行包含Pig命令的脚本文件,例如,pig script.pig,对于很短的脚本可以通过使用-e选项直接在命令行中输入脚本字符串。
  • Grunt:Pig shell,就是上文的运行模式
  • 嵌入式方法:也可以在Java中运行Pig程序,和使用JDBC运行SQL程序很像,详情:https://wiki.apache.org/pig/EmbeddedPig

 Pig与RDBMS、Hive比较

  • Pig Latin是一种数据流编程语言,而SQL是一种描述性编程语言。换句话说,Pig程序是相对于输入的一步步操作,其中每一步是对数据的一个简答的变换。相反,SQL语句是一个约束的集合,这些约束的集合在一起,定义了输出。
  • 示例也可以看出,Pig其实是对Java的Mapreduce的封装,进一步的抽象,运行的也是java程序,并在此基础上提供其他特性。
  • Hive介于Pig和传统RDBMS(关系数据库管理系统Relational Database Management System)之间,Hive的设计目的是让精通SQL既能的分析师能够在存放在HDFS的大规模数据集上运行查询。
  • Hive在很多方面和传统数据库类似,但是它底层对HDFS和MapReduce的依赖意味着它的体系结构有别于传统数据库。
  • Hive本身不存储数据,完全依赖于HDFS和MapReduce,Hive可以将结构化的数据文件映射为一张数据库表,Hive中表纯逻辑,就是表的元数据。而HBase是物理表,定位是NoSQL。

 后记

  • 以上只是简单介绍了下Pig,提供安装和运行demo,也算是对自己知识面的扩充以及加深对Hadoo体系的了解。
  • 关于Pig多值和嵌套的数据结构,以及Join的关系操作都没有涉及,如果后期有深入了解的必要,博文将继续。。。

 

参考:

http://pig.apache.org/docs/r0.12.1/start.html

http://*.com/questions/21300612/error-in-pig-while-loading-data

https://wiki.apache.org/pig/EmbeddedPig

《Hadoop权威指南》