Pig Latin: A Not-So-Foreign Language for Data Processing

摘要

越来越多的公司需要分析每天产生的海量数据。也产生了很多平行数据库产品,然而它们的可扩展性的代价很高。

引言

程序员更偏向于使用过程化的代码或者是脚本,而不是声明式的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 其他命令

  1. UNION
  2. CROSS
  3. ORDER
  4. 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上执行。

你可能感兴趣的:(Pig Latin: A Not-So-Foreign Language for Data Processing)