Flink面试题

0. 思维导图

在这里插入图片描述

1. 简单介绍一下Flink♥♥

  Flink是一个分布式的计算框架,主要用于对有界和无界数据流进行有状态计算,其中有界数据流就是值离线数据,有明确的开始和结束时间,无界数据流就是指实时数据,源源不断没有界限,有状态计算指的是在在进行当前数据计算的时候,我们可以使用之前数据计算的结果。Flink还有一个优点就是提供了很多高级的API,比如DataSet API、DataStream API、Table API和FlinkSQL。Flink的主要特点大概就是这些!

2. Flink和SparkStreaming区别♥

  我觉得他们区别还是挺大的,其中最大的三点如下:

  1. 计算速度的不同,Flink是真正的实时计算框架,而sparkStreaming是一个准实时微批次的计算框架,也就是说,sparkSteaming的实时性比起Flink差一些。
  2. 架构模型不同,SparkStreaming在运行时的主要角色包括:Driver、Executor,而Flink在运行时主要包含:JobManager、TaskManager。
  3. 时间机制不同,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算子的区别♥

  他们之间的主要区别如下:

  1. union算子的两个流类型必须是一样的,而connect算子的两个流类型可以不一样。
  2. union算子可以连接多个流,而connect算子只能连接两个流。

9. Flink的时间语义有哪几种♥♥♥

  1. event time: 表示事件创建的时间,通常由事件中的时间戳描述。
  2. ingestion time: 表示数据进入Flink的时间。
  3. processing time: 表示执行算子的本地系统时间。
  4. 总结一句话:在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的状态在底层是如何保存的呢?因此需要一个人东西来进行状态的存储、访问和维护,这个东西就是状态后端。分为以下三种:

  1. MemoryStateBackend:内存级的状态后端,会将状态作为内存中的对象进行管理,将他们存储在TaskManager的JVM堆上。而将checkpoint存储在JobManager的内存中。
  2. FsStateBackend:将checkpoint存到远程的持久化文件系统上。而对于本地状态,跟MemoryStateBackend一样,也会存在TaskManager的JVM堆上。
  3. 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的步骤:

    1. Flink应用在启动的时候,Flink的jobManager创建CheckPointCoordinator
    2. CheckpointCoodinator(检查点协调器)周期性的向该流应用的所有source算子发送barrier(屏障)
    3. 当某个source算子收到一个barrier时,便暂停数据处理过程,然后将自己的当前状态制作成快照,并保存到指定的持久化存储(hdfs)中,最后向CheckpointCoordinator报告自己快照制作情况,同时向自身所有下游算子广播该barrier,恢复数据处理。
    4. 下游算子收到barrier之后,会暂停自己的数据处理过程,然后将自己的相关状态制作成快照,并保存到指定的持久化存储中,最后向CheckpointCoordinator报告自身快照情况,同时向自身所有下游算子广播该barrier,恢复数据处理。
    5. 每个算子按照上面这个操作不断制作快照并向下游广播,直到最后barrier传递到sink算子,快照制作完成。
    6. 当CheckpointCoordinator收到所有算子的报告之后,认为该周期的快照制作成功;否则,如果在规定的时间内没有收到所有算子的报告,则认为本周期快照制作失败。
  • 检查点的保存

    1. 在Flink中,检查点的保存时周期性触发的,间隔时间可以进行设置
    2. 当所有任务都恰好处理完一个相同的输入数据的时候,将它们的状态保存下来
  • checkpoint 和 savepoint的区别:

    1. 目的: checkpoint重点时在于自动容错,savepoint重点在于手动备份、恢复暂停作用
    2. 触发者:checkpoint是Flink自动触发,而savepoint是用户主动触发
    3. 状态文件保存: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方法,最后检测出符合匹配条件的复杂事件,进行转换处理,输出报警信息。
  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值