0. 思维导图
1. 简单介绍一下Flink♥♥
Flink是一个分布式的计算框架,主要用于对有界和无界数据流进行有状态计算,其中有界数据流就是值离线数据,有明确的开始和结束时间,无界数据流就是指实时数据,源源不断没有界限,有状态计算指的是在在进行当前数据计算的时候,我们可以使用之前数据计算的结果。Flink还有一个优点就是提供了很多高级的API,比如DataSet API、DataStream API、Table API和FlinkSQL。Flink的主要特点大概就是这些!
2. Flink和SparkStreaming区别♥
我觉得他们区别还是挺大的,其中最大的三点如下:
- 计算速度的不同,Flink是真正的实时计算框架,而sparkStreaming是一个准实时微批次的计算框架,也就是说,sparkSteaming的实时性比起Flink差一些。
- 架构模型不同,SparkStreaming在运行时的主要角色包括:Driver、Executor,而Flink在运行时主要包含:JobManager、TaskManager。
- 时间机制不同,sparkStreaming只支持处理时间,而Flink支持的时间语义包括处理时间、事件事件、注入时间,并且还提供了watermark机制来处理迟到数据。
3. Flink的重启策略你了解吗
重启策略就是说job失败之后如何重启,Flink支持不同的重启策略,包括固定延迟重启策略、失败率重启策略、无重启策略。
我是在使用检查点的时候,遇到过Flink重启的问题,我设置了检查点,但是实际上有一个地方会抛出异常,但是程序始终不抛出异常,并且一直输出异常之前的输出语句,这个时候就是因为Flink在开启checkpoint的情况下,重启策略会自动进行重启。
4. Flink的运行依赖于hadoop组件吗
Flink可以完全独立于Hadoop,在不依赖Hadoop组件下运行。但是在实际的大数据应该场景下,Hadoop体系是任何大数据框架都绕不过去的。Flink可以和Yarn集成做资源调度,也可以读写HDFS,或者利用HDFS做检查点。
&emsp' 总结一句话:可以但是没必要。
5. Flink集群中有哪些角色?各自有什么作用♥
slot:每一个taskmanager都包含一定数量的slot,指taskmanager具有的并行执行能力(静态概念)
并行度:taskmanager运行程序的时候实际使用的并行能力(动态概念)
- jobmanager:相当于一个集群的Master,是整个为集群的协调者,负责接收job。
- taskmanager:负责实际执行计算的Worker
- client:它是Flink程序提交的客户端,当用户提交一个Flink程序时,会首先创建一个Client。
6. 简述Flink运行流程(基于Yarn)♥♥
首先Flink的客户端将作业提交给Yarn的RM,然后RM会分配container,并且选择合适的NM启动ApplicationMaster,然后AM启动jobmanager向RM申请资源启动taskManager,然后jobManager就可以分配任务给taskManager。
7. max算子和 maxBy算子的区别♥
这两个算子都是基于KeyedStream求最大值。不同点如下:
- max: 将原来的数据的该字段替换为最大值,然后返回该记录,返回的数据不是原来的数据。
- maxBy:会把该字段最大的整条记录全部返回,返回的数据还是原来的数据。
8. Connect算子和Union算子的区别♥
他们之间的主要区别如下:
- union算子的两个流类型必须是一样的,而connect算子的两个流类型可以不一样。
- union算子可以连接多个流,而connect算子只能连接两个流。
9. Flink的时间语义有哪几种♥♥♥
- event time: 表示事件创建的时间,通常由事件中的时间戳描述。
- ingestion time: 表示数据进入Flink的时间。
- processing time: 表示执行算子的本地系统时间。
- 总结一句话:在Flink的流式处理中,绝大部分的业务都会使用eventTime。
10. 谈一谈你对watermark的理解♥♥♥
只有考虑事件时间语义,才会发生乱序(到达窗口的事件先后顺序和事件的事件先后顺序不一致)
我先说一下watermark是什么,它就是一种特殊的时间戳,作用就是为了让事件事件慢一点,等迟到的数据都到了,才触发窗口计算。我举个例子说一下为什么会出现watermark?
比如现在开了一个5s的窗口,但是2s的数据在5s数据之后到来,那么5s的数据来了,是否要关闭窗口呢?可想而知,关了的话,2s的数据就丢失了,如果不关的话,我们应该等多久呢?所以需要有一个机制来保证一个特定的时间后,关闭窗口,这个机制就是watermark
什么是watermark呢?
- 我的理解是,watermark是一种特殊的时间戳,等于直到当前事件发现的最大事件事件减去设定延迟的时间assignTimestampsWithWatermarks
- 它的作用说简单点,就是让事件时间慢一点,等到迟到的数据都到了,才去触发窗口计算。
- 当watermark等于窗口时间的时候,就会触发计算。
11. Flink对于迟到或者乱序数据是怎么处理的♥♥♥
- watermark设置延迟时间
- window的allowedLateness方法,可以设置窗口允许处理迟到数据的时间
- window的sideOutputLateData方法,可以将迟到的数据写入侧输出流
12. Flink中,有哪几种类型的状态,你知道状态后端吗♥♥
主要有两种类型的状态,包括operator state 和keyed state,operator state 和 key无关,而keyed state和key有关。
- operator state【算子状态】:该类型的状态,对于同一个任务而言,是共享的
- keyed state【键控状态】:每一个key都会保存一个状态
状态后端就是用来保存状态的东西,状态可以理解为一个本地变量。Flink的状态在底层是如何保存的呢?因此需要一个人东西来进行状态的存储、访问和维护,这个东西就是状态后端。分为以下三种:
- MemoryStateBackend:内存级的状态后端,会将状态作为内存中的对象进行管理,将他们存储在TaskManager的JVM堆上。而将checkpoint存储在JobManager的内存中。
- FsStateBackend:将checkpoint存到远程的持久化文件系统上。而对于本地状态,跟MemoryStateBackend一样,也会存在TaskManager的JVM堆上。
- RocksDBStateBackend:将所有状态序列化后,存入本地的RocksDB中存储。
13. Flink是如何做容错的?
Flink实现容错主要靠强大的checkpoint机制和State机制。Checkpoint负责定时制作分布式快照、对程序中的状态进行备份;State用来存储计算过程中的中间状态。
state 和 checkpoint之间的区别如下:
- state存储的是某一个操作的运行状态或者历史值,维护在内存中。
- checkpoint存储的是某一时刻所有操作的当前状态的快照,存在于磁盘中。
14. Flink是如何保证Exactly-once语义的♥♥♥
- at-most-once: 什么都不干,既不恢复丢失的状态,也不重播丢失的数据。
- at-least-once:一些事件可能被处理多次
- exactly-once:没有事件丢失,并且对于每一个事件,有且仅有处理一次。
整个端到端的一致性级别取决于所有组件中一致性最弱的组件
端到端的一致性包括如下:
- 内部保证:依赖checkpoint
- source端:需要外部源可重置偏移量
- sink端:需要保存从故障恢复时,数据不会重复写入外部系统
- 幂等性写入:同一份数据无论写入多少次,只保证一份结果
- 事务性写入:
- 两种实现方式:WAL和2PC
- WAL(预写日志):把结果数据先写入log文件中,然后在收到checkpoint完成的通知时,一次性写入sink系统。
- 2PC(两阶段提交):对于每个checkpoint,sink任务会启动一个事务,并将接下来所有接收的数据添加到事务里;然后将这些数据写入外部sink系统,但不提交他们(这时只是预提交);当收到checkpoint完成的通知时,它才正式提交事务,实现结果的真正写入。
如何确保精准一次性呢?
-
使用checkpoint检查点,其实就是所有任务的状态,在某个时间点的一份快照;这个时间点,应该时所有任务都恰好处理完一个相同的输入数据的时候。
-
checkpoint的步骤:
- Flink应用在启动的时候,Flink的jobManager创建CheckPointCoordinator
- CheckpointCoodinator(检查点协调器)周期性的向该流应用的所有source算子发送barrier(屏障)
- 当某个source算子收到一个barrier时,便暂停数据处理过程,然后将自己的当前状态制作成快照,并保存到指定的持久化存储(hdfs)中,最后向CheckpointCoordinator报告自己快照制作情况,同时向自身所有下游算子广播该barrier,恢复数据处理。
- 下游算子收到barrier之后,会暂停自己的数据处理过程,然后将自己的相关状态制作成快照,并保存到指定的持久化存储中,最后向CheckpointCoordinator报告自身快照情况,同时向自身所有下游算子广播该barrier,恢复数据处理。
- 每个算子按照上面这个操作不断制作快照并向下游广播,直到最后barrier传递到sink算子,快照制作完成。
- 当CheckpointCoordinator收到所有算子的报告之后,认为该周期的快照制作成功;否则,如果在规定的时间内没有收到所有算子的报告,则认为本周期快照制作失败。
-
检查点的保存
- 在Flink中,检查点的保存时周期性触发的,间隔时间可以进行设置
- 当所有任务都恰好处理完一个相同的输入数据的时候,将它们的状态保存下来
-
checkpoint 和 savepoint的区别:
- 目的: checkpoint重点时在于自动容错,savepoint重点在于手动备份、恢复暂停作用
- 触发者:checkpoint是Flink自动触发,而savepoint是用户主动触发
- 状态文件保存:checkpoint一般会自动删除;savepoint一般都会保留下来,除非用户去做相应的删除操作。
15. Flink是如何处理反压的
Flink内部是基于producer-consumer模型来进行消息传递的,Flink的反压设计也是基于这个模型。Flink使用了高效有界的分布式阻塞队列,就像java通用的阻塞队列(BlockingQuequ)一样。下游消费者消费变慢,上游就会收到阻塞。
16. Flink是如何支持批流一体的♥
Flink使用一个引擎就支持了DataSetAPI和DataStream API。其中DataSet API 用来处理有界流,DataStream API 既可以处理有界流又可以处理无界流,这样就实现了流批一体。
17. 你用过Flink CEP吗,简单介绍一下♥
- 说一下我的理解,CEP就是用来从无界流中得到满足一定规则的复杂事件。
- 我之前在做用户行为分析的时候,做过一个需求:如果有用户5s内连续登录3次,就报警输出该用户:
- 使用CEP编程特别简单,首先定义一个匹配模式(begin where next where within),调用Pattern中的方法,然后将匹配模式应用到数据流上,调用CEP.pattern方法,最后检测出符合匹配条件的复杂事件,进行转换处理,输出报警信息。