1.Flink与主流计算引擎的比较1.HadoopMapReduceOne),是一种处理和生成大数据的编程模型。HadoopMapReduce借鉴了Google这篇论文的思想,将大任务拆分成更小的任务进行处理,因此具有更好的可扩展性。如图1所示,HadoopMapReduce包括两个阶段——Map和Reduce:Map阶段将数据映射到键值对(key/value),map函数由Hadoop中的Mapper类表示;Reduce阶段使用shuffle后的key-value对数据进行处理,使用自身提供的算法得到输出结果。reduce函数由Hadoop中的Reducer类表示。shuffle阶段对MapReduce模式开发人员是透明的。图1 HadoopMapReduce处理模型HadoopMR1通过JobTracker进程管理作业调度和资源。TaskTracker进程负责Job的实际执行,通过Slots划分资源(CPU、内存等)。HadoopMR1存在资源利用率低的问题。为了解决MR1存在的问题,HadoopMR2对作业调度和资源进行了升级,将JobTracker转为YARN,提高了资源利用率。其中,YARN的ResourceManager负责资源管理,ApplicationMaster负责任务调度。YARN支持可插拔性,不仅支持HadoopMapReduce,还支持Spark、Flink、Storm等计算框架。HadoopMR2解决了HadoopMR1的一些问题,但是其对HDFS的频繁I/O操作会导致系统无法满足低延迟的要求,因此只适用于离线大数据处理,不能满足实时的要求。时间计算。2.SparkSpark是加州大学伯克利分校开源的一个类HadoopMapReduce的大数据处理框架。与HadoopMapReduce相比,它最大的区别是中间计算结果存储在内存中,而不是HDFS。Spark的基本数据模型是RDD(ResilientDistributedDataset,弹性分布式数据集)。RDD是一个不可变的分布式集合对象,由很多分区组成,每个分区包含一部分RDD数据,每个分区可以在不同的节点上存储和计算。在Spark中,所有的计算都是通过RDD的创建和转换完成的。SparkStreaming是在SparkCore的基础上进行扩展,支持对实时流数据的处理。如图2所示,SparkStreaming对传入数据进行批处理、转换和输出。微批处理不能满足低延迟的要求,只能算是近实时计算。图2 SparkStreaming处理模型StructuredStreaming是一个基于StreamingSQL引擎的可扩展和容错的流计算引擎。如图3所示,StructuredStreaming将流式数据作为一个整体看成一个无界表,将每条传入的数据看成一个无界输入表,对输入进行处理会生成结果表。结果表的生成可以由触发器触发。目前支持的触发器都是定时触发的,整个过程类似于SparkStreaming的微批处理;自Spark2.3以来引入了连续处理。Continuousprocessing是一种新的、实验性的流处理模型,它支持连续触发以实现基于StructuredStreaming的低延迟。图3 StructuredStreaming处理模型3.FlinkFlink是一个分布式引擎,对有界和无界数据进行有状态计算。它是一种纯流式处理模型。流入Flink的数据会经过预定的DAG(DirectedAcyclicGraph)节点,Flink会对这些数据进行有状态的计算。整个计算过程类似于流水线。每个计算节点都有本地存储来存储计算状态,计算节点中的状态会在一定时间内持久化到分布式存储中,保证流的容错性,如图4所示。这种纯流式传输mode保证了Flink的低延迟,使其在众多实时计算引擎竞争中具有优势。图4 Flink流处理模型二。Flink基本架构下面从分层和运行时的角度介绍Flink的基本架构。其中,对于运行时的Flink架构,将以1.5版本为分界线介绍前后版本的架构变化。1.分层架构Flink是一个分层架构的分布式计算引擎。每一层的实现依赖于下层提供的服务,同时提供抽象的接口和服务供上层使用。整体分层架构如图5所示。图5 Flink的分层架构Deployment:Flink支持本地运行,支持Standalone集群和YARN、Mesos、Kubernetes管理的集群,也支持运行在云端。Core:Flink的Runtime是整个引擎的核心,是分布式数据流的实现部分,实现了Runtime组件之间的通信和组件的高可用。API:DataStream提供流计算API,DataSet提供批处理API,Table和SQLAP提供对Flink流计算和批SQL的支持。库:在库层,Flink提供了复杂事件处理(CEP)、图计算(Gelly)和机器学习库。2.运行时架构Flink的运行时架构经历了相当大的演变。Flink1.5版本之前,运行时架构如图6所示。图6 Flink1.5之前版本的运行时架构Client负责编译提交的作业,生成DAG,提交作业给JobManager,发送命令到JobManager来操作作业。JobManager作为Flink引擎的Master角色,主要有两个功能:作业调度和检查点协调。TaskManager是Fl??ink引擎的Worker角色,是作业真正执行的地方。TaskManager通过Slot对其资源进行逻辑划分,来决定TaskManager运行的任务数量。从Flink1.5开始,Flink运行时有两种模式,分别是Session模式和Per-Job模式。Session模式:Flink1.5之前是Session模式。1.5和之后版本的区别在于引入了Dispatcher。Dispatcher负责接收作业的提交和持久化,生成多个JobManager并维护Session的一些状态,如图7所示。图7 Session模式Per-Job模式:该模式启动后只会运行一个作业,集群的生命周期与作业的生命周期密切相关,而Session模式可以有多个作业运行和多个作业共享TaskManager资源,如图8所示。图8 Per-Job模式作者简介:罗江宇、赵士杰、李汉淼、闵文军,四位作者都是非常资深的Flink专家,部分的作者是Flink源码的维护者和改造者。罗江宇:Flink技术专家,先后就职于新浪微博、滴滴和一家大型电商公司。曾主导或参与多家公司Flink实时计算服务建设、超大规模集群维护、Flink引擎改造。具有丰富的实时计算实践经验,目前专注于Kubernetes调度、FlinkSQL和Flink流批集成。赵世杰:大数据技术资深专家,曾就职于滴滴、阿里巴巴等一线互联网公司。从0到1深度参与滴滴大数据建设,在一线大数据平台建设方面有着非常丰富的经验,对大数据领域的计算和存储引擎有深入研究。李汉淼:大数据研发专家,原滴滴大数据开发工程师。在大数据领域工作多年,参与过多家公司流计算平台的设计和开发。目前专注于流批集成、OLAP技术的研究与应用。闵文军:蚂蚁集团技术专家,开源大数据社区爱好者,FlinkContributor,在实时计算领域工作多年,深度参与滴滴和蚂蚁实时计算平台建设团体。书评本文节选自《Flink技术内幕:架构设计与实现原理》,经出版社授权发布。(ISBN:9787111696292)转载请保留文章出处。
