pig简介

hadoop kda 744℃ 0评论

1.Pig

相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据变换操作,包括在MapReduce中被忽视的连接Join操作。
Pig包括两部分:

  • 用于描述数据流的语言,称为Pig Latin。
  • 用于执行Pig Latin程序的执行环境,当前有两个环境:单JVM中的本地执行环境和Hadoop集群上的分布式执行环境。

Pig内部,每个操作或变换是对输入进行数据处理,然后产生输出结果,这些变换操作被转换成一系列MapReduce作业,Pig让程序员不需要知道这些转换具体是如何进行的,这样工程师可以将精力集中在数据上,而非执行的细节上。
Pig提供了一种基于Hadoop的并行地执行数据流处理的引擎。它包含了一种脚本语言,称为Pig Latin,用来描述这些数据流。Pig Latin本身提供了许多传统的数据操作(如join,sort,filter等),同时允许用户自己开发一些自定义函数用来读取、处理和写数据。
Pig是一个Apache开源项目。这意味着用户可以免费下载源码或者二进制包,自由使用它,对这个项目贡献自己的代码,同时也可以在Apache License的许可范围下将Pig 用到自己产品中或者在需要的时候修改代码来满足特定需求。

2.Pig与hadoop

Pig运行于hadoop之上,它同时使用到hadoop分布式文件系统HDFS和hadoop处理系统MapReduce。
HDFS是一个分布式文件系统,它将文件存储到hadoop集群的各个节点上。它负责将文件分割成许多数据块然后分发到不同的节点机器上,其中包括对每个数据块进行多份冗余备份,这样可以避免因为某台机器宕掉而造成数据丢失。HDFS提供一种类似POSIX的用户交互形式给用户 。默认情况下,Pig从HDFS中读取输入文件,使用HDFS来存放Mapreduce任务所生成的中间数据,最终将输出写入HDFS中。
Mapreduce是一个简单而强大的并行数据处理算法。MapReduce计算框架的每个任务都由3个主要阶段组成:map阶段、shuffle阶段和reduce阶段。在map阶段,程序可以并行独立操作输入数据中的每一条记录。因为可以同时运行多个map任务,所以即使输入的数据量达到GB或者TB级别,只要有足够多的机器,map阶段通常在一分钟内就可以完成。
MapReduce任务的一个特别之处在于需要确定数据是根据哪个键进行收集的。例如,假设用户在处理一个网站的Web服务器日志,而且这个网站需要用户登录后才能操作,那么用户就可能会使用用户ID作为数据收集的键,因为通过这个用户ID作为数据收集的键,因为通过这个用户ID就可以知道每个用户在这个网站上的对应所有操作。map阶段后紧跟着就是shuffle阶段,在这个阶段数据已经根据用户指定的键收集起来并且分发到不同的机器上去了,这是为reduce阶段做准备,包含同一键的所有记录将会交由同一个reduce处理。
在reduce阶段,程序将提取每个键以及包含该键的所有记录。这个过程也是在多台机器上并行执行完成的。当处理完所有组时,reduce就可以写输出了。

Pig比直接使用Mapreduce有以下几个优势:

Pig Latin提供了所有标准的数据处理操作,例如join、filter、group by、order by、union等。MapReduce直接提供了group by操作(也就是shuffle和reduce两个阶段做好的事情),同时通过实现分组操作简介地提供了order by操作。过滤操作和推测执行操作可以在map阶段进行简单实现。但是其他的操作,特别是join操作无法提供,所以必须由用户自己进行代码实现。
Pig提供了一些对这些标准的数据操作的复杂的、完备的实现。例如,因为每个键对应的记录的个数是很少是均匀分布在集群中的,所以提交给reduce的数据经常会产生数据倾斜。也就是说,有的reduce需要比别的reduce处理10倍或更多的数据。Pig具有join和order by 操作可以处理这种情况,而且(在一些情况下)可以重新均衡reduce负荷。这些需要Pig团队花费好几个月的时间编写MapReduce程序,然后再重构代码,这些确实耗费时间。
在MapReduce中,在map阶段和reduce阶段的内部的数据处理对于系统来说是不透明的。这意味着MapReduce没有机会优化或者检查用户的代码。Pig另一方面,可以通过分析Pig Latin脚本来了解用户描述的数据流。这意味着Pig可以在早期进行错误检查(例如用户是否将一个string类型的字段放到一个integer类型的字段中?)和进行优化(例如这两个group操作是否可以合并?)
MapReduce没有一个类型系统,这是有意这么设计的,因为这样可以给用户更大的自由度去使用他们自己的数据类型和序列化框架。但这样就产生了一个不好的问题,就是限制了系统在运行前和运行时对用户代码进行检查的能力。
这几个方面都表明Pig Latin相对于MapReduce Java代码更容易编写和维护。当然Pig所带来的的这些便利同样是有代价的。通过MapReduce框架可以开发一些算法,在Pig中却很实现。同时对于开发者,他们需要放弃一个层次的控制权。一个优秀的工程师,只要给予足够的时间,总是可以将普通的系统做的足够好。因此,对于不常见的算法或者是对于性能要求很高的话,这种情况下使用MapReduce仍然是正确的选择。基本上这种情况也和选择Java编码而不选择使用像Python这样的脚本语言的情形是一样的。Java功能强大,但是因为它是高级程序语言,所以使用它开发需要比脚本语言花费更多的时间。开发者根据实际情况选择合适的工具。

pig的用途

Pig Latin的使用场景可以分为独立的三大类;传统的抽取转换加在(ETL)数据流、原生数据研究和迭代处理。
最大的使用场景就是数据流了。一个通常的例子就是网络公司从他们的Web服务器上收集到日志,进行数据清洗,之后进行简单的聚合预计算,然后倒入数据仓库中。在这种情况下,数据被加载到计算网格中,之后使用Pig从数据泥潭中清理出有价值的数据。同时还可以使用Pig将用户网页操作数据和用户数据库进行join连接,这样可以将用户cookie和已知的用户信息关联起来。
另外一个数据流应用例子是使用Pig离线数据来建立用户行为预测模型。pig被用来扫描所有用户和网站的交换数据,最终将用户分为各种各样的群组。然后对于每个群组会生成一个数据模型,根据该模型可以预知这个群组的用户对各种类型的广告或者新闻文章的反应是什么样子的。通过这种方式,网站可以知道展示什么样的广告可以更有可能获得更多的点击,或者发布什么样的新闻故事可以更有可能吸引用户和挽留客户再次访问。
传统上,使像SQL这样的语言执行点对点的查询可以快速地为问题准备好相应的数据。然而,对于原始数据的研究,一些用户还是偏向使用Pig Latin脚本。因为Pig可以在无模式,信息不全,或者模式不一致的情况下进行操作,同时因为Pig可以很容易地控制封装的数据,因此对于那些期望在数据没有进行清洗也没有写入数据仓库的情况下,分析数据的研究人员经常更偏好于使用Pig。经常处理大规模数据集的研究人员会使用像Perl或者Python这样的脚本语言进行处理。具有这些使用背景的用户通常更加喜欢使用Pig这样的数据流范式而非像SQL那样的声明式查询语言。
创建迭代处理用户模型的用户也开始使用Pig。假设有一个新闻门户网站,它保留了一个它跟踪的关于该网站的所有新闻故事的图。在这个图中,每个新闻故事都是一个节点,节点间的连线表示的是相关故事间的关系。例如,所有关于即将来临的选举的故事都是联系到一起的。每五分钟都有一组新的故事进来,这时数据处理引擎需要将这组故事增加到图中。这些故事中有一些是新的,有一些是对之前故事进行的更新,还有一些是替代之前已经存储的一些故事的。这时需要对整个故事图做一些数据处理步骤。例如,对于建立行为目的模型的处理过程就需要将用户数据和整个故事进行连接。每五分钟重新运行整个图是不可行的,因为对于适当数量的硬件资源来说在五分钟内运行出结果是不可能的。但是模型创建者不想只是每天更新一次这些模型,因为那意味着会错过一整天的时间来提供机会。
为了应付这个问题,有必要定期地首先对整个图进行连接,例如可以按照天来进行连接。然而,每五分钟一旦有数据进来,就可以立即完成对新进来的数据进行连接操作,同时这个结果可以对整个图做连接的结果整合在一起的,这个组合步骤并不容易,因为需要在五分钟内完成对整个图进行插入、更新和删除操作。使用Pig Latin来表达这种组合关系是可以的并且是相当方便的。
目前所说的一切都隐含着一点:Pig(与MapReduce一样)是面向数据批处理的。如果需要处理的是GB或者TB数量级的数据,那么Pig是个不错的选择。但是因为它期望的是序列地读取一个文件中的所有记录然后序列地将输出写入存储中,因此对于那些需要写单条或者少量记录,或者查询随机序列下的多条不同记录这样的任务,Pig(与MapReduce一样)并非是个好选择。

转载请注明:沐雨语曦 » pig简介

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址