分享

Pig在风暴中飞翔——Pig On Storm

yuwenge 发表于 2015-5-23 18:26:40 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 17082
本帖最后由 yuwenge 于 2015-5-23 18:28 编辑
问题导读

1.Pig On Storm的实现思路是什么?
2.Pig On Storm编译Pig代码包含哪些流程?
3.实现Pig On Storm面临哪些挑战?
4.如何实现Pig On Storm编程?






1、以PigOnStorm直面实时应用开发面的挑战
在TRC(Tencent Realtime Computing)系统中TDProcess负责为各个应用提供实时计算的能力和服务,Storm是TDProcess的核心部件,虽然Storm已经成为开源流式计算领域的实际标准,但其生态系统远没有Hadoop完善,在Storm之上没有像Hive、Pig这类解放应用开发人员的效率提升工具,所以当你决定使用Storm来实现某个应用时,必须首先去熟悉Storm的原理以及API,然后才能基于API编写程序。
熟悉Hadoop的应用开发人员可能有这样的感受,对于一般的数据分析应用,用Hive或者Pig去编写程序,比直接用MapReduce效率要高很多,后期程序维护过程中修改Hive、Pig脚本也比MapReduce程序简单很多。因此在Storm之上提供一门高度抽象的编程语言,其对应用开发效率的提升将不亚于Hive SQL、Pig Latin之于MapReduce,在带来成倍的开发效率提升的同时也降低了应用开发的门槛。

2、Pig On Storm的实现
2.1 Pig On Storm VS Hive On Storm
Pig和Hive对开发人员分别提供Pig Latin和Hive SQL编程语言,Hive SQL跟标准的SQL相似,因此具有更广的群众基础,所以Hive很容易被新用户所接受;但是我们认为Pig Latin更加适合作为Storm的应用编程语言,理由如下:

1) Pig Latin在数据模型上支持复杂嵌套的数据结构,因此其更加适合处理半结构化、非结构化数据。
非结构化数据在实时计算场景下广泛存在的,例如我们经常需要将Storm处理的中间数据(嵌套或者复杂的数据结构)以PB格式的方式存储在外部存储中;从外部系统流入到Storm的数据也存在PB等复杂数据结构的情况。

2) Pig Latin作为面向过程的语言,其更加适合于复杂业务逻辑的表达。
Storm广泛应用在实时数据分析统计、ETL、在线机器学习等领域,对于一般的数据分析统计、ETL应用场景,无论是Hive SQL还是Pig Latin都可以满足,但是对于像在线机器学习、实时推荐这类业务逻辑往往非常复杂的场景,Pig Latin作为面向过程的语言,在解决这种问题时比起SQL这类面向结果的描述语言显得更加优雅。

3) Pig Latin较SQL在语法层面少了很多约束和限制,因此在Pig Latin上开展流式计算相关的功能扩展则更加容易。

2.2 Pig On Storm的实现思路
Pig的架构大致如下图所示,即一个Pig Latin脚本经过Antlr处理转变为AST(抽象语法树)和Logical Plan,Logical Plan经过优化再转变为Physical Plan,之后Physical Plan中的各运算符再被封装到MapReduce的Map、Reduce中去执行。

1.jpg


Pig的设计者们将Pig Latin定位成一种通用的数据处理语言,因此在设计Pig Latin时尽可能的将其设计成为底层执行平台无关,即Logical Plan及其之上的处理过程与底层的运行平台(Hadoop)基本上是解耦合的。在实现Pig On Storm时,我们的思路是尽量保持Logical Plan之上的处理逻辑,通过对底层Physical Plan、Execute Engine约3万行核心代码的重构,将Pig改造为可在Storm之上运行,这个方案的思路可以用下边这张图来表示:


2.jpg


2.3 Pig On Storm编译Pig代码流程

1) IDE编辑书写Pig脚本:
用户在支持Pig语法高亮的IDE中,根据业务实际需求书写Pig脚本,每一个Pig语句独占一行。包含Foreach、Window、Partition、Filter、Tap、Stream等运算符,兼容Apache Pig语法。

2) Pig脚本生成AST(抽象语法树):
这个过程,主要是通过文法,语法解析,生成这个语法树。内容实质上没有什么变化,通过QUERY,STATEMENT两个关键字作为节点进行组织形成一个语法树。在实现上,通过开源引擎Antlr完成此步骤。主要包括语法识别,关键字识别,语句识别。

3) AST生成的Logical Plan(逻辑执行计划):
通过分析AST中的语句的输入、输出的关联关系。以RAW_DATA关系作为DATA_BAG关系的输入。描述具体Schema,包括Logical 操作的类名(LOTap),以及参数名称和参数数据类型。每个节点(RAW_DATA或DATA)描述一条pig语句,包含数据输入、输出关系,UDF函数名称,函数的输出参数,数据类型等信息。AST是纯文本描述,而逻辑执行计划里面已经有代码描述信息(也称Schema)。但这里只是描述,还没有到真正的执行代码。故称之为Logical Plan。AST是一个树形结构,和AST不同,Logical Plan已转换为一个根据关系的输入,输出生成的DAG图。

4) Logical Plan生成的Physical Plan(物理执行计划):
物理蕴含的意义是真实能够执行的代码。通过编辑将逻辑执行计划的每个节点转变成真实可以执行的具体类。编译成物理执行计划仍然是一个DAG图,这个图与逻辑执行计划保持一致。

5) 通过Physical Plan生成Topology Plan:
有了Physical Plan后,需要将这个Plan运行在具体的平台上( 如,Storm),Storm在运行实体是Spout,Bolt。由于Storm的Topology(Spout,Bolt关系)是一个DAG图,而物理执行计划也是一个DAG图,所以,将物理执行计划到Topology的转化,实质是一个将物理执行计划DAG切割为Topology DAG的过程。划分的规则是通过Tap,Partition 这两个操作算子。如上,Tap为Spout起始,Partition 为Spout的结束或Bolt的起始。Spout,Bolt划分完后,在每个Spout,Bolt上的是物理计划中的一个子计划,也是一个子DAG,这个子DAG也就是该Spout或Bolt内部的业务处理逻辑,当数据流进入到Spout,Bolt后,调用这个子DAG进行处理,处理完的结果发送到下一级Bolt。

2.4 实现Pig On Storm所面临的挑战
在项目实施过程中会面临诸多挑战,比如:
1) Storm作为流处理系统,其数据输入是源源不断的,没有固定的边界和范围;而Hadoop作为离线数据处理系统,其数据输入是确定的且是有范围的(通常为HDFS上的文件),因此在Pig 中显得很自然的Group、Distinct、Order by等集合运算符,当其作用到Storm这种数据输入范围无边界的系统时应该被赋予不同的语义。
2) Hadoop在处理数据时通常是处理完一条数据再处理下一条数据,即Map/Reduce函数处理完一条数据相关的所有业务逻辑之后才会收到MapReduce框架给予的下一条数据并继续处理,如果把这种方式称之为同步模式,那么在Storm场景下为了追求数据处理实时性的极致,则还存在异步模式的应用场景。在异步模式下,数据的处理逻辑往往被分为两部分,一部分逻辑在数据流入Storm的Spout、Bolt时触发执行,而另外一部分逻辑则由异步数据返回时触发。Pig并不支持异步数据处理模式,且同步数据处理模式贯穿其整个实现过程,这使得支持异步模式变得格外复杂。
3) Storm作为流式计算系统,业务处理的高实时性是永远追求的目标,为了提高处理性能,在基于Storm的API进行应用开发时,通常会通过Cache/Buffer的方式来提升Storm的处理能力,而Pig 并未提供类似机制的支持。
4) 时间窗是实时计算应用中(一定时间范围内的数据进行计算)普遍存在的应用场景,在实现时需要考虑数据的延迟以及时间流逝对于窗口计算范围的影响,因此其实现异常复杂。Pig On Storm提供对各种复杂时间窗的支持,并将时间窗功能扩展到PigLatin语法层面。

2.5Pig On Storm编码示例

3.jpg

第①行:tap为Pig On Storm新扩展的运算符,用于从流式数据源读取数据,LocaFileTap是从本地文件读取数据的UDF函数
第②行:分割从文件中读取出来的每一行数据(这行代码与Pig完全一样)。
第③行:partition是Pig On Storm新扩展的运算符,其语义是对指定的关系按照某个表达式的值进行partition操作。这一行代码的意思是使用word字段对关系a进行partition操作,该语句可以保证相同的word被storm分发到同一个task。
第④行:通过UDF函数LoadFromStore从外部存储中读取某个单词当前的统计值。
第⑤行:对单词的统计值加1然后再通过WriteToStore UDF函数写回到外部存储。
如以上的WordCount实例程序所示,应用开发人员使用Pig On Storm可以在不了解Storm API、内部实现原理的情况下完成实时计算业务的开发。Pig On Storm在语法上兼容Pig Latin(Pig On Storm仅对Pig Latin进行了少量的扩展),因此对于有Pig开发经验的程序员几乎是零学习成本;由于Pig Latin语法简单,没有Pig开发经验的用户也可以快速上手。

3、可视化编程环境
Pig On Storm项目除了通过提供PigLatin脚本来简化Storm应用的编程难度之外,我们还提供所见即所得、可拖曳的图形化编程环境(如以下示意图所示)来将实时计算应用的开发门槛降到最低。应用开发人员只需先构思好实时计算的业务逻辑,之后在可视化编程环境中通过对界面控件进行拖曳和属性设置,便可以将构思好的业务逻辑转换为可运行的Storm应用程序。

4.jpg

同时,我们还提供集成开发环境(IDE),用户通过该环境可以对PigLatin脚本进行编辑、编译、调试和任务提交运行。


来源:腾讯大数据

已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条