让Pig在风暴中飞驰——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,在带来成倍的开发效率提升的同时也降低了应用开发的门槛。

2Pig On Storm的实现

2.1 Pig On Storm VS Hive On StormPig和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中去执行。

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

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.4Pig On Storm编码示例

以经典的Word Count为例,使用Apache开源的Pig Latin编写的程序为:

a = load '/user/hue/word_count_text.txt';b = foreach a generate flatten(TOKENIZE((chararray)$0)) as word;c = group b by word;d = foreach c generate COUNT(b), group;store d into '/user/hue/pig_wordcount';而使用Pig On Storm编写的程序则为:a = tap using LocalFileTap('/user/hue/word_count_text.txt');①b = foreach a generate flatten(TOKENIZE((chararray)$0)) as word;②c = partition a by word;③d = foreach c generate word, LoadFromStore(word) as count;④e = foreach d generate WriteToStore(word, count is not null ? (int)count+1 : 1);⑤

第①行: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应用程序。

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

原文发布于微信公众号 - 腾讯大数据(tencentbigdata)

原文发表时间:2015-05-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenssy

美团面试经历,贡献出来一起学习

美团我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会。10月23日中午HR打电话过来预约了...

5432
来自专栏phodal

如何识别不同的编程语言(上)

漫谈编程语言:数量 这又是一个有趣的话题~~,要知道编程语言有那么的多。引自Quora上一个相关问题的答案,从ABC到Z Shell就有256个。 但是这并不是...

3666
来自专栏程序员的诗和远方

20181118_ARTS_week21

这题一开始一直没思路,然后看了 leetcode 的讨论,这个解法还是比较精妙的,用两个指针,然后距离就是 n,等到最后一个碰到末尾,要踢掉的元素就是 前一个指...

914
来自专栏恰同学骚年

自己动手写游戏:飞机大战

  要说微信中最火爆的小游戏是哪款,可能既不是精心打造的3D大作,也不是《植物大战僵尸2》,而是微信5.0刚开启时的《飞机大战》。

3261
来自专栏程序员互动联盟

如何提高编写代码的速度?

如何提高代码编写的速度,一直是一个逃避不了的问题。在天朝你得像打字员一样做程序员,不然老板和上司都觉得你是在玩耍。对项目的贡献体现在哪里?码农难道不是以code...

4058
来自专栏SDNLAB

OpenDaylight系列文章(二):OpenDaylight初窥(上篇)之OpenDaylight的工程技术架构

上篇我们简单地和OpenDaylight控制器打了个照面,后续篇章会逐步介绍OpenDaylight的系统架构和实现机制。不过呢,在揭开其面纱之前熟悉它的背景技...

3895
来自专栏一名叫大蕉的程序员

餐厅老板要累疯了No.2

我是小蕉。 从前有座山,山里有座庙,庙里有个老和尚,阿不,有个餐厅的老板,在每天午餐之前,都要自己亲力亲为为各个小伙伴分配任务,大喊一声开饭啦,大家就屁...

1869
来自专栏大数据学习笔记

Java程序设计(Java9版):第0章 绪论(Introduction)

第0章 绪论(Introduction) 千里之行始于足下。 —-《道德经》 Man is still the most extraordinary c...

2185
来自专栏牛客网

腾讯暑期实习三面面经

回馈社会,腾讯暑期实习三面面经,正在等hr面试。。。 3.16 晚上8点 一面 电面 40分钟 1.自我介绍 2.position属性 比较 3.浮动清除 4....

41412
来自专栏Python中文社区

GayHub用户及仓库分析爬虫

專 欄 ❈陈键冬,Python中文社区专栏作者 GitHub: https://github.com/chenjiandongx ❈ 爬虫介绍 Github ...

2757

扫码关注云+社区

领取腾讯云代金券