绿色为未确认的部分
是一种大数据计算引擎,用于对无界(流数据)和有界(批数据)数据进行有状态计算。
特点
1)批流一体:统一批处理、流处理
2)分布式:Flink程序可以运行在多台电脑上
3)高性能:处理速度很快
4)高可用:Flink支持高可用性(HA)
5)Flink可以保证数据处理的准确性,及时出现问题,也能进行修正
1)Deploy(部署)层
①本地模式:启动单个JVM让Flink以Local模式运行。
②集群模式运行:standalone(flink自己管理自己的资源)、yarn(yarn管理集群资源)
③运行在云服务器
2)Core层:runtime运行时的核心技术
3)API层
在runtime之上提供了两套核心api:DataStream API(流处理)、DataSet API(批处理)。
4)应用框架层(用于满足特定应用)
datastream:CEP(Event Processing复杂事件处理)、Table(Relational关系型数据库处理)
dataset :Table(关系型数据库)、flinkML(机器学习)、Gelly(图计算)
绿色:流处理 蓝色:批处理
输入Connectors(左侧部分)
流处理:kafka等
批处理:HDFS、HBase等
输出Connectors(右侧部分)
流处理:kafka、elasticsearch(全文检索)、HDFS rolling file(滚动文件)
批处理:HBase、HDFS
1)无限流处理:输入的数据像水一样源源不断
2)有限流处理:一次处理一部分数据
1)flink在处理有限流和无线流时,都可以保存处理状态。
2)可以将第一个子任务的处理结果形成一个状态,将状态保存起来(可以保存在内存中,也可以持久化大到外部存储系统中)。当前状态保存了其中一个子任务处理的中间结果。
3)优点:在第一个任务的位置挂掉了,程序重新启动时,不在需要把第一个任务和之前任务进行重新计算,可以直接找到第一个子任务的状态,用它快读恢复输出结果。甚至可以是直接把输出结果保存到状态里,直接读取出来即可。
如果需要保证exactly-once或者at least once不能选择strom.且strom不能处理大量数据.
如果项目已经使用spark框架,并且实时性要求不高,选择spark streaming
满足exactly once,数据量大,高吞吐,低延迟需求,要进行状态管理和窗口统计,选择flink。
Flink是经典的Master、Worker结构,jobManager就是Master,TaskManager就是Slave
①协调分布式执行,他们用来调度task,协调检查点(CheckPoint),协调失败时恢复等。
②Flink运行时至少存在一个JobManager处理器,如果配置高可用则会存在多个JobManager处理器,它们其中有一个是leader,一个是standby。
③jobManager接受的应用包括jar和jobGraph(提交任务后生成的逻辑视图)
①主要职责是从JobManager处接收任务,并部署和启动任务,接收上游的数据并处理。
②TaskManager是在JVM中的一个或多个线程中执行任务的工作节点。
③TaskManager在启动的时候会向ResourceManager注册自己的资源信息(Slot的数量等)。
针对不同的环境和资源提供者(Yarn、Kubernetes或独立部署),Flink提供了不同的ResourceManager。
作用:负责管理Flink的处理资源单元--Slot。
①作用:提供一个REST接口(即http的url),来通过这个url把flink应用程序提交到Flink集群。
②一旦一个应用提交执行,Dispatcher会启动一个JobManager,并将应用转交给他。
③Dispatcher还会启动一个webUI来提供有关作业执行信息。
注意:某些应用的提交执行的方式,有可能用不到Dispatcher。
1)Applicatiojn(应用):包括jar(程序打成的jar包)和JobGraph(逻辑视图,根据代码所描绘的逻辑生成的)
2)Dispatcher:通过REST接口接收到了应用,立即去通知JobManager
3)JobManager在集群中启动,将应用程序中的JobGraph(逻辑视图)转化成为ExecutorGraph(物理视图,包含每个算子的子任务)
4)JobManager向ResourceManager申请资源,ResourceManager分配完资源后,把资源信息返回给JobManager(3台TaskManager中的6个slot正好够你用)。
slot是TaskManager中真正干活的空间,每个slot占据固定的资源(cpu和内存)
5)JobManager将自己的每个任务发送到TaskManager的slot中去执行。
代码所描述的逻辑生成的逻辑视图(jobGraph)
注:operator(操作)
①source数据源
定义Flink从哪里加载数据,Flink在流处理和批处理上的source大概有4类:基于本地集合的source、基于文件的source、基本网络socket的source。自定义的source:图中的env.addSource是自定义的数据源,即从其他组件读取数据:如kafka
②在transformation转换操作,也成为算子
有map、flatMap、Filter、keyBy、Reduce、window等,可以将数据转换成你想要的形式。
③在sink接收器,将结果输出。
Flink常见的sink大概有如下几类:写入文件、写入socket、自定义的sink:图中的addSink是自定义的sink,可以将结果写入kafka、mysql、es、hdfs等。
①Task是一个阶段多个功能相同的SubTask的集合,类似于Spark的TaskSet。
②SubTask(子任务)是Flink中任务最小执行单元。比如一个map操作,分布式场景下会再多个线程中同时运行,每个线程中执行的都叫做一个SubTask。
Flink会进行一个优化:将两个或者多个子任务(subTask)形成一个操作器链。
形成操作器链的子任务有一定的条件:相同的并行度,在本地进行数据传输,不涉及shuffle过程,满足这样的条件,就可以将两个子任务连到一起,形成一个操作器链。
Flink在处理任务间的数据传输过程中依赖了缓冲区机制。
一个TaskManager是一个进程,一个TaskManager中有多个slot,这个进程里的每个slot都是一个线程。任务槽用来执行具体的子任务(subTask)。
用同一个slot执行多个subtask(这些subTask一定来自于同一个应用)。
优点:不浪费任务任务槽中的资源。缺点:每个运行在相同slot中的子任务,无法相互独立,一旦有一个subTask执行失败,会将这个slot的线程杀死。