Pig是一种探索大规模数据集的脚本语言。MapReducer的一个主要的缺点就是开发的周期太长了。我们要编写mapper和reducer,然后对代码进行编译打出jar包,提交到本地的JVM或者是hadoop的集群上,最后获取结果,这个周期是非常耗时的,即使使用Streaming(它是hadoop的一个工具,用来创建和运行一类特殊的map/reduce作业。所谓的特殊的map/reduce作业可以是可执行文件或脚本本件(python、PHP、c等)。Streaming使用“标准输入”和“标准输出”与我们编写的Map和Reduce进行数据的交换。由此可知,任何能够使用“标准输入”和“标准输出”的编程语言都可以用来编写MapReduce程序)能在这个过程中除去代码的编译和打包的步骤,但是这一个过程还是很耗时,Pig的强大之处就是他只要几行Pig Latin代码就能处理TB级别的数据。Pig提供了多个命令用于检查和处理程序中的数据结构,因此它能很好的支持我们写查询。Pig的一个很有用的特性就是它支持在输入数据中有代表性的一个小的数据集上试运行。所以。我们在处理大的数据集前可以用那一个小的数据集检查我们的程序是不是有错误的。
Pig为大型的数据集的处理提供了更高层次的抽象。MapReducer能够让我们自己定义连续执行的map和reduce函数,但是数据处理往往需要很多的MapReducer过程才能实现,所以将数据处理要求改写成MapReducer模式是很复杂的。和MapReducer相比,Pig提供了更加丰富的数据结构,一般都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据交换操作,包括了MapReducer中被忽视的”join“操作
Pig 被设计为可以扩展的,处理路径上的每一个部分,载入,存储,过滤,分组,连接,都是可以定制的,这些操作都可以使用用户定义函数(user-defined function,UDF)进行修改,这些函数作用于Pig的嵌套数据模型。因此,它们可以在底层与Pig的操作集成,UDF的另外的一个好处是它们比MapReducer程序开发的库更易于重用。
但是。Pig并不适合处理所有的“数据处理”任务。和MapReducer一样,它是为数据批处理而设计的,如果想执行的查询只涉及一个大型数据集的一小部分数据,Pig的实现不是很好,因为它要扫描整个数据集或其中的很大一部分。
Pig包括两部分
1:用于描述数据流的语言,称为Pig Latin(拉丁猪,个人翻译)
2:用于运行PigLatin程序的执行环境。一个是本地的单JVM执行环境,一个就是在hadoop集群上的分布式执行环境。
Pig Latin程序是由一系列的”操作”(operation)或”变换”(transformation)组成。每个操作或变换对输入进行数据处理,然后产生输出的结果。这些操作整体上描述了一个数据流,Pig执行的环境把数据流翻译为可执行的内部表示,并运行它。在Pig的内部,这些变换和操作被转换成一系列的MapReducer,但是我们一般情况下并不知道这些转换是怎么进行的,我们的主要的精力就花在数据上,而不是执行的细节上面。
在有些情况下,Pig的表现不如MapReducer程序。总结为一句就是要么话花大量的时间来优化Java MapReducer程序,要么使用Pig Latin来编写查询确实能节约时间。