一、为什么选择Flink
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有解数据流进行状态计算,其具有高吞吐、低延迟、结果准确、语义化窗口、易用的API和高容错的特点
ETL 是企业数据应用过程中的一个数据流(pipeline)的控制技术,把原始的数据经过一定的处理,放入数据仓库里(提取 Extract;转换 transform;加载 Load提取 Extract;)
Flink的主要特点
① 事件驱动(Event-driven)
② 基于流的世界观
在flink的世界观中,一切都是由流组成的,离线数据是有界的流(有界流);实时数据是一个没有界限的流(无界流);
③ 分层API
越顶层越抽象,表达含义越简明,使用越方便
越底层越具体,表达能力越丰富,使用越灵活
④ 支持事件时间和处理时间语义
⑤ 精准一次的状态一致性保证
⑥ 低延迟,每秒处理数百万个事件,毫秒级延迟
⑦ 与众多常用存储系统的连接
⑧ 高可用,动态扩展,实现7 * 24小时的全天候运行
Flink Vs Spark Streaming
① Flink 是流处理,Spark是微批处理
② 数据模型
-Spark 采用RDD模型,Spark Streaming 的DStream实际上就是一组组小数据RRD的集合
-Flink基本数据模型是数据流,以及事件序列
③ 运行时构架
-Spark是批计算,将DAG划分位不同的stage,一个完成后才可以计算下一个
-Flink是标准的流执行模式,一个事件在一个节点处理完后才可以直接发往下一个节点进行处理
二、Flink运行时的组件
JobManage
· 控制一个应用进程的主进程,即每个应用程序都会被一个不同的JobManager所控制执行
· JobManager会先接收到要执行的应用程序,这个应用程序包括:作业图(JobGraph)、逻辑数据流图(logic dataflow graph)和打包的所有的类、库和其他资源的jar包
· JobManager会把JobGraph转换成一个物理层面的数据流图(执行图 ExecutionGraph),其包含了所有可以并发执行的任务
· JobManager会向资源管理器(ResourceManager)请求执行任务的必要资源,也就是TaskManager上面的插槽(slot);一旦它获取到足够的资源,就会将执行图分发到真正运行它们的TaskManager上;在运行过程中,JobManager会负责所有需要中央协调的操作,比如检查点(checkpoint)的协调
TaskManager
· 干活的人,Flink中的工作进程;通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含一定数量的slot;slot的数量限制了TaskManager能够执行的任务的数量
· 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个slot提供给JobManager调用;JobManager就可以向slot分配task来执行了;
· 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据
ResourceManager
· 主要负责管理TaskManager的slot,slot是Flink中定义的处理资源单元
· Flink为不同的环境和资源管理工具提供不同的ResourceManager,比如YARN、Mesos、K8s,以及standalone部署
· 当JobManager申请插槽资源时,ResourceManager会将有空闲slot的TaskManager分配给JobManager。如果ResourceManager没有足够的slot来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器
Dispatcher
· 可以跨作业运行,它为应用提交提供了REST接口
· 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager
· Dispatcher也会启动一个Web UI来展示和监控作业的执行信息
· Dispatcher在架构中不是必须的,取决于应用提交的运行方式
任务提交流程
并行度
一个特定算子的子任务(subtask)的个数称为其并行度(parallelism);一般情况下,一个stream的并行度,可以认为就是其所有算子中最大的并行度
TaskManager和Slots
· slot:执行一个独立任务所需要资源的最小单元
·Flink中每一个TaskManager都是一个JVM进程,它可能会在独立的线程上执行一个或多个子任务
· 为了控制一个TaskManager能接收多少个task,TaskManager通过task slot拉进行控制(一个TaskManager至少有一个slot)
· 默认情况下,Flink 允许子任务共享slot,即使它们是不同任务的子任务;这样的结果是,一个slot可以保存作业的整个管道
· Task slot是静态的概念,是指TaskManager具有的并发执行能力
程序与数据流(DataFlow)
所有的Flink程序都是由三部分组成的:Source、Transformation和sink
Source负责读取数据源,Transformation利用各种算子进行处理加工,Sink负责输出