大数据处理语言——Pig Latin:A Not-So-Foreign Language for Data Processing论文分享

1.背景介绍

本文是对《Pig Latin:A Not-So-Foreign Language for Data Processing》这篇论文的简要分享,内容同时参考了清华大学大数据相关课程。
上一篇博客分享了经典的MapReduce论文。大数据处理的整体逻辑是:可以采用SQL,Pig Latin和MapReduce等进行处理,以后可能也会有抽象层次更高的语言,目前来说,Pig Latin是比MapReduce更高层次的抽象。MapReduce模型有其自身的限制。它的单输入,两级数据流非常严格。为了执行具有不同数据流的任务,例如,连接(joins),必须设计相应的方法。此外,即使是最常见的操作,例如投影和过滤,也必须编写自定义代码。这些因素导致代码难以重用和维护,并且分析任务的语义模糊不清。此外,map和reduce函数的不透明性质阻碍了系统执行优化的能力。同时,数据的体量决定了数据集要在分布式系统上存储和处理。分布式数据库,如Teradata,Oracle RAC,Netezza等,提供了解决方案,但是花费昂贵。
此时,Pig Latin出现了。
pig的Logo
Pig Latin是由Yahoo!构建的一种编程语言。论文作者认为很多互联网公司中的产品创新围绕着大量数据集的收集和分析,例如收集网络爬虫、搜素日志分析和点击流分析等。谷歌、微软和雅虎等公司都有相应的例子。对数据的分析构成了产品改进的最内层循环。例如,如,搜索引擎排序算法工程师花费大量时间分析搜索日志,寻找可利用的趋势。Pig Latin为一种新型程序语言,其设计处于SQL的声明式风格和MapReduce的底层结构式风格之间。同时设计了相应的Pig系统,可以将Pig Latin进行编译。Pig的架构允许插入不同的系统作为Pig Latin的执行平台。当前的实现使用Hadoop,一个开源的,可扩展的map-reduce 实现,作为执行平台。Pig Latin程序被编译成map-reduce作业,并使用Hadoop执行。Pig及其Hadoop编译器是Apache孵化器中的一个开源项目,因此可供一般使用(可参考官网,https://pig.apache.org)。Pig的总体设计目标是吸引有经验的程序员对极大数据集进行特殊分析。重要的一点是,Pig只是Yahoo!丰富的“数据生态系统”中的众多应用之一。Pig更多是通过对驻留在外部的文件中的数据进行操作,而不是接管对数据的控制,Pig可以轻松地与Yahoo!生态系统中的其他应用程序进行互操作,这一点与DFS和MapReduce设计理念类似。

2.语言描述

用户定义函数(user-defined functions,UDF)是用java编写的。UDF被文章称为一等公民(First-Class Citizens)。同时,Yahoo!相关工程师也在构建支持任意语言(包括C/C++,Perl和Python)UDF接口。
Pig有丰富而简洁的数据模型,包括以下四个类型:

  1. Atom(原子值):一个atom包括一个简单的原子性值,如一个字符串或一个数值,例如,‘alice’

  2. Tuple(元组):Tuple是一系列字段,每个字段可以是任何数据类型,例如,(‘alice’,‘lakers’)。

  3. Bag(包):一个Bag是Tuple的集合,Tuple可能有重复。Bag中元组的模式是灵活的,即,并非Bag中的所有Tuple都需要具有相同数量和类型的字段

  4. Map(映射):Map是一个数据集合,数据中元素可以通过Key来查找,元素的模式可是灵活的,但是考虑查找的效率,key要求是原子性的。
    在这里插入图片描述

相关命令
明确输入数据:Load
Pig Latin程序的第一步是指定输入数据文件的内容,以及如何对文件内容进行反序列化,即转换为Pig的数据模型。假设输入文件包含一系列Tuple,即一个Bag。此步骤由LOAD命令执行。

		queries = LOAD ‘query_log.txt’
		USING myLoad()
		AS (userId,queryString,timestamp);

上述命令即以下三步:

  1. 输入文件为query_log.txt

  2. 输入文件应该通过用户的myLoad反序列化转化为tuple

  3. 装载的tuple有三个域:userId,queryString和timestamp

LOAD命令的返回值是一个Bag的句柄,在上面的例子中,它被分配给变量queries。

对每一个Tuple处理:FOREACH
一旦通过LOAD指定了输入数据文件,就可以指定需要对数据执行的处理。其中一个基本操作是对数据集的每个元组应用一些处理。这是通过FOREACH命令实现的。

		expanded_queries = FOREACH queries GENERATE
 		          	 userId, expandQuery(queryString);

丢弃不想要的数据:FILTER
另一个非常常见的操作是仅保留感兴趣的数据的一些子集,同时丢弃其余部分。此操作由FILTER命令完成。

		real_queries = FILTER queries BY userId neq ‘bot’;

Pig Latin中的过滤条件可能涉及表达式,比较运算符(如==,eq,!=,neq)和逻辑连接符AND,OR和NOT的组合。
输出命令:STORE
用户可以通过发出STORE命令,将结果转化为文件。

		STORE query_revenues INTO ‘myoutput’ USING myStore();

其他命令:Pig Latin有许多其他命令与SQL对应命令非常相似。UNION:返回两个或多个Bag的并集。CROSS:返回两个或多个Bag的点乘(Product,点乘可能不太准确)。ORDER:按字段指定Bag。DISTINCT:消除Bag中的重复Tuple

3.实现

  1. 构建Logical plan:当客户发出Pig Latin命令时,Pig解释器首先解析它,并验证命令引用的输入文件和包是否有效。Pig为用户定义的每个Bag构建了一个logical plan。当通过命令定义新的Bag时,通过组合输入Bag的logical plan和当前命令来构造新Bag的logical plan。请注意,构建logical plan时不执行任何处理。仅当用户在Bag上调用STORE命令时才会触发处理。此时,该Bag的logical plan被编译成physical plan,并被执行。这种lazy的执行方式是有益的,因为它允许内存流水线操作,以及其他优化,例如跨多个Pig Latin命令的filter重新排序。
  2. Map-Reduce Plan编译:将Pig Latin的logical plan编译为map-reduce作业非常简单。map-reduce本质上提供了执行大规模group by的能力,其中map任务为分组分配key,而reduce任务一次处理一个组。

4.使用场景

描述在Yahoo!执行的数据分析任务示例。仅在highlevel描述这些任务,无法提供真正的Pig Latin代码。

  1. Rollup aggregates(汇总聚合):使用Pig完成的常见处理任务涉及针对用户活动日志,Web爬虫和其他数据集,来计算各种汇总聚合。一个示例是计算在数天,数周或数月内聚合的搜索项的频率,以及IP地址所暗示的地理位置。一些任务需要两个或更多个连续的聚合传递,在这种情况下,Pig代表用户编排一系列多个map-reduce作业。使用Pig而不是数据库/ OLAP系统进行这些汇总分析的主要原因是搜索日志太大且连续无法加载到数据库中,因此仅作为(分布式)文件存在。Pig提供了一种直接在这些文件上直接计算此类聚合的简便方法,并且还可以轻松地合并自定义处理,例如IP到地理映射和n-gram提取。
  2. Session analysis(会话分析):在会话分析中,分析Web用户会话(即,用户进行的页面查看和点击的序列)以计算各种度量,例如:平均用户会话多长时间,用户在离开之前点击了多少链接和点击模式如何在一天/一周/一个月的过程中变化。此分析任务主要包括按用户和/或网站对活动日志进行分组,按时间戳对每个组中的活动进行排序,然后对此序列应用自定义处理。

5.相关工作

  1. Pig适用于以离线,特设,以扫描为中心的工作负载。有一系列大规模分布式系统提供类似数据库的功能,但是面向事务工作负载和/或点查找。Amazon的Dynamo,Google的BigTable和Yahoo!的PNUT都是例子。与Pig不同,这些系统构建的目的不是数据分析。BigTable确实有一些hooks,通过它可以使用map-reduce作业分析驻留在BigTable中的数据,但最终,分析引擎仍然是map-reduce。
  2. Pig的优化在后续的论文中提到,大致优化有:1.合并函数;2.偏斜数据的连接;3.多数据流优化等。
  3. 其他类似的框架:Sawzall,Hive和Dryad LINQ等,有兴趣的可以参考相关资料。

下一篇:Bigtable:A Distributed Storage System for Structured Data
Not today!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值