Flink (一)基本架构
Flink (一)基本架构
1、什么是Flink?Flink有什么优势?
Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架
Flink的优势:
-
同时支持高吞吐、低延迟、高性能
-
支持事件事件概念
目前大多数框架窗口计算采用的都是系统时间(Process Time),也是事件传输到计算框架处理时,系统主机的当前时间。Flink能够支持基于事件时间(Event Time)语义进行窗口计算,也就是使用事件产生的时间
-
支持高度灵活的窗口(Window)操作
-
支持有状态计算
所谓状态就是在流式计算过程中将算子的中间结果数据保存在内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中获取中间结果中计算当前的结果,从而无须每次都基于全部的原始数据来统计结果,这种方式极大地提升了系统的性能,并降低了数据计算过程的资源消耗
-
基于轻量级分布式快照(Snapshot)实现的容错
-
基于JVM实现独立的内存管理
-
Save Points(保存点)
2、Flink基本架构
2.1 基本组件
Flink分为架构分为三层,由上往下依次是API&Libraries层、Runtime核心层以及物理部署层
API&Libraries层
作为分布式数据处理框架,Flink同时提供了支撑计算和批计算的接口,同时在此基础上抽象出不同的应用类型的组件库,如基于流处理的CEP(复杂事件处理库)、SQL&Table库和基于批处理的FlinkML(机器学习库)等、Gelly(图处理库)等。API层包括构建流计算应用的DataStream API和批计算应用的DataSet API,两者都提供给用户丰富的数据处理高级API,例如Map、FlatMap操作等,同时也提供比较低级的Process Function API,用户可以直接操作状态和时间等底层数据。
Runtime核心层
该层主要负责对上层不同接口提供基础服务,也是Flink分布式计算框架的核心实现层,支持分布式Stream作业的执行、JobGraph到ExecutionGraph的映射转换、任务调度等。将DataSteam和DataSet转成统一的可执行的Task Operator,达到在流式引擎下同时处理批量计算和流式计算的目的。
物理部署层
该层主要涉及Flink的部署模式,目前Flink支持多种部署模式:本地、集群(Standalone、YARN)、云(GCE/EC2)、Kubenetes。Flink能够通过该层能够支持不同平台的部署,用户可以根据需要选择使用对应的部署模式。
2.2 基本架构图
Flink系统主要由两个组件组成,分别为JobManager和TaskManager(还有ResourceManager和Dispacher),Flink架构也遵循Master-Slave架构设计原则,JobManager为Master节点,TaskManager为Worker(Slave)节点。所有组件之间的通信都是借助于Akka Framework,包括任务的状态以及Checkpoint触发等信息。
-
1.Client客户端
客户端负责将任务提交到集群,与JobManager构建Akka连接,然后将任务提交到JobManager,通过和JobManager之间进行交互获取任务执行状态。客户端提交任务可以采用CLI方式或者通过使用Flink WebUI提交,也可以在应用程序中指定JobManager的RPC网络端口构建ExecutionEnvironment提交Flink应用。
-
2.JobManager
JobMnager控制一个应用程序的主进程。JobManager会先接收到要执行的应用程序。这个应用程序包括:作业图(job Graph),逻辑数据流图(logical dataFlow graph)和打包了的所有类。JobManager会把JobGraphy转换成一个物理层面的数据流图,也叫执行图,包含了所有可以并发执行的任务。JobManager会向资源管理器(ResourceManager)请求执行任务必须要的资源,也就是任务管理器上的 插槽(slot,slot是资源分配的最小单位)。JobManager还会负责中央协调的操作,比如CHECK Point 的协调。
-
3.TaskManager
TaskManager是Flink的主要工作进程,通常在Flink中会有多个TaskManager在运行(可以看出Flink的任务运行其实是采用多线程的方式),每一个TaskManager都包含了一定数量的插槽,插槽的数量限制了TaskManager执行的并行度。启动之后,TaskManager会向资源管理器注册他的插槽,受到资源管理器的指令之后,TaskManager会将插槽提供给JobManager,JobManager就会向Task分配slot执行任务。在执行过程中,一个TaskManager可以和其他运行同一程序的TaskManager以数据流的形式交换数据
-
Dispatcher
为应用提交提供了RESET接口,当一个应用被提交执行时,分发器就会启动并且将应用移交给一个JobManager,分发器也会启动一个WebUI来展示和监控作业