大数据的时代,已经来临有段时间了,期间,各类的数据处理的框架也是有不少。
离线数据批处理模型
Hadoop,大家一定不会陌生。使用了Google的Map/Reduce模型的Hadoop框架,能够将大量的廉价机器作为服务的集群,提供分布式计算的服务。Map/Reduce模型采用分而治之的理念,便意味着面对的群体是大批量的数据处理。Hadoop下的Map/Reduce框架对于数据的处理流程是(借助《深入浅出云计算》里的图):
Mapreduce处理图
1、 将要处理的数据上传到Hadoop的文件系统HDFS中。
2、 Map阶段
a) Master对Map的预处理:对于大量的数据进行切分,划分为M个16~64M的数据分片(可通过参数自定义分片大小)
b) 调用Mapper函数:Master为Worker分配Map任务,每个分片都对应一个Worker进行处理。各个Worker读取并调用用户定义的Mapper函数处理数据,并将结果存入HDFS,返回存储位置给Master。
一个Worker在Map阶段完成时,在HDFS中,生成一个排好序的Key-values组成的文件。并将位置信息汇报给Master。
3、 Reduce阶段
a) Master对Reduce的预处理:Master为Worker分配Reduce任务,他会将所有Mapper产生的数据进行映射,将相同key的任务分配给某个Worker。
b) 调用Reduce函数:各个Worker将分配到的数据集进行排序(使用工具类Merg),并调用用户自定义的Reduce函数,并将结果写入HDFS。
每个Worker的Reduce任务完成后,都会在HDFS中生成一个输出文件。Hadoop并不将这些文件合并,因为这些文件往往会作为另一个Map/reduce程序的输入。
以上的流程,粗略概括,就是从HDFS中获取数据,将其按照大小分片,进行分布式处理,最终输出结果。从流程来看,Hadoop框架进行数据处理有以下要求:
1、 数据已经存在在HDFS当中。
2、 数据间是少关联的。各个任务执行器在执行负责的数据时,无需考虑对其他数据的影响,数据之间应尽可能是无联系、不会影响的。
使用Hadoop,适合大批量的数据处理,这是他所擅长的。由于基于Map/Reduce这种单级的数据处理模型进行,因此,如果数据间的关联系较大,需要进行数据的多级交互处理(某个阶段的处理数据依赖于上一个阶段),需要进行多次map/reduce。又由于map/reduce每次执行都需要遍历整个数据集,对于数据的实时计算并不合适,于是有了storm。
在线实时流处理模型
对于处理大批量数据的Map/reduce程序,在任务完成之后就停止了,但Storm是用于实时计算的,所以,相应的处理程序会一直执行(等待任务,有任务则执行)直至手动停止。
对于Storm,他是实时处理模型,与hadoop的不同是,他是针对在线业务而存在的计算平台,如统计某用户的交易量、生成为某个用户的推荐列表等实时性高的需求。他是一个“流处理”框架。何谓流处理?storm将数据以Stream的方式,并按照Topology的顺序,依次处理并最终生成结果。
首先解释几个术语:
Spout:可以理解为一个水龙头,是水流的源头。在storm中获取原始数据,是一个计算流程的数据来源。
Bolt:作为整体流程的处理模块,多个Bolt可以组合成某种拓扑结构进行数据处理。Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。
Tuple:一次消息传递的基本单元。本来应该是一个key-value的map,但是由于各个组件间传递的tuple的字段名称已经事先定义好,所以tuple中只要按序填入各个value就行了,所以就是一个value list.
Topology:由Spout和Bolt组成,二者通过Tuple进行交互而构成一个拓扑结构,一个拓扑是一个任意复杂的多级流计算。
Storm中的Spout和Bolt组成的拓扑结构如下:
数据从源头Spout中进入,依照拓扑顺序,使用相应的Bolt依次处理,得到最终数据。这种由各个用户自定义的处理器(Bolt)组合而成的拓扑结构,能够适应大多数的业务需求。因此,只需业务能够组合成相应的拓扑逻辑,就能够借助storm框架,也就无需考虑实时计算的低延迟、高性能、分布式、可扩展、容错等问题了。
Storm中作为流的数据,至始至终,都是存在于内存当中进行流转的,所以效率较之Hadoop以磁盘作为数据交换的介质更高。Hadoop可以理解为从河流里一桶桶的提水来使用,而Storm则是在河流上架设了引水管,使得打开水龙头,水就能够源源不断输出。
虽说二者都是分布式的数据处理框架,但其实,Hadoop本身的定位就是用于批量数据处理的,所以,与定位在实时处理的storm之间并无太大的交集。但如果说Hadoop是海量数据处理的代表,那么Storm便是实时处理的代表。借助于Map/reduce, hadoop开发了一个抽象框架,抽象到人们无需关注大多数的分布式细节,而只需要表示出自己的处理逻辑即可。与hadoop类似,storm也开发了一个抽象框架(拓扑逻辑),借助该框架,能够处理大多数的实时处理的业务而无需关注底层的大部分细节。这种抽象处理模型让框架本身的适应性更强。
参考:
《深入浅出云计算》
http://wenku.baidu.com/view/6c3187e9f8c75fbfc77db230.html
http://www.searchtb.com/2012/09/introduction-to-storm.html
http://storm-project.net/about/simple-api.html
https://github.com/nathanmarz/storm/wiki/Tutorial
http://wenku.baidu.com/view/8858cac1aa00b52acfc7ca9b.html