流式计算和Flink介绍

IT业界 herman 1358浏览 0评论

目前大数据业界在计算技术上已经取得了显著的成果,例如:第一代开源的大数据处理技术Hadoop已经可以处理超大规模的数据集合,第二代开源的大数据处理技术Spark更好的利用了内存,并进一步加快了大数据处理的性能。

但这些大数据计算平台大都是批处理系统,虽然具备海量数据处理能力,但在时效性上有明显的滞后。显然,数据的价值不仅体现在空间维度上,同时也在时间维度上进行伸展,很多场景下数据的价值也会随着时间的流逝而逐渐消失。因此,大数据计算平台需要能够尽可能的提升计算的时效性,越快地从数据中挖掘出信息就意味着能够获取到更大的价值。

本文将重点介绍流式计算和Apache开源流计算项目Flink的相关特点。

流式计算介绍

显然批量计算模型是无法满足当前大数据实时计算需求的,只有流式计算模型才是实时计算的天然计算模型,因此我先介绍下流式计算的基本思想,尤其是区别于传统批量计算的一些概念。批量计算是对于有限固定的数据集合进行处理,流式计算是对无限数据流的处理,即计算无法确定数据何时会结束。从另一个角度看,批量计算其实也可以认为是流式计算的一种特例,因此批量计算可以看做是一个数据流中的片段,即有明确开始和结束标记的数据流,如下图所示:

批量流式计算

完善的流式计算不仅应该提供实时计算能力,还应该支持计算过程中的状态管理,状态主要是指计算过程中需要的数据或者变量,例如:统计计算中的aggregation(sum/min/max…),机器学习中的feature和model,状态管理包括这些数据的存储、备份、恢复,版本管理,提供读写访问API,并保证一致性,如下图所示:

流式计算状态一致性

此外,完善的流计算还需要考虑数据的时序问题,因为现实场景中,数据的产生顺序和接收顺序未必一致,因此需要给数据附带时间戳属性,即:event time,计算逻辑可以按照数据的event time来处理,这样可以解决数据的乱序问题,配合watermark机制,可以较好的解决time window计算,如下图所示:

Storm是第一代流式计算框架的代表

在开源大数据生态中,Storm是第一代流式计算框架的代表,但它不支持状态管理,即Storm中的状态数据需要用户自己存储在外部存储系统中,数据的持久化和一致性都需要用户自己保证,这会给应用带来一定复杂度。

后续出现的Samza是支持状态管理的第二代流计算技术,内部利用leveldb和kafka来存储数据,但samza只能保证at least once不丢数据,但无法保证exactly once的强一致性,这在一些严格的场景下是有局限性的。近几年火爆的Spark也很快推出了配套的Spark Streaming技术,但其本质上是通过连续不间断的Mini Batch来实现流式处理的,不是纯粹的流式计算思想,时效性上也有一定局限性。

只有最新一代的Flink是相对最为纯粹和完善的流计算技术,在理论模型上具备了一切流计算的特质,也是支持Apache Beam最好的Runner,给我们启动Blink项目带来了非常有价值的启发,因此下面我将介绍下Flink这个Apache开源流计算项目。

Flink介绍

Apache开源流计算项目Flink

流和批统一的计算引擎

流和批统一的计算引擎

完整的生态系统

流式计算,完整生态系统

状态管理和一致性

Chandy-Lamport算法是Flink支持状态管理和强一致性的核心理论基础,算法基础思想如下图所示:

Chandy-Lamport 状态管理和一致性

Chandy-Lamport算法的核心思想就是定期在流式计算任务中插入Barrier,然后触发整个流做一次Checkpoint,即将任务的State做一次Snapshot持久化保存。在下次任务重启的时候,可以基于上次成功的Checkpoint进行恢复,过程如下图所示:

Checkpoint 恢复数据过程

Flink的缺点

综上所述,Flink是一套理念和架构设计非常先进的流处理引擎,并几乎支持了流式计算所有的特质,但Flink发展尚在初期,在活跃度和成熟度上稍有欠缺,并且尚未在业内得到大规模生产实践的检验。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!

本文原文出处:业余草: » 流式计算和Flink介绍