1.什么是flink?
Apache Flink十一个能够提供毫秒级延迟,同时有保证了数据处理的低延迟、高吞吐和结果的正确性的框架和分布式处理引擎,用于对无界流和有界流进行状态计算
2.Flink 的重要特点?
- 事件驱动型
- 基于流的世界观
在Flink的世界观中,一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流,这就是所谓的有界流和无界流。 - 分层API
越顶层越抽象,表达含义越简明,使用越方便
越底层越具体,表达能力越丰富,使用越灵活
3.什么是有界流和无界流?
无界数据流:有定义流的开始,但没有定义流的结束,他们会无休止的产生数据,必须持续的实时处理,要求以特定的顺序摄取事件
有界流数据:通常被我们成为批处理,定义流的开始,也有定义流的结束,可以在摄取到所有数据后再进行计算,有节流所有数据可以被排序
4.flink的其他特点?
1)支持事件时间(event- time)和处理时间(processing time)
2)精确一次的状态一致性保证
3)低延迟,每秒处理数百万个事件,毫秒级延迟
4)与众多常用存储系统的连接。高可用,动态扩展,实现7*24小时全天候运行
5.flink和sparkStreaming 对比?
可以从数据模型和运行架构进行对比
-
spark采用RDD模型,spark streaming的DStream实际上也就是一-组 组小批数据RDD的集合。
-
flink基本数据模型是数据流,以及事/件序列。
-
运行架构
-
是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个。
-
flink是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理。
-
6.spark DAG 如何划分stage?
- (将窄依赖尽量放在在同一个stage中,可以实现流水线计算)。
- 对于宽依赖,由于有shuffle的存在,只能在父RDD处理完成后,才能开始接下来的计算,也就是说需要要划分stage(出现宽依赖即拆分)。
- stage的切割规则:从后向前,遇到宽依赖就切割stage。
7.flink 运行的组件?
jobManager:作业管理器
taskManager:任务管理器
resourceManager:资源管理器
dispacher:分发器
8.jobmanager 的什么作用?
- 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的jobManager所控制。
- jobManager会先接收到要执行的应用程序,这个应用程序会包括:作业图,逻辑数据流图和打包了所有类、库和其它资源的jar包。
- jobManager会把jobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”,包含了所有可以执行的任务。
- jobManager会向资源管理器(resourceManager)请求执行任务必要的资源,也就是任务管理器(taskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的taskManager上。而在运行过程中,jobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调
9.jobmanager接收到的应用程序包含?
作业图(JobGraph),逻辑数据流图(logic dataflow graph)和打包了所有类、库和其它资源的jar包。
10.taskManager 的什么作用?
flink中的工作进程。通常在flink中会有多个taskManager运行,每一个taskManager都包含了一定数量的插槽(solts)。插槽的数量限制了taskManager能够执行的任务数量。
11.resourceManager的作用?
主要负责管理任务管理器(taskManager)的插槽(solt),taskManager插槽是flink中定义的处理资源单元。
12.flink的资源管理器有哪些?
flink为不同的环境和资源管理工具提供不同的资源管理工具,比如YARN、Mesos、K8s,以及standalone部署。
13.Dispatcher的作用?
当一个应用被提交执行时,分发器就会启动并将应用移交给一个jobManager,dispatcher还会启动一个web UI用来方便的展示和监控作业执行的信息
15.taskManager 通过什么控制task数量?
task的数量由taskManager内包含的slots的总数量决定,slot的总数量也决定了任务执行的并行度
16.flink 是否允许任务共享slot?
默认情况下,flink允许子任务共享slot,即使它们是不同的子任务。这样的结果是,一个slot可以保存作业的整个管道。
17.flink程序包含那几部分?
所有的flink程序都是由三部分的:source 、TransforMation和sink
18.flink 的执行图包含那四部分?
StreamGraph->jobGraph->ExecutionGraph->物理执行图
19.什么是StreamGraph?
是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构
20.什么是JobGraph?
StreamGraph经过优化后生成JobGraph,提交给JobManager的数据结构。主要优化为,将多个符合条件的节点chain(链)在一起作为一个节点。
21.什么是ExecutionGraph?
JobManager根据JobGraph生成ExecutionGrouph。ExectionGrouph是JobGrouph的并行化版本,是调度层最核心的数据结构
22.什么是物理执行图?
JobManager根据ExectionGrouph对Job进行调度后,在各个taskManager上部署task后形成的“图”,并不是一个具体的数据结构。
23.什么是并行度?
一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。一个程序中,不同的算子可能具有不同的并行度。
24.什么是stream最大并行度?
一般情况下,一个stream的并行度,可以认为就是其所有算子中最大的并行度。
25.算子的数据传输 2种形式?
- One-to-one:stream维护者分区以及元素的顺序(比如source和map之间)。这就意味着map算子的子任务看到的元素的个数以及顺序跟source算子的子任务生产的元素的个数、顺序相同。map、fliter、flatmap、等算子都是one-to-one的对应关系。
- Redistributing:stream的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如:keyBy基于hashCode重分区、而broadcast和rebalance会随即重新分区,这些算子都会引起redistribute过程,而redistribute过程就类似于spark中的shuffle过程。
26.flink 的任务链?
- flink采用了一种称为任务链的优化技术,可以在特定的条件下减少本地雍熙的开销。为了满足任务链的要求,必须将两个或者多个算子设为相同的并行度,并通过本地转发(local forward)的方式进行连接
- 相同并行度的 one-to-one操作,flink这样相连的算子链接在一起形成一个task,原来的算子成为里面的subtask
- 并行度相同、并且是one-to-one操作,两个条件缺一不可
27.满足任务链的要求?
并行度相同、并且是one-to-one操作,两个条件缺一不可
28.flink 流split ,select?
DataStream → SplitStream:根据某些特征把一个 DataStream 拆分成两个或者多个 DataStream。
SplitStream→DataStream:从一个 SplitStream 中获取一个或者多个 DataStream。Select 就是获取分流后对应的数据
29.流的connect 和 union 的区别
Connect 与 Union 区别:
- Union 之前两个流的类型必须是一样,Connect 可以不一样,在之后的coMap 中再去调整成为一样的。
- Connect 只能操作两个流,Union 可以操作多个。
30.flink的数据类型?
- 基础数据类型
Flink支持所有的Java和Scala基础数据类型,Int, Double, Long, String, …
- Java和Scala元组(Tuples)
- Scala样例类(case classes)
- Java简单对象(POJOs)
- 其它(Arrays, Lists, Maps, Enums, 等等)
Flink对Java和Scala中的一些特殊目的的类型也都是支持的,比如Java的ArrayList,HashMap,Enum等等。
31.什么是富函数? 富函数有什么作用?
“富函数“是 DataStream API 提供的一个函数类的接口,所有 Flink 函数类都有其 Rich 版本。它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能
32.flink window的类型?
(1) TimeWindow
- Tumbling Window (滚动窗口)
- Sliding Window (滑动窗口)
- Session Window (会话窗口)
(2) Count Window(计数窗口)
- 滑动计数窗口
- 滚动计数窗口
(3) 全局窗口
- Global Window (全局窗口)
33.window function 有哪些?
-
window function 定义了要对窗口中收集的数据做到计算操作
-
可分为两类:
- 增量聚合函数(incremental aggregation functions)
1、每条数据到来就进行计算,保持一个简单的状态
2、ReduceFunction, AggregateFunction
- 全窗口函数(full window functions)
1、先把窗口所有数据收集起来,等到计算的时候会遍历所有数据
2、ProcessWindowFunction
34.flink 的时间语义?
Event Time:事件创建的时间
Ingestion Time:数据进入Flink的时间
Processing Time:执行操作算子的本地系统时间,与机器相关
35.乱序数据有什么影响?
- 当Flink 以Event Time模式处理数据流时,它会根据数据里的时间戳来处理基于时间的算子
- 由于网络、分布式等原因,会导致乱序数据的产生
- 乱序数据会让窗口计算不准确
36.什么是watermark?
- Watermark是一种衡量Event Time进展的机制,可以设定延迟触发
- Watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用Watermark机制结合window来实现;
- 数据流中的Watermark用于表示timestamp小于Watermark的数据,都已经到达了,因此,window的执行也是由Watermark触发的。
- watermark用来让程序自己平衡延迟和结果正确性
37.watermark的特点?
- watermark是一条特殊的数据记录
- watermark必须单调递增,以确保任务的事件时间时钟在向前推进,而不是在后退
- watermark与数据的时间戳相关
38.flink 状态管理包含哪些?
状态一致性,故障处理以及高效存储和访问,以便开发人员可以专注于应用程序的逻辑。
39.flink 状态的类型?
- 算子状态(Operator State)
算子状态的作用范围限定为算子任务 - 键控状态(Keyed State)
根据输入数据流中定义的键(key) 来维护和访问
40.算子状态的特点?
- 状态对于同一任务而言是共享的
- 算子状态不能由相同或不同算子的另一个任务访问
41.算子状态的数据结构?
列表状态(List state):将状态表示为一组数据的列表
- 联合列表状态(Union list state):也将状态表示为数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint) 启动应用程序时如何恢复
广播状态(Broadcast state):如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态。
42.键控状态特点?
键控状态是根据输入数据流中定义的键(key) 来维护和访问的。Flink为每个key维护一一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个key对应的状态。 当任务处理一条数据时, 它会自动将状态的访问范围限定为当前数据的key
43.键控状态的数据结构?
- 值状态(Value state):将状态表示为单个的值
- 列表状态(List state):将状态表示为一组数据的列表
- 映射状态(Map state):将状态表示为一-组Key-Value对
- 聚合状态(Reducing state & Aggregating State): 将状态表示为一个用于聚合操作的列表
44.是状态后端?
状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端(state backend)
45.后端的职责?
状态后端主要负责本地的状态管理和将检查点(checkpoint)的状态写入远程存储这件事
46.状态后端的类型?
- MemoryStateBackend
内存级的状态后端,会将键控状态作为内存中的对象进行管理,将它们存储在TaskManager的JVM堆上,而将checkpoint存储在JobManager的内存中- 特点:快速、低延迟,但不稳定
- FsStateBackend
将checkpoint存到远程的持久化文件系统(FileSystem) 上,而对于本地状态,跟MemoryStateBackend一 样,也会存在TaskManager的JVM堆上- 同时拥有内存级的本地访问速度,和更好的容错保证
- RocksDBStateBackend
将所有状态序列化后,存入本地的RocksDB中存储。
47.什么是processfunction 函数?
ProcessFunction是一个低阶的流处理操作,它可以访问流处理程序的基础构建模块:
- 事件(event)(流元素)
- 状态(state)(容错性,一致性, 仅在keyed stream中)
- 定时器(timers)(event time和processing time,仅在keyed stream中)
ProcessFunction可以看作是一个具有keyed state和timers访问权的FlatMapFunction
-
通过RuntimeContext访问keyed state
-
计时器允许应用程序对处理时间和事件时间中的更改作出响应。对processElemet…)函 数的每次调用都获得一个Context对象,该对象可以访问元素的event time timestamp和TimerService
-
TimerService’可用于为将来的event/process time瞬 间注册回调。当到达计时器的特定时间时,将调用onT1imer…)方法。在该调用期间,所有状态都再次限定在创建计时器时使用的键的范围内,从而允许计时器操作键控状态
48.processfunction 函数有哪些?Flink 提供了 8 个 Process Function:
ProcessFunction
KeyedProcessFunction
CoProcessFunction
ProcessJoinFunction
BroadcastProcessFunction
KeyedBroadcastProcessFunction
ProcessWindowFunction
ProcessAllWindowFunction
49.什么是侧输出流?
Flink中的侧输出就是将数据流进行分割,而不对流进行复制的一种分流机制,flink的侧输出的另一个作用就是对延时迟到的数据进行处理,这样就可以不必丢弃迟到的数据。
50.flink 故障恢复机制的核心?
flink故障恢复机制的核心,就是应用状态的一致性检查点。
51.什么是有状态的一致性检查点?
有状态流应用的一致检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一 份快照) ;这个时间点,应该是所有任务都恰好处理完一个相同的输入数据的时候
52.如何从检查点恢复状态?
- 遇到故障之后,第一步就是重启应用
- 第二步是从checkpoint中读取状态,将状态重置,从检查点重新启动应用程序后,其内部状态与检查点完成时的状态完全相同
- 第三步:开始消费并处理检查点到发生故障之间的所有数据
53.什么是保存点?
Flink提供的可以自定义的镜像保存功能,就是保存点
保存点时一个强大的功能,除了故障恢复外,保存点可以用于:由计划的手动备份,更新颖用程序,版本迁移,暂停和重启应用等等
54.检查点(checkpoint)和保存点(savepoint)的区别?
-
checkpoint的侧重点是“容错”,即Flink作业意外失败并重启之后,能够直接从早先打下的checkpoint恢复运行,且不影响作业逻辑的准确性。而savepoint的侧重点是“维护”,即Flink作业需要在人工干预下手动重启、升级、迁移或A/B测试时,先将状态整体写入可靠存储,维护完毕之后再从savepoint恢复现场。
-
savepoint是“通过checkpoint机制”创建的,所以savepoint本质上是特殊的checkpoint。
55.什么是状态一致性?
对于流处理器来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确,一条数据不因该丢失,也不应该重复计算。再遇到故障时可以恢复,恢复以后的重新计算,结果应该也是完全正确的
56.状态一致性的分类?
AT-MOST-ONCE (最多一次):At-most-once 语义的含义是最多处理一次事件。
AT-LEAST-ONCE (至少一次):at- least-once,意思是所有的事件都得到了处理,而一些事件还可能被处理多次。
EXACTLY-ONCE (精确一次):恰好处理一次是最严格的保证,也是最难实现的。恰好处理一次语义不仅仅意味着没有事件丢失,还意味着针对每一个数据, 内部状态仅仅更新一次。
57.端到端的精确性?
目前我们看到的一致性保证都是由流处理器实现的,也就是说都是在Flink流处理器内部保证的;而在真实应用中,流处理应用除了流处理器以外还包含了数据源(例如Kafka)和输出到持久化系统
- 端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每一个组件都保证了它自己的一-致性
- 整个端到端的一致性级别取决于所有组件中-一致性最弱的组件
58.什么是幂等写入?
所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用了
59.什么是2PC?
就是两阶段提交(Two-Phase-Commit)
对于每个checkpoint,sink任务会启动一个事务,并将接下来的接受到数据添加到事务里,然后写入外部sink系统,但是不提交他们,这个解读那称为预提交。当它收到checkpoint完成的同志,他才正式提交事务,实现结果的真正写入
60.flink和kafka端到端状态一致性的保证?
- 内部 – 利用checkpoint机制,把状态存盘,发生故障的时候可以恢复,保证内部的状态一致性
- source – kafka consumer作为source,可以将偏移量保存下来,如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性
- sink-- kafka producer作为sink,采用两阶段提交sink,需要实现一个TwoPhaseCommitSinkFunction
61.kafka精确一致性(Exactly-once ) 两阶段提交的步骤?
- 第一条数据来了之后,开启一个kafka的事务(transaction) ,正常写入kafka分区日志但标记为未提交,这就是“预提交”
- jobmanager触发checkpoint操作,barrier 从source开始向下传递,遇到barrier的算子将状态存入状态后端,并通知jobmanager
- sink连接器收到barrier,保存当前状态,存入checkpoint,通知jobmanager,并开启下一阶段的事务,用于提交下个检查点的数据
- jobmanager收到所有任务的通知,发出确认信息,表示checkpoint完成
- sink任务收到jobmanager的确认信息,正式提交这段时间的数据
- 外部kafka关闭事务,提交的数据可以正常消费了。