摘要
越来越多的公司需要分析每天产生的海量数据。也产生了很多平行数据库产品,然而它们的可扩展性的代价很高。
引言
程序员更偏向于使用过程化的代码或者是脚本,而不是声明式的SQL语句
2. 特性及动机
2.1 数据流语言
过程化的,面向程序员的,数据流可控,中间结果可见
2.2 快速上手和通用性
只支持只读数据的处理,因此不需要类似数据库的事务一致性、索引查询的支持,支持直接导入平凡文本文件,这对于处理web log来说非常便利
2.3 嵌套数据模型
例如对于查询每个用户访问量前10的URL这样的请求,嵌套数据模型是极其便利的
2.4 第一公民UDFs
用户自定义函数可以使用在任何地方,而不像SQL中有诸多限制
2.5 并行性的要求
精心选取了容易实现并行性的原语
2.6 调试环境
新颖的高效的调试环境
3. PIG LATIN
在这节中,我们描述Pig Latin语言的细节。在3.1节中,我们描述数据模型及在后继子部分中说明Pig Latin的原则。本节的重点不是Pig Latin的语义细节,而是为了进一步说明在第二节中提到的设计目标及特征。并且这一节,仅关注语言原语,而不涉及到它们如何执行已获得在集群上的并行性。实现在第四节说明。
3.1 数据模型
Pig有一个丰富而简单的数据模型,包括以下四种类型
- 原子:一个原子包含一个简单原子值如string或者number,例如,'alice'
- 元组:元组是一系列的域,每一个域可以是任意的数据类型,例如,('alice','lakers')
- 包:包是元组的集合,元组可能重复,构成包的模式非常灵活,即,并不要求一个包中的所有元组有相同数量及类型的域,例如,公式略
- Map:Map是一系列数据对象的集合,每个对象有一个关联键值,方便查询,键值只能是原子类型;Map对于经常需要增加字段的情景非常适用
3.2 指定输入数据:LOAD
Pig Latin的第一步是指定数据文件,对数据文件的分词程序,即如何将数据转换为Pig Latin的数据模型。这是LOAD命令的作用。如果没有提供分词程序,Pig Latin也有默认实现。
3.3 每元组处理:FOREACH
对每一元组的操作可以使用FOREACH命令
3.4 丢弃不想要数据:FILTER
顾名思义,通过某些条件,选出想要的数据
3.5 聚合相关联的数据:COGROUP
用于不同数据集,即按某共同属性,聚合数据之后,再做相应处理
3.5.1 COGROUP的特例:GROUP
即单一数据集
3.5.2 Pig Latin中的JOIN
实际上是COGROUP命令结果的FLATTEN后的形式
3.5.3 Pig Latin中的Map-Reduce
有了GROUP和FOREACH命令,在Pig Latin中非常容易表达一个map-reduce程序。
3.6 其他命令
- UNION
- CROSS
- ORDER
- DISTINCT
3.7 嵌套操作
3.8 请求输出:STORE
提供自定义输出函数,即如何输出元组
4. 实现
Pig Latin完全由我们的系统Pig实现。Pig是一个允许不同系统被插入作为Pig Latin执行平台的架构。当前的实现使用了开源可扩展的map-reduce实现Hadoop作为执行平台。Pig Latin程序被编译为Map-reduce job,使用Hadoop执行。Pig,以及它的Hadoop编译器是Apache incubator上的开源项目,因此可供大众使用。
4.1 建立逻辑计划
Pig首先将Pig Latin编译为逻辑计划,处理过程只有在STORE命令被调用时,才会被触发
4.2 Map-Reduce计划编译
以(CO)GROUP命令为界,前半部分作为Map任务,后半部分作为Reduce任务;而两个(CO)GROUP之间的命令,当前Pig实现为作为前一个命令的Reduce,因为一般Reduce阶段会减少数据量。
ORDER命令被编译为两个阶段,第一个阶段找出排序键值的中位数,第二阶段利用中位数,进行分区划分,随后本地排序;最后归并为全局排序
4.3 嵌套包的有效性
毋庸置疑,Pig Latin执行过程中会有大量的中间结果,因此会有溢出内存的情况;当然很多情况下,这些中间结果只是逻辑上的因此并不一定占用空间,当确实出现超出内存的情况时,Pig Latin也允许中间结果写入磁盘,使用的是类似数据库的排序算法。
5. 调试环境
Pig Pen是一个可视化的Pig Latin执行环境,供程序员观察Pig Latin语义是否与期望一致
5.1 产生沙箱数据集
Pig Pen底层使用了一系列算法,保证测试数据集的真实性,简洁性及完备性,有效的提高了大数据环境下的调试效率
6. 使用场景
- 汇总聚合
- 临时分析
- 会话分析
7. 相关工作
- BigTable
Bigtable有hook,不仅可以存储数据,而且在bigtable中的数据可以使用Map Reduce作业分析,分析的引擎仍然是map reduce,仍然有以上说的map recude的缺点。
- Dryad
Dryad是由微软开发的分布式的平台,提供的大规模并行处理,容错执行任务。
比map reduce更灵活是因为它允许任意计算的执行,可以表示为有向无环图。但是Dryad有自己的高级语言,DryadLINQ。很多程序员都不熟悉这个语言的特点,也导致了它流行不起来。
- Sawzall
Sawzall是谷歌用在map-reduce层上的一种脚本语言。跟map-reduce一样,Sawzall也有严格的组织习惯。此外,只有过滤阶段可由用户写入,只有一个预先建立的集聚合可用。而pig-latin也有类似的更高层次的原语,如过滤和聚合,可以灵活链接这些。
8. 未来工作
- 安全优化
我们需要的是一个“安全”的优化,执行优化时,不影响语义。
- 用户界面
Pig pen朝用户界面增强迈出了第一步。可以有一个用户图形界面观察指定的Pig Latin程序。
- 外部功能
现在Pig Latin只支持java。很多用户希望它支持python,perl等。
- 统一的环境
用户在执行pig latin时现在必须处理三种不同的环境:
(a)程序的pig latin命令嵌入
(b)pig latin的环境来了解pig latin的命令,
(c)用来编写UDF环境的编程语言。
我们正在探索具有单一的思想,统一的环境,支持发展在所有三个层次。
9. 总结
我们描述了在Yahoo!上部署的一个新的数据处理环境Pig,及它相关联的语言,Pig Latin。Pig系统编译Pig Latin表达式为一系列map-reduce job,并且精心实现使这些任务在开源可扩展的map-reduce Hadoop上执行。