• Flink面试题


    1.Flink 相比传统的 Spark Streaming 有什么区别?

    Flink 是标准的实时处理引擎,基于事件驱动。而 Spark Streaming 是微批(Micro-Batch)的模型。

    1. 架构模型Spark Streaming 在运行时的主要角色包括:Master、Worker、Driver、Executor,Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。

    2. 任务调度Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图DAG,Spark Streaming 会依次创建 DStreamGraph、JobGenerator、JobScheduler。Flink 根据用户提交的代码生成 StreamGraph,经过优化生成 JobGraph,然后提交给 JobManager进行处理,JobManager 会根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobManager 根据 ExecutionGraph 对 Job 进行调度。

    3. 时间机制Spark Streaming 支持的时间机制有限,只支持处理时间。 Flink 支持了流处理程序在时间上的三个定义:处理时间、事件时间、注入时间。同时也支持 watermark 机制来处理滞后数据。

    4. 容错机制对于 Spark Streaming 任务,我们可以设置 checkpoint,然后假如发生故障并重启,我们可以从上次 checkpoint 之处恢复,但是这个行为只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。Flink 则使用两阶段提交协议来解决这个问题。

    2.Flink集群有哪些角色?各自有什么作用?

    JobManager扮演着集群中的管理者Master的角色,它是整个集群的协调者,负责接收Flink Job,协调检查点,Failover 故障恢复等,同时管理Flink集群中从节点TaskManager。

    TaskManager是实际负责执行计算的Worker,在其上执行Flink Job的一组Task,每个TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向JobManager汇报。

    Client是Flink程序提交的客户端,当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。

    3.说说 Flink 资源管理中 Task Slot 的概念

    TaskManager是实际负责执行计算的Worker,TaskManager 是一个 JVM 进程,并会以独立的线程来执行一个task或多个subtask。为了控制一个 TaskManager 能接受多少个 task,Flink 提出了 Task Slot 的概念。简单的说,TaskManager会将自己节点上管理的资源分为不同的Slot:固定大小的资源子集。这样就避免了不同Job的Task互相竞争内存资源,但是需要主要的是,Slot只会做内存的隔离。没有做CPU的隔离。
     

    每个worker(TaskManager)都是一个JVM进程,可以在不同的线程中执行一个或多个子任务。为了控制Worker接受的Task数量,Worker节点运行task slots(at least one)。每个Task Slot代表TaskManager的固定资源子集。例如,具有3个Task Slots的TaskManager将其1/3的托管内存专用于每个task slot.切分资源的目的是为了对一个任务的执行做资源隔离,也就意味着当前任务的执行一旦分配完slot之后,不会被其他job任务侵占。如果一个TaskManager 拥有多个Task Slots意味着更多Sub Tasks 共享同一个JVM。同一JVM中的任务共享TCP连接(通过多路复用)和心跳消息。

    默认情况下,Flink允许子任务共享Task slot,即使它们是不同任务的子任务,只要它们来自同一个job即可。一个Slot槽可以保存Job的的整个工作流程。允许此Task Slots共享有两个主要好处:

    • Flink集群只需要知道作业中使用的TaskSlots总数即可。无需计算程序总共包含多少任务。

    • 更好的资源利用率。允许一个job中共享Task Slots 也就意味着系统可以更加充分的使得资源得到合理的利用。没有Task Slot共享,非密集源/ map()子任务将阻止与资源密集型 window subtasks一样多的资源。通过Task slot,将示例中的基本并行性从2增加到6可以充分利用时隙资源,同时确保繁重的子任务在TaskManagers之间公平分配.

    默认同一个job的不同Task(Stage)的SubTask/Thread(分区)可以共享Slot。这样程序只需要在启动的时候指定最大并行度即可。最大的并行度就等价于下系统需要给该job分配的slot的个数。由于Flink实现了不同job间的Slot的隔离,因此一旦slot分配完之后,后去的job因为没有Slot可用,只能处于挂起状态,这样设计的好处在于后续提交的任务不会影响先在执

    行中的job。

    4.说说你知道的Flink分区策略?

    GlobalPartitioner 数据会被分发到下游算子的第一个实例中进行处理。

    ShufflePartitioner 数据会被随机分发到下游算子的每一个实例中进行处理。RebalancePartitioner 数据会被循环发送到下游的每一个实例中进行处理。

    RescalePartitioner 这种分区器会根据上下游算子的并行度,循环的方式输出到下游算子的每个实例。这里有点难以理解,假设上游并行度为2,编号为A和B。下游并行度为4,编号为1,2,3,4。那么A则把数据循环发送给1和2,B则把数据循环发送给3和4。假设上游并行度为4,编号为A,B,C,D。下游并行度为2,编号为1,2。那么A和B则把数据发送给1,C和D则把数据发送给2。

    BroadcastPartitioner 广播分区会将上游数据输出到下游算子的每个实例中。适合于大数据集和小数据集做Jion的场景。

    ForwardPartitioner 用于将记录输出到下游本地的算子实例。它要求上下游算子并行度一样。简单的说,ForwardPartitioner用来做数据的控制台打印。

    KeyGroupStreamPartitioner Hash分区器。会将数据按 Key 的 Hash 值输出到下游算子实例中。CustomPartitionerWrapper 用户自定义分区器。需要用户自己实现Partitioner接口,来定义自己的分区逻辑。
     

    5.Flink的Slot和parallelism有什么区别?


    slot是指taskmanager的并发执行能力,假设我们将 taskmanager.numberOfTaskSlots 配置为3 那么每一个 taskmanager 中分配3个 TaskSlot, 3个 taskmanager 一共有9个TaskSlot。


    parallelism是指taskmanager实际使用的并发能力。假设我们把 parallelism.default 设置为1,那么9个 TaskSlot 只能用1个,有8个空闲。

    6.Flink有没有重启策略?

    更多:https://www.csdn.net/tags/MtTaEg5sMDMyNTkwLWJsb2cO0O0O.html

    • 如果没有启用 checkpointing,则使用无重启 (no restart) 策略。如果启用了 checkpointing,但没有配置重启策略,则使用固定间隔 (fixed-delay) 策略
    • 重启策略可以在flink-conf.yaml中配置,表示全局的配置。也可以在应用代码中动态指定,会覆盖全局配置

    固定延迟重启策略(Fixed Delay Restart Strategy)

    故障率重启策略(Failure Rate Restart Strategy)

    没有重启策略(No Restart Strategy)

    Fallback重启策略(Fallback Restart Strategy)

    7.说说Flink中的广播变量,使用时需要注意什么?

    我们知道Flink是并行的,计算过程可能不在一个 Slot 中进行,那么有一种情况即:当我们需要访问同一份数据。那么Flink中的广播变量就是为了解决这种情况。

    我们可以把广播变量理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同的task在节点上都能够获取到,这个数据在每个节点上只会存在一份。

    8.说说Flink中的窗口?

    Flink 支持两种划分窗口的方式,按照time和count。如果根据时间划分窗口,那么它就是一个time-window 如果根据数据划分窗口,那么它就是一个count-window。

    flink支持窗口的两个重要属性(size和interval)

    如果size=interval,那么就会形成tumbling-window(无重叠数据) 如果size>interval,那么就会形成sliding-window(有重叠数据) 如果size< interval, 那么这种窗口将会丢失数据。比如每5秒钟,统计过去3秒的通过路口汽车的数据,将会漏掉2秒钟的数据。

    通过组合可以得出四种基本窗口:

    • time-tumbling-window 无重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5))

    • time-sliding-window 有重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5), Time.seconds(3))

    • count-tumbling-window无重叠数据的数量窗口,设置方式举例:countWindow(5)

    • count-sliding-window 有重叠数据的数量窗口,设置方式举例:countWindow(5,3)

    9.说说Flink中的状态存储?

    Flink在做计算的过程中经常需要存储中间状态,来避免数据丢失和状态恢复。选择的状态存储策略不同,会影响状态持久化如何和 checkpoint 交互。

    Flink提供了三种状态存储方式:MemoryStateBackend、FsStateBackend、RocksDBStateBackend。

    10.Flink 中的时间有哪几类

    Flink 中的时间和其他流式计算系统的时间一样分为三类:事件时间,摄入时间,处理时间三种。

    如果以 EventTime 为基准来定义时间窗口将形成EventTimeWindow,要求消息本身就应该携带EventTime。如果以 IngesingtTime 为基准来定义时间窗口将形成 IngestingTimeWindow,以 source 的systemTime为准。如果以 ProcessingTime 基准来定义时间窗口将形成 ProcessingTimeWindow,以 operator 的systemTime 为准。

    11.Flink Table & SQL 熟悉吗?TableEnvironment这个类有什么作用

    TableEnvironment是Table API和SQL集成的核心概念。

    这个类主要用来:

    • 在内部catalog中注册表

    • 注册外部catalog

    • 执行SQL查询

    • 注册用户定义(标量,表或聚合)函数

    • 将DataStream或DataSet转换为表

    • 持有对ExecutionEnvironment或StreamExecutionEnvironment的引用

    12.Flink SQL的实现原理是什么?是如何实现 SQL 解析的呢?

     首先大家要知道 Flink 的SQL解析是基于Apache Calcite这个开源框架。

    基于此,一次完整的SQL解析过程如下:

    • 用户使用对外提供Stream SQL的语法开发业务应用

    • 用calcite对StreamSQL进行语法检验,语法检验通过后,转换成calcite的逻辑树节点;最终形成calcite的逻辑计划

    • 采用Flink自定义的优化规则和calcite火山模型、启发式模型共同对逻辑树进行优化,生成最优的Flink物理计划

    • 对物理计划采用janino codegen生成代码,生成用低阶API DataStream 描述的流应用,提交到Flink平台执行

  • 相关阅读:
    STM32单片机酒精检测防酒驾系统酒精报警器
    Redis缓存何以一枝独秀?以及热门面试题中Redis的核心特性
    【Vue + Koa 前后端分离】使用开源【林间有风】框架,快速搭建自己的后台管理系统
    Luogu P3379 【模板】最近公共祖先(LCA),树链剖分求LCA模板
    最新!基于Open3D的点云处理入门与实战教程
    Go :验证编译器是否检测到错误的switch语句(附完整源码)
    S7-200SMART PLC实现冒泡排序的具体方法和程序示例
    linux常用指令==Linux操作系统4
    【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)
    身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包
  • 原文地址:https://blog.csdn.net/qq_42074949/article/details/124866034