实时即未来:下一代大数据计算引擎
6
星期三
2021年1月
验“金”室
伴随着海量增长的数据,我们正在步入数字化时代。不论是结绳记事的小数据时代,还是当下的大数据时代,计算的边界正在被无限拓宽,而数据的价值再也难以计算。时下,谈及大数据,就不得不提到最热门的下一代大数据计算引擎Apache Flink(以下简称“Flink”)。
一、最好的流计算引擎
绝大部分人对批处理可能比较熟悉,流计算跟批处理相比有一些显著的不同,那就是流计算能够在不完整的数据上进行计算,当数据到来的时候,它能实时计算。这就是流计算名字的由来,不需要等到数据完全到来才进行计算,正是这种计算模式使得流计算能够提供非常低的延迟。
流计算一直是大数据计算引擎的一个痛点,在Apache Storm出现以前,大家都是采用批处理的方式来计算,其中最典型的代表就是Apache Spark,它推出了Spark Streaming,试图用快速的批处理及“微批处理”来模拟流计算,这种尝试现在被证明存在太多限制。
Storm本身也存在问题,首先是性能,无法支持高吞吐低延迟的场景;其次是功能,对于Exactly Once模式和窗口支持较弱,使用的场景有限。与此相比,Flink已经克服了流处理方面大部分的问题,包括更好的状态管理、利用分布式一致性快照实现的检查点容错机制,使其在流处理方面的能力趋于完善。
为了更好地理解这个事情,我们来看一下如上图左边是一个最简单的流计算WordCount程序。从程序上可以看到,它跟批处理的WordCount看起来是一样的,但是其行为稍微有点不一样,它会从一个消息队列中不断地处理每条收到的消息。每条消息是一个句子,它会实时地打印出每个词到目前为止已经出现过多少次。和批处理不一样的是,这个作业会一直运行,每当新句子到来的时候,它都会不断地更新自己的计算结果。这样一个流计算的程序经过翻译会变成右边的Flink DAG,可以看出这与MapReduce非常相像,实际上它就是一个流式的MapReduce。
但是这和传统的MapReduce有一个非常不一样的地方。负责计数的算子为了能够做到计数,需要知道一个词到目前为止已经出现了多少次,才能在这之上加1得到新的出现次数。为了做到这一点,在Flink之前,业务方往往需要把这样的状态存在某个外部的存储中。这明显增加了开发的难度,用户需要去维护一个外部的存储。更加糟糕的是,在一个分布式的系统里,出错是不可避免的,当出现错误的时候,如果状态是在一个外部的存储当中,当你试图恢复的时候,非常容易把一个词少数一次或者把一些词多数一遍,很难做到精准的语义。
为解决上述问题,Flink最大的一个创新是在流计算当中引入了状态的概念,作为一个流计算引擎,真正把状态管理起来。
1.状态管理
Flink提供了内置的状态管理,可以把这些状态存储在Flink内部,而不需要把它存储在外部系统。这样做的好处,一是减少了计算引擎对外部系统的依赖以及部署,使运维更加简单;二是极大地提升了性能,如果通过外部去访问,如Redis、HBase,它一定是通过网络及RPC,如果通过Flink内部去访问,它只通过自身的进程去访问这些变量。
2.状态容错
Flink引入了Chandy-Lamport Checkpoint机制,它的核心思想是把这个流计算看成一个流式的拓扑,定期从这个拓扑的头部Source点开始插入特殊的Barriers,从上游开始不断地向下游广播这个Barriers。每一个节点收到所有的Barriers,会将State做一次Snapshot,当每个节点都做完Snapshot之后,整个拓扑就算完整地做完了一次Checkpoint。接下来不管出现任何故障,都会从最近的Checkpoint进行恢复。这种Checkpoint的机制能够让一个快速运行的流计算作业拍一张全局一致的快照。所以当出现错误的时候,我们能够把系统回滚到上一次成功的快照,而保证所有状态的一致性,真正实现精准的正好一次的语义,这是Flink在流计算上的一个重大的突破。
Flink利用这套经典的算法,保证了强一致性的语义,使得Flink可以提供金融级的数据处理能力。这正是Flink与其他无状态流计算引擎的核心区别。
Flink作为一个流计算引擎,它能够提供很低的延迟,同时提供很高的吞吐。它提供了精准的正好一次的语义,并且它有很好的容错性,能够快速地从错误中恢复。正是因为在架构上的这些优点,Flink已经被业界公认是最好的流计算引擎。
二、不仅仅是流计算
然而Flink的“野心”不仅于此。
Flink并不想将自己仅仅局限于流处理引擎,而是用流处理来模拟批处理,以及支持交互式查询、机器学习等大部分数据处理场景。这已经进入了通用计算引擎的领域,与Spark展开了正面竞争。
我们不妨简单回顾一下大数据的发展过程。
从Google奠基性的“三架马车”论文发表后的很长一段时间内,大数据的发展主线上都只有批计算的身影。后来,随着大家认识到数据时效性的重要作用,各种流计算引擎也纷纷登场,其中也包括了Flink。出于对成本、计算准确性和容错性等方面的考虑,各家企业纷纷使用起了被称为Lambda架构的解决方案,在同一个架构下融合批计算和流计算,以便在成本、容错和数据时效性之间达到一个平衡。
典型的大数据的业务场景下数据业务最通用的做法是:选用批处理的技术处理全量数据,采用流式计算处理实时增量数据。在绝大多数的业务场景之下,用户的业务逻辑在批处理和流处理之中往往是相同的。但是,用户用于批处理和流处理的两套计算引擎是不同的。因此,用户通常需要写两套代码。毫无疑问,这带来了一些额外的负担和成本。
为了解决这个问题,各个计算引擎不约而同地开始了流批统一的尝试,试图使用同一套引擎来执行流和批的任务。经过若干年的大浪淘沙,Spark和Flink成为了目前处于第一梯队的两款主流计算引擎。Flink是从流计算逐渐进入到批计算,一个非常典型的成功案例就是使用同一套标准的SQL语句对流和批进行查询,并保证最终结果一致性。而Spark则是采用微批(Micro Batch)的方式从批计算进入到流计算提出了Spark Streaming,但是在时延的表现上始终逊色一些。
Flink以流计算技术为基础,构建了一个流批一体化的处理引擎。
1.统一SQL方案
提高开发者的效率与降低流计算的门槛,对推广流计算同样重要。Flink通过引入流式SQL去降低流计算的门槛,但是流式SQL的好处不止于此。流式SQL还有一个同样重要或者更重要的作用,是它能够用一套语言把流计算和批处理的语义真正地统一起来。
用户可以使用相同的SQL来描述流批作业,只是在运行时需要告诉Flink引擎希望以流的形式运行还是以批的流式运行,此时Table层的优化器就会将程序优化成DataStream作业(流处理)或者DataSet作业(批处理)。
2.统一API Stack
虽然Flink提供了一个流批统一的API,即Table API和SQL,但在其分布式流式执行引擎之上,有两套相对独立的DataStream和DataSet API,分别来描述流计算和批处理的作业。而流批一体化引擎的目标不仅仅是在语言层,Flink希望整个实现也都是流和批一体化的。
在Flink的未来版本规划中,将舍弃DataSet API,用户的API主要会分为偏描述物理执行计划的DataStream API以及偏描述关系型计划的Table&SQL。DataStream API提供给用户更多的是一种“所见即所得”的体验,由用户自行描述和编排算子的关系,引擎不会做过多的干涉和优化。而Table API&SQL则继续保持现在的风格,提供关系表达式API,引擎会根据用户的意图来进行优化,并选择最优的执行计划。值得一提的是,以后这两个API都会各自同时提供流计算和批处理的功能。这两个用户API在实现层会共享相同的技术栈。
三、应用场景
Flink广泛应用于实时化场景,从技术领域来看主要用于以下场景:
1.实时ETL和数据流
实时ETL和数据流的目的是实时地把数据从A点投递到B点。在投递的过程中可能添加数据清洗和集成的工作,例如实时构建搜索系统的索引、实时数仓中的ETL过程等。
2.实时数据分析
数据分析指的是根据业务目标,从原始数据中抽取对应信息并整合的过程。例如,查看每天销量前十的商品、仓库平均周转时间、文档平均点击率、推送打开率等。实时数据分析则是上述过程的实时化,通常在终端体现为实时报表或实时大屏。
3.事件驱动应用
事件驱动应用是对一系列订阅事件进行处理或作出响应的系统。事件驱动应用通常需要依赖内部状态,例如点击欺诈检测、风控系统、运维异常检测系统等。当用户的行为触发某些风险控制点时,系统会捕获这个事件,并根据用户当前和之前的行为进行分析,决定是否对用户进行风险控制。
4.AI实时化
目前的AI大致可以分为数据预处理(也称数据准备/特征工程等)、模型训练和推理预测三个主要阶段。最典型的AI架构示例是离线训练配合在线推理预测,这个架构存在一个问题:模型更新的周期通常比较长。此时,需要引入一个实时训练的链路,在这个链路中,线上的数据在用于推理预测之外还会实时生成样本并用于在线模型训练。但是,不论是纯在线还是纯离线的链路,都并非适合所有的AI场景。
和Lambda的思想类似,我们可以把两者结合。因此,在数据预处理的部分用一个流批统一的引擎可以避免维护两套代码,所以使用Flink是一个非常合适的选择。除此之外,为了进一步降低系统的复杂度,Flink也在模型训练环节进行了一系列努力。随Apache Flink发布的Flink ML Lib机器学习算法库,除了离线学习的算法外,另一大特色就是为用户提供了在线学习算法,助推Flink在AI实时化上发挥更大的作用。
四、总结和展望
大数据时代,数据已成为国家基础性战略资源。如何挖掘数据的无穷潜力,将算力推至极致,是整个社会面临的难题。作为数据智能的基础环节,为了快速获取数据反馈,帮助企业更快地做出决策、更好地进行产品迭代,满足实时化场景的需求,采用一套可实现低延迟、高吞吐、高稳定的强大性能的引擎逐渐成为更多企业的选择。Flink作为领先的开源大数据计算引擎,在稳定性、性能和效率方面都经受住了阿里巴巴、腾讯、微博、网易、快手、滴滴等互联网企业的严苛生产环境考验。同时,Flink作为Apache基金会中最为活跃的项目之一,在GitHub上其访问量在Apache项目中位居前三,除了应对实时风控、实时ETL处理等实时数据分析场景,Flink还在持续探索批与流的统一、在线的函数计算,主动拥抱AI场景提供“大数据+AI”的全链路解决方案,做到未来即实时。
往期推荐
FCC30+
长按左边二维码
关注我们不迷路