PigLatin分析報告.doc
文本预览下载声明
Pig Latin简介
对海量数据的按需分析处理需求不断增加,尤其是对于因特网公司,它们的技术革新主要依赖于对每天收集的数据的分析处理能力。要提高如此巨大数据集的存储和分析效率,必须采用高度并行的系统,例如:shared-nothing cluster。并行数据库产品,如:Teradata 提供了一种解决方案,但是这种方案的web规模扩展开销太大,性价比不高,而且为程序员提供了一种不太自然的编程语言-SQL。
事实上很多程序员更加偏爱过程式程序设计语言,因为这种语言的数据流更加清晰,便于分析和调试。这也是map/reduce编程模型流行的原因之一。另外map/reduce的运行于普通商业硬件组成的集群,软件框架保证了可靠性和可用性,通过低端硬件实现了高性能计算,这也是map/reduce的优势所在。
尽管如此,map/?reduce也存在一些限制,它的单输入,两阶段数据流编程模式过于苛刻,对于超出该限制之外的数据分析任务,需要进行一些额外的数据转换。另外,它没有通用操作子,即使是对最通用的操作,如:projection和filtering。这些限制导致map/reduce代码重用性和可维护性不高,任务的分析语义不够清晰,将对系统性能优化造成影响。
基于以上问题,Yahoo!开发了一种新的基于数据流的大规模数据分析处理语言-Pig Latin,该语言借鉴了SQL和map/reduce两者的优点,既具有类似SQL的灵活可变式性,又有过程式语言的数据流特点。
首先以一个例子来直观感受Pig Latin的特点:
假设我们有一个表urls:(url,category,pagerank)
下面是一个简单的SQL查询,对每个足够大的分类,找出其包含的高pagerank的平均值。查询如下:
SELECT category,AVG(pagerank)
FROM urls WHERE pagerank0.2
GROUP BY category HAVING COUNT(*)106
与上述SQL等价的Pig Latin程序如下:
good_urls=FILTER urls BY pagerank0.2;
groups=GROUP good_urls BY category;
big_groups=FILTER groups BY COUNT(good_urls)106;
output=FOREACH big_groups GENERATE
category, AVG(good_urls.pagerank);
可见,Pig Latin是一种一步一步顺序执行的编程语言,每一步都完成一次数据转换。这种风格为很多程序员所喜爱。同时每步的转换也都是高级抽象,例如:filtering,grouping,aggregation,抽象级别类似于SQL。
事实上,Pig Latin程序更像是对查询执行计划的规范。因此更易于程序员理解和控制。Pig Latin的实现系统叫pig,Yahoo!的程序员使用pig对大规模数据进行分析处理。Pig Latin程序被编译为mapreduce作业,在hadoop上执行。
特点和动机
数据流语言
Pig Latin语言在编程风格上与SQL有明显差别,前者凸显了程序的执行数据流,后者只关注最终结果。SQL更适合于编程经验不丰富的程序员,适合小规模数据集;Pig Latin更适合有经验的程序员和大规模数据集。
尽管Pig Latin程序提供了显示的操作序列,但实际的执行计划不一定按照该顺序执行,编译器会根据一定的规则对执行顺序进行一定的优化。举例如下:
假设某人对类型为spam网页的url感兴趣,并且要求高pagerank,则实现为:
spam_urls=FILTER urls BY isSpam(url);
highPR_spam_urls=FILTER spam_urls BY pagerank0.8
按照上述给出的语句,程序会先找出所有的spam url,然后按照pagerank对spam url进行过滤。但是这种执行顺序可能是不高效的,尤其是当isSpam(url)是一个用户定义的大开销函数时。显然,这种情况下更高效的方式是先对全部url按照pagerank进行过滤,再对过滤后的url集合判别是否是spam_url,得出最终想要的结果集合。
快速开始和协同工作能力
Pig支持对各种存储格式的查询处理,前提是用户要给出特定的处理函数,该函数能够分析文件内容,提取需要的元组,因此Pig不需要像传统数据库管理系统那样在查询数据之前要花费大量时间导入数据。类似地,Pig程序的输出也会按照用户自定义函数将元组类型转换为特定格式的字节序列。这就简化了后续应用程序对Pig输出结果的使用,例如可视化应用程序或者类Exel的电子表格应用程序。
显示全部