Flink面试题

1.flink处理迟到数据

(1)watermark

AssignerWithPeriodicWatermarks

当flink基于eventtime的时间窗口处理数据时,必须确定所有该时间窗口内的数据全都进入之后,才会开始处理数据,由于数据可能是乱序的,在watermark里面有个时间戳,flink会使用watermark标记所有小于该时间戳的消息都已流入,当操作符处理到WaterMark时,它对所有小于该WaterMark时间戳的时间窗口的数据进行处理并发送到下一个操作符节点,然后也将WaterMark发送到下一个操作符节点

(2)允许窗口处理迟到数据

对于窗口计算,如果水位线已经到了窗口结束时间,默认窗口就会关闭,那么迟到数据就要被丢弃,因此可以设置延迟时间,允许继续处理迟到数据的。默认情况下延迟时间为0,若设置延迟时间后,watermark超过窗口结束时间戳,但未超过 延迟后的时间戳,迟到数据仍然可添加到窗口中,触发计算。
中间过程可视为,在水位线到达窗口结束时间时,先快速地输出一个近似正确的计算结果;然后保持窗口继续等到延迟数据,每来一条数据,窗口就会再次计算,并将更新后的结果输出。逐步修正计算结果,最终得到准确的统计值。

(3)将迟到数据放入侧输出流

窗口后关闭,仍然有迟到数据,则用侧输出流来收集关窗后的迟到数据,保证数据不丢失。因为窗口已经真正关闭,只能将之前的窗口计算结果保存下来,然后获取侧输出流中的迟到数据,判断数据所属的窗口,手动对结果进行合并更新

2.Task subtask 区别

在flink web ui 上,点开webui,会有很多的块,块和块之间是箭头相连的,这一个块就是一个task,这个块里面包含了多个操作算子,比如map,filter,task会把这多个操作算子连成一个chain,前提并行度相同并且没有重分区

而subtask就是点开task后里面的并行度,比如有3个并行度,就有3个subtask,每个subtask会以一个独立的线程去运行

3.webui

flink webui上有哪些东西

taskmanager taskslot 可用taskslot 还有flink作业图 checkpoint metrics

4.flink容错机制

flink发生故障恢复时:

(1)首先,flink在运行的时候,会周期性的保存checkpoint,这个checkpoint,就是某个时间点,对所有任务状态的一个快照。

(2)如果flink在运行时发生了故障,第一步就是重新启动

(3)然后flink会从上一次的checkpoint中读取状态,将状态重置,从检查点重置后,此时的状态与检查点完成时的状态完全相同

(4)然后开始消费并处理检查点到发生故障之间的所有数据

(5)这种检查点的保存和恢复机制可以为应用程序提供“精确一次”(exactly-once)的一致性,因为所有的算子都会保存检查点并恢复其所有的状态,这样一来所有的输入流就都会被重置到检查点完成时的位置

Flink检查点算法——基于Chandy-Lamport分布式快照算法的异步分界线快照(Asynchronous Barrier Snapshotting)算法

(1)Flink 的检查点算法使用分界线barrier将checkpoint分隔开,每两个barrier之间形成一个checkpoint

(2)JobManager 会向每个 source 任务发送一条带有新检查点ID的消息,通过这种方式来启动检查点

(3)数据源source将它们的状态写入检查点,并发出检查点barrier。StateBacknd在状态存入检查点之后,会返回通知给source任务,source任务就会向JobManager确认检查点完成(异步操作)。(数据源source发barrier给statebackend,statebackend存入barrier后会返回通知给source,source任务向jobmanager确认checkpoint完成,然后barrier向下游移动)

(4)分界线对齐:barrier向下游传递,对于有多个数据源的情况下,会等待所有输入分区的barrier到达。对于barrier已经到达的分区,继续到达的数据会被缓存。而barrier尚未到达的分区,数据会被正常处理。

(5)当收到所有输入分区的barrier时,任务就会将其状态异步保存到StateBackend的检查点中,然后将barrier继续向下游转发。

(6)Sink任务向JobManager确认状态后保存到checkpoint完毕(异步操作)。当所有任务都确认已经成功将状态保存到检查点时,检查点就真正完成了。

flink是如何保证顺序性的:

因为每一个 barrier 的作用,仅仅是把数据流切分为两部分:barrier 之前、barrier 之后。flink里面数据传输时的管道是 FIFO的。由于存在 FIFO 的保证,barrier 之前的数据不会在传输的过程中跑到 barrier 之后去,保证了在单数据源情况下它的一个顺序性。但是在多数据源情况下,可能会有乱序的可能性,此时flink有个barrier对齐的操作。barrier向下游传递,对于有多个数据源的情况下,会等待所有输入分区的barrier到达。对于barrier已经到达的分区,继续到达的数据会被缓存。而barrier尚未到达的分区,数据会被正常处理

5.flink维表join

事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL, HBase)。 对于每条流式数据,可以关联一个外部维表数据源,为实时计算提供数据关联查询。维表可能是会不断变化的,在维表JOIN时,需指明这条记录关联维表快照的时刻。需要注意是,目前Flink SQL的维表JOIN仅支持对当前时刻维表快照的关联(处理时间语义),而不支持事实表rowtime所对应的的维表快照。

维表join的几种方式

一 将维表预加载到内存关联

实现方式:

定义一个类实现RichFlatMapFunction,在open()方法中读取全部数据加载到内存中。

优缺点:

因为存在内存中,所以仅支持小数据量维表;因为open方法中读取,所以维表变化需要重启作业。

二 热存储关联查询

实现方式:

将维度数据导入到热存储redis等,通过异步IO的方式查询,利用cache机制将维度数据缓存在内存。

优点:维度数据量不受内存限制,可以存储很大的数据量。

缺点:因为维表数据在外部存储中,读取速度受制于外部存储的读取速度;另外维表的同步也有延迟。

三 广播维表

实现方式:

利用Flink的Broadcast State将维度数据流广播到下游做join操作。特点如下:

优点:维度数据变更后可以即时更新到结果中。

缺点:数据保存在内存中,支持的维度数据量比较小。

四 通过Distributed Cache分发本地维度文件到task manager后加载到内存关联

实现方式:

通过env.registerCachedFile注册文件

实现RichFunction在open()方法中通过RuntimeContext获取cache文件

解析使用文件数据

优缺点:

不需要外部数据库

支持的数据量小,更新维表配置文件需要重启作业

6.Flink CDC 与MySQL数据同步

在实际开发中,需要做数据同步的场景是非常多的,以同步mysql数据为例,当下游应用需要通过监控上游的mysql某个表的数据变化来完成自身的业务时,可以考虑另一种方式,即Flink CDC,其底层的核心原理都是通过监控mysql的binlog的日志变化,从而进行日志解析,得到变化的数据

CDC是(change data capture),翻译过来就是 捕获数据变更。通常数据处理上,我们说的 CDC 技术主要面向 数据库的变更,是一种用于捕获数据库中数据变更的技术。

它的使用场景(作用)主要有:

        1- 数据同步,用于备份,容灾

        2- 数据分发,一个数据源分发给多个下游

        3- 数据采集(E),面向数据仓库/数据湖的 ETL 数据集成

根据实现机制可以分为两个方向,基于查询和基于日志。

基于查询是就是select进行全表扫描过滤出变更的数据。

基于日志就是连续实时读取数据库的操作log,例如mysql的binlog

7.flink statebackend 和 checkpoint

flink statebackend和checkpoint
statebackend负责啥:
1.本地的状态管理,来一条数据,状态更新一次,负责状态的读取、更新、输出
2.将检查点checkpoint写入外部存储

checkpoint:
1.是某一个瞬间数据状态的一个快照

8.flink窗口有哪些

(1)时间窗口

滚动时间窗口

滑动时间窗口

会话窗口

(2)计数窗口

滚动计数窗口

滑动计数窗口

9.flink有哪些组件

resourcemanager资源管理器,负责管理集群的资源,调配资源(slot)
resourcemanager主要负责管理taskmanager的插槽(slot),flink为不同的资源管理工具提供了不同的资源管理器,比如yarn,k8s,standalone部署


jobmanager作业管理器,负责管理整个作业
jobmanager是控制一个应用程序执行的主进程,再收到一个job任务后,会生成一个执行图(executiongraph),然后向resourcemanager请求资源,也就是taskmanager上的插槽(slot),获得资源后,会将执行图分发到taskmanager上,由taskmanager具体去干活,而在运行过程中,jobmanager会负责所有需要中央协调的操作,比如检查点checkpoint的操作


taskmanager任务管理器,负责干活的
taskmanager是flink的工作进程。通常在flink中会有多个taskmanager,每个taskmanager都有一定数量的插槽slot,插槽的数量限制了taskmanager可以执行的任务数量(也就是限制了最大并行数量)
在执行过程中,一个taskmanager可以和其他的taskmanger交换数据

一个jobmanager,下面有多个taskmanager,每个taskmanager里面有多个taskslot,taskmanager直接会有数据流动 

10.flink反压机制

如果消费者的消费速率较低,会降低生产者的生产速率,这种速率上的改变就通过flink分布式阻塞队列进行控制,这个队列容量是用缓冲池实现的。对于每个生产者和消费者而言,他有一个单独的缓冲池localbufferpool,对于所有的生产者和消费者,他们有一个共同的缓冲池networkbufferpool,如果消费者端来不及消费,会导致消费者端消息积压,消费者端的localbufferpool里面的空间会被不断占据,进而导致无法再向消费者端的localbufferpool里面写数据,发生了阻塞,随后这种阻塞会向上游进行传递,从消费者端向上传递至生产者端,当这种阻塞的压力传递着生产者端时,生产者端会降低从外部组件读取数据的速率,例如source端会降低从kafka端读取的速率,从而降低负载。整个链路其实就是消费者端会将压力从下游传递给上游,上游通过降低读取速率帮助下游缓解消费压力。

如果下游消费者端的负载能力提升后,会及时反馈给生产者,生产者会提升从 source 端读取数据的速率,从而提升整个系统的负载能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值