流式计算的代表:Storm、Flink、SparkStreaming

目前业内比较知名的大数据流计算框架有Storm、Spark Streaming、Flink,接下来逐一看看它们的架构原理和使用方法。

Storm

其实大数据实时处理的需求很早就存在,那个时候主要使用MQ来实现大数据的实时处理,如果处理起来比较复杂,那么就需要很多个消息队列,将实现不同业务逻辑的生产者和消费者串起来。架构图如下:
流式计算的代表:Storm、Flink、SparkStreaming
图中的消息队列负责完成数据的流转;处理逻辑既是消费者也是生产者,也就是既消费前面消息队列的数据也为下个消息队列产生数据。这样的系统只能是根据不同需求开发出来,并且每次新的需求都需要重新开发类似的系统。因为不同应用的生产者、消费者的处理逻辑不同,所以处理流程也不同,因此这个系统也就无法复用。

因此我们就需要一个流处理计算系统,只要定义好处理流程和每一个节点的处理逻辑,最后代码也按照预定义好的流程和逻辑去执行,于是Storm就产生了。
流式计算的代表:Storm、Flink、SparkStreaming
有了Storm之后,开发者无需再关注数据的流转、消息的处理和消费,只要编程开发好数据处理的逻辑bolt和数据源的逻辑spout以及它们之间的拓扑逻辑关系toplogy,提交到Storm上运行就可以了。

Storm和Hadoop一样,也是主从架构。
流式计算的代表:Storm、Flink、SparkStreaming
nimbus是集群的Master,负责集群管理、任务分配等。supervisor是Slave,是真正完成计算的地方,每个worker上运行多个task,而task就是spout或者bolt。supervisor和nimbus通过ZooKeeper完成任务分配、心跳检测等操作。

Spark Streaming

我们知道Spark是一个批处理大数据计算引擎,主要针对大批量历史数据进行计算。它将原始数据分片后装载到集群中计算,对于数据量不是很大、过程不是很复杂的计算,可以在秒级甚至毫秒级处理。

Spark Streaming巧妙的利用了Spark的分片快速计算的特性,将实时传输进来的数据按照时间进行分段,把一段时间传输进来的数据合并在一起当做一批数据,再去交给Spark去处理。下图是Spark Streaming数据处理流程:
流式计算的代表:Storm、Flink、SparkStreaming
如果时间段分得足够小,每一段的数据量就会比较小,再加上Spark引擎的处理速度又足够快,这样看起来好像数据是被实时处理的一样,这就是Spark Streaming实时流计算的奥妙。

Spark Streaming主要负责将流数据转换成小的批数据,剩下的就可以交给Spark去做了。

Flink

前面说Spark Streaming是将实时数据流按时间分段后,微批次处理计算,而Flink则是一开始就按照流处理计算去设计的,从HDFS中读入的数据也当做数据流看待,就变成批处理系统了。

如果要进行流计算,Flink会初始化一个流执行环境StreamExecutionEnvironment,然后利用这个执行环境构建数据流DataStream。

StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment(); 
 
DataStream<WikipediaEditEvent> edits = see.addSource(new WikipediaEditsSource());

如果要进行批处理计算,Flink会初始化一个批处理执行环境ExecutionEnvironment,然后利用这个环境构建数据集DataSet。

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); 
 
DataSet<String> text = env.readTextFile("/path/to/file"); 

然后在DataStream或者DataSet上执行各种数据转换操作(transformation),这点很像Spark。不管是流处理还是批处理,Flink运行时的执行引擎是相同的,只是数据源不同而已。

Flink处理实时数据流的方式跟Spark Streaming相似,也是将流数据分段后,一小批一小批地处理。但是Flink对微批次流处理的支持更加完善,可以对数据流执行window操作将数据流切分到一个一个window里进而进行计算。

Flink的架构和Hadoop 1或者Yarn看起来很像,JobManager是Flink集群的管理者,Flink程序提交给JobManager后,JobManager检查集群中所有TaskManager的资源利用状况,如果有空闲TaskSlot(任务槽),就将计算任务分配给它执行。
流式计算的代表:Storm、Flink、SparkStreaming

上一篇:大数据学习路线图


下一篇:storm知识点学习总结(一)