沈超 邓彩凤
(1.大庆油田工程建设有限公司化建公司,黑龙江大庆 163159;2.中国石油大港油田分公司对外合作项目部,天津 300280)
论Storm分布式实时计算工具
沈超1邓彩凤2
(1.大庆油田工程建设有限公司化建公司,黑龙江大庆 163159;2.中国石油大港油田分公司对外合作项目部,天津 300280)
互联网的应用催生了一大批新的数据处理技术,storm分布式实时处理工具以其强大的数据处理能力、可靠性高、扩展性好等特点,在近几年得到越来越广泛的关注和应用。
分布式 实时计算 流处理
互联网的应用正在越来越深入的改变人们的生活,互联网技术也在不断发展,尤其是大数据处理技术,过去的十年是大数据处理技术变革的十年,MapReduce,Hadoop以及一些相关的技术使得我们能处理的数据量比以前要大得多得多。但是这些数据处理技术都不是实时的系统,或者说,它们设计的目的也不是为了实时计算。没有什么办法可以简单地把hadoop变成一个实时计算系统。实时数据处理系统和批量数据处理系统在需求上有着本质的差别。
然而大规模的实时数据处理已经越来越成为一种业务需求了,而缺少一个“实时版本的hadoop”已经成为数据处理整个生态系统的一个巨大缺失。而storm的出现填补了这个缺失。Storm出现之前,互联网技术人员可能需要自己手动维护一个由消息队列和消息处理者所组成的实时处理网络,消息处理者从消息队列取出一个消息进行处理,更新数据库,发送消息给其它队列等等。不幸的是,这种方式有以下几个缺陷:
单调乏味:技术人员花费了绝大部分开发时间去配置把消息发送到哪里,部署消息处理者,部署中间消息节点—设计者的大部分时间花在设计,配置这个数据处理框架上,而真正关心的消息处理逻辑在代码里面占的比例很少。
脆弱:不够健壮,设计者要自己写代码保证所有的消息处理者和消息队列正常运行。
伸缩性差:当一个消息处理者的消息量达到阀值,需要对这些数据进行分流,配置这些新的处理者以让他们处理分流的消息。
Storm定义了一批实时计算的原语。如同hadoop大大简化了并行批量数据处理,storm的这些原语大大简化了并行实时数据处理。storm的一些关键特性如下:
适用场景广泛:storm可以用来处理消息和更新数据库(消息流处理),对一个数据量进行持续的查询并返回客户端(持续计算),对一个耗资源的查询作实时并行化的处理(分布式方法调用),storm的这些基础原语可以满足大量的场景。
可伸缩性高:Storm的可伸缩性可以让storm每秒可以处理的消息量达到很高。Storm使用ZooKeeper来协调集群内的各种配置使得Storm的集群可以很容易的扩展很大。
保证无数据丢失:实时系统必须保证所有的数据被成功的处理。那些会丢失数据的系统的适用场景非常窄,而storm保证每一条消息都会被处理,这一点和S4相比有巨大的反差。
异常健壮:不像Hadoop—出了名的难管理,storm集群非常容易管理。容易管理是storm的设计目标之一。
语言无关性:健壮性和可伸缩性不应该局限于一个平台。Storm的topology和消息处理组件可以用任何语言来定义,这一点使得任何人都可以使用storm。
计算拓补:Topologies
一个实时计算应用程序的逻辑在storm里面被封装到topology对象里面,我把它叫做计算拓补。Storm里面的topology相当于Hadoop里面的一个MapReduce Job,它们的关键区别是:一个MapReduce Job最终总是会结束的,然而一个storm的topoloy会一直运行—除非你显式的杀死它。一个Topology是Spouts和Bolts组成的图状结构,而链接Spouts和Bolts的则是Streamgroupings。
消息流:Streams
消息流是storm里面的最关键的抽象。一个消息流是一个没有边界的tuple序列,而这些tuples会被以一种分布式的方式并行地创建和处理。对消息流的定义主要是对消息流里面的tuple的定义,我们会给tuple里的每个字段一个名字。并且不同tuple的对应字段的类型必须一样。也就是说:两个tuple的第一个字段的类型必须一样,第二个字段的类型必须一样,但是第一个字段和第二个字段可以有不同的类型。在默认的情况下,tuple的字段类型可以是:integer,long,short,byte,string,double,float,boolean和bytearray。你还可以自定义类型—只要你实现对应的序列化器。
根据storm的特点,大致有两个应用模式:(1)实时流处理;(2)drpc调用;前者就是通过消息队列等方式将数据源源不断的发送给storm集群来处理,而后者,类似于开启一个服务,客户端方面可以远程的发送数据给storm并同步或异步的接收到处理结果。
storm的应用场景非常广泛,具体如下:
监控系统:监控整个集群的状态,当出现异常log的时候进行分析,对异常进行分类并实时发出报警,提示运维人员来维护。并且可以进一步考虑。这样可以对整个系统的做一个很好的监控和反应。
安全系统:在信息安全领域中,做实时的流量分析,异常过滤、恶意攻击检测等。
实时计算:根据之前数据分析人员分析计算的数学模型,如点击量预估模型、用户付费预期计算模型、好友推荐算法,放到storm的拓扑中,通过topology来计算,可以帮助实时为用户提供服务、及时发现问题、极大的提高工作效率,而不必受制于老的计算模式,如一天计算一次、一小时计算一次等。
Storm0.7系列的版本已经在各大公司得到了广泛使用,最近发布的0.8版本中引入了State,使得其从一个纯计算框架演变成了一个包含存储和计算的实时计算新利器,还有刚才提到的Trident,提供更加友好的接口,同时可定制scheduler的特性也为其针对不同的应用场景做优化提供了更便利的手段,也有人已经在基于storm的实时ql(query language)上迈出了脚本。在服务化方面,storm一直在朝着融入mesos框架的方向努力。同时,storm也在实现细节上不断地优化,使用很多优秀的开源产品,包括kryo,Disruptor,curator等等。可以想象,当storm发展到1.0版本时,一定是一款无比杰出的产品。