Flink面试题精简

Flink基础

1 简单介绍一下 Flink

·框架和分布式处理引擎

·对无界和有界数据流进行有状态计算

·提供了数据分布、容错机制以及资源管理等核心功能

·提供了诸多高抽象层的API以便用户编写分布式任务:

- DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集

- DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流

- Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表

·Flink 还针对特定的应用领域提供了领域库。Flink ML机器学习库Gelly,图计算库。

2 Flink相比传统的Spark Streaming区别?

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

分几个方面介绍两个框架的主要区别:

  1. 架构模型

·SparkStreaming 在运行时的主要角色包括:Master、Worker、Driver、Executor

·Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。

2. 任务调度

·SparkStreaming连续不断的生成微批次数据,构建有向无环图DAG,依次创建DStreamGraph、JobGenerator、JobScheduler。

·Flink根据用户提交的代码生成StreamGraph,经过优化生成JobGraph,然后提交给 JobManager进行处理生成ExecutionGraphExecutionGraph是Flink 任务调度的核心

  1. 时间机制

·SparkStreaming 只支持处理时间 

·Flink 处理时间、事件时间、注入时间、watermark机制来处理滞后数据。

  1. 容错机制

·SparkStreaming设置checkpoint,发生故障并重启,从上次checkpoint之处恢复,只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。

·Flink则使用两阶段提交协议来解决这个问题。

3 Flink的组件栈有哪些?

Flink是一个分层架构的系统,每一层所包含的组件都提供了特定的抽象,用来服务于上层组件。

·Deploy: locolstandaloneclustercloud

·Runtime: Flink 计算的核心实现,比如:支持分布式流处理、JobGraph到ExecutionGraph的映射、调度等

·API:DataStream APIDataSet API

·Libraries: CEPTable API&SQLFlinkMLGelly

4 Flink 的运行必须依赖 Hadoop组件吗?

Flink可以完全独立于Hadoop,但是做为大数据的基础设施,Hadoop体系是任何大数据框架都绕不过去的。

Flink可以和Yarn集成做资源调度,也可以读写HDFS,或者利用HDFS做检查点。

5 你们的Flink集群规模多大?

将自己生产环节中的集群规模、节点、内存情况说明,部署模式(一般是Flink on Yarn),除此之外,用户也可以同时在小集群(少于5个节点)和拥有 TB 级别状态的上千个节点上运行 Flink 任务。

6 Flink的基础编程模型了解吗?

Flink 程序的基本构建是数据输入来自一个 Source,经过 Transformation 进行转换,然后在一个或者多个Sink接收器中结束。执行时Flink程序映射到streaming dataflows

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

·JobManagerMaster

- 集群的协调者

- 接收Flink Job

- 协调检查点

- Failover 故障恢复等

- 管理Flink集群中从节点TaskManager

·TaskManager执行计算的Worker,

- 执行Flink Job的一组Task

- 管理资源信息,如内存、磁盘、网络

- 在启动的时候将资源的状态向JobManager汇报

·Client程序提交的客户端,提交一个Flink程序时会首先创建一个Client

- Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理

- 从用户提交的Flink程序配置中获取JobManager的地址,并建立连接

- 将Flink Job提交给JobManager。

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

TaskManager会将自己节点上管理的资源分为不同的Slot:固定大小的资源子集

避免了不同Job的Task互相竞争内存资源,Slot只会做内存的隔离。没有做CPU的隔离。

9 说说 Flink 的常用算子?

Map:对输入的参数进行转换操作。

Filter:过滤掉指定条件的数据。

KeyBy:按照指定的key进行分组。

Reduce:用来进行结果汇总合并。

Window:窗口函数,根据某些特性将每个key的数据进行分组(例如:在5s内到达的数据)

10 说说你知道的Flink分区策略?

分区策略是用来决定数据如何发送至下游。Flink 支持了8中分区策略的实现。

·GlobalPartitioner分发到第一个实例

·ShufflePartitioner随机

·RebalancePartitioner循环

·RescalePartitioner根据并行度

·BroadcastPartitioner广播到每个实例适合于大数据集和小数据集做Jion

·ForwardPartitionerone to one

·KeyGroupStreamPartition按key的hash值分发到下游实例

·CustomPartitionerWrapper用户自定义分区器。

11 Flink的并行度了解吗?Flink的并行度设置是怎样的?

Flink中的任务并行执行任务,每个并行的实例处理一部分数据。并行实例的数量被称为并行度。可以从不同层面设置并行度优先级:算子层面>环境层面>客户端层面>系统层面

12 Flink的Slot和parallelism有什么区别?

·slot是指taskmanager的并发执行能力

·parallelism是指taskmanager实际使用的并发能力

13 Flink有没有重启策略?说说有哪几种?

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

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

·没有重启策略(No Restart Strategy)

·Fallback重启策略(Fallback Restart Strategy)

14 用过Flink中的分布式缓存吗?如何使用?

Flink实现的分布式缓存目的是在本地读取文件,并把他放在taskmanager节点中,防止task重复拉取。

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

Flink是并行的计算过程可能不在一个Slot中进行。广播变量理解为是一个公共的共享变量,当访问同一份数据一个DataSet数据集广播,然后不同的task在节点上都能够获取到这个数据在每个节点上只会存在一份

16 说说Flink中的窗口?

·Sessionwindow

·timeWindow(Time.seconds(5))

timeWindow(Time.seconds(5), Time.seconds(3))

·countWindow(5)

countWindow(5,3)

17 说说Flink中的状态存储?

·计算的过程中需要存储中间状态,来避免数据丢失和状态恢复

·状态存储策略会影响状态持久化如何和 checkpoint 交互

·三种状态存储方式:MemoryStateBackend、FsStateBackend、RocksDBStateBackend

18 Flink中的时间有哪几类

·EventTime为基准来定义时间窗口,消息本身携带EventTime

·IngesingtTime为基准来定义时间窗口,source 的systemTime

·ProcessingTime基准来定义时间窗口,operator 的systemTime

19 Flink 中水印是什么概念,起到什么作用?

为处理 EventTime 窗口计算提出的一种机制, 本质上是一种时间戳。

Watermark经常和Window一起被用来处理乱序事件。

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

TableEnvironment是Table API和SQL集成的核心概念。这个类主要用来:

·在内部catalog中注册表

·注册外部catalog

·执行SQL查询

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

·将DataStream或DataSet转换为表

·持有对ExecutionEnvironment或StreamExecutionEnvironment的引用

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

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

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

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

Flink中级

1 Flink是如何支持批流一体的?

Flink的开发者认为批处理是流处理的一种特殊情况。批处理是有限的流处理。

Flink 使用一个引擎支持了DataSet API 和 DataStream API。

2 Flink是如何做到高效的数据交换的?

在一个Flink Job中数据需要在不同的task中进行交换,数据交换是TaskManager负责的,TaskManager的网络组件首先从缓冲buffer中收集一批records再发送,batch 技术可以更加高效的利用网络资源。

3 Flink是如何做容错的?

·Checkpoint 负责定时制作分布式快照、对程序中的状态进行备份;

·State 用来存储计算过程中的中间状态。

4 Flink 分布式快照的原理是什么?

持续创建分布式数据流及其状态的一致快照。

在input source端插入barrier,控制barrier的同步来实现snapshot的备份exactly-once语义。

5 Flink是如何保证Exactly-once语义的?

Flink通过实现两阶段提交和状态保存来实现端到端的一致性语义。 

分为以下几个步骤:

·开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面

·预提交(preCommit)将内存中缓存的数据写入文件并关闭

·正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据会有一些延迟

·丢弃(abort)丢弃临时文件

若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。

6 Flink 的 kafka 连接器有什么特别的地方?

Flink 在1.9版本发布的全新kafka连接器,不同版本的kafka集群只需要依赖一个connector即可。

7 说说 Flink的内存管理是如何做的?

·Flink是将对象都序列化到一个预分配的内存块上。

·Flink大量的使用了堆外内存如果需要处理的数据超出了内存限制,则存储到硬盘上。

·Flink 为了直接操作二进制数据实现了自己的序列化框架。

·Flink的内存管理分为三部分:

- Network Buffers:这个是在TaskManager启动的时候分配的,用于缓存网络数据的内存,每个块是32K,默认分配2048个;

- Memory Manage pool:大量的Memory Segment块,用于运行时的算法(Sort/Join/Shuffle等),启动的时候就会分配;

- User Code用于User code和TaskManager本身的数据结构。

8 说说 Flink的序列化如何做的?

·Java本身自带的序列化和反序列化的功能,但是笨重。

·Flink针对不同数据集,可以自动生成对应的TypeSerializer,能非常高效地对数据集进行序列化和反序列化。

9 Flink中的Window出现了数据倾斜,你有什么解决办法?

window产生数据倾斜指的是数据在不同的窗口内堆积的数据量相差过多。数据源头发送的数据量速度不同导致的。

·在数据进入窗口前做预聚合

·重新设计窗口聚合的key

10 Flink中在使用聚合函数 GroupBy、Distinct、KeyBy 等函数时出现数据热点如何解决?

·在业务上规避这类问题单独处理数据北京的数据。

·Key的设计上把热key进行拆分,北京按照地区进行拆分聚合。

·参数设置Flink 1.9.0 SQL性能优化中升级了微批模型MiniBatch。原理是缓存一定的数据后再触发处理,减少对状态访问提升吞吐减少数据的输出量。

11 Flink任务延迟高,想解决这个问题,你会如何入手?

·在Flink的后台任务管理中看到Flink的哪个算子和task出现了反压。

·资源调优作业中的Operator的并发数、CPU、堆内存等参数进行调优。

·作业参数调优:并行度的设置,State的设置,checkpoint的设置。

12 Flink是如何处理反压的?

Flink 内部是基于producer-consumer模型来进行消息传递的,Flink的反压设计也是基于这个模型。

Flink 使用了高效有界的分布式阻塞队列下游消费者消费变慢,上游就会受到阻塞。

13 Flink的反压和Strom有哪些不同?

Flink是逐级反压,而Storm是直接从源头降速。

14 Operator Chains(算子链)这个概念你了解吗?

为了更高效地分布式执行,Flink会尽可能地将operator的subtask链接在一起形成task。每个task在一个线程中执行。将operators链接成task是非常有效的优化:

·减少线程之间的切换,

·减少消息的序列化/反序列化,

·减少数据在缓冲区的交换,

·减少了延迟的同时提高整体的吞吐量

15 Flink什么情况下才会把Operator chain在一起形成算子链?

·上下游的并行度一致

·下游节点的入度为1 (也就是说下游节点没有来自其他节点的输入)

·上下游节点都在同一个slot group中

·下游节点的chain策略为 ALWAYS(可以与上下游链接,map、flatmap、filter等默认是ALWAYS)

·上游节点的chain策略为ALWAYS或HEAD(只能与下游链接,不能与上游链接,Source默认是HEAD)

·两个节点间数据分区方式是forward(参考理解数据流的分区)

·用户没有禁用chain

16 说说Flink1.9的新特性?

·支持hive读写,支持UDF

·Flink SQL TopN和GroupBy等优化

·Checkpoint跟savepoint针对实际业务场景做了优化

·Flink state查询

17 消费kafka数据的时候,如何处理脏数据?

可以在处理前加一个fliter算子,将不符合规则的数据过滤出去。

Flink高级

1 Flink Job的提交流程 

·用户提交的Flink Job会被转化成一个DAG任务运行,分别是:StreamGraph、JobGraph、ExecutionGraph

·Flink中JobManager与TaskManager,JobManager与Client的交互是基于Akka工具包的,是通过消息驱动

·整个Flink Job的提交还包含着ActorSystem的创建,JobManager的启动,TaskManager的启动和注册

2 Flink所谓"三层图"结构是哪几个"图"?

·StreamGraph 最接近代码所表达的逻辑层面的计算拓扑结构,按照用户代码的执行顺序向StreamExecutionEnvironment添加StreamTransformation构成流式图。

·JobGraph 从StreamGraph生成,将可以串联合并的节点进行合并,设置节点之间的边,安排资源共享slot槽位和放置相关联的节点,上传任务所需的文件,设置检查点配置等。相当于经过部分初始化和优化处理的任务图。

·ExecutionGraph 由JobGraph转换而来,包含了任务具体执行所需的内容,是最贴近底层实现的执行图。

3 TaskManager在集群中扮演了什么角色?

TaskManager 相当于整个集群的 Slave 节点,

·负责具体的任务执行和对应任务在每个节点上的资源申请和管理。

·TaskManager从JobManager 接收需要部署的任务,然后使用Slot资源启动Task,建立数据接入的网络连接,接收数据并开始数据处理。通过数据流进行数据交互.

·Flink 的任务运行采用多线程的方式,Flink能够提高CPU使用效率,在多个任务和Task之间通过askSlot方式共享系统资源,TaskManager中管理多个TaskSlot资源池

4 Flink 计算资源的调度是如何实现的?

TaskManager会将其所有的资源平分Task slot固定大小的资源子集

·多个task运行在同一个JVM中。

·共享TCP连接(基于多路复用)和心跳消息,

·减少数据的网络传输,共享一些数据结构,减少了每个task的消耗。 

·每个slot可以接受单个task,也可以接受多个连续task组成的pipeline,

5 Flink 中的分布式快照机制是如何实现的?

·Flink的容错机制是制作分布式数据流和操作算子状态的一致性快照。快照充当一致性checkpoint,系统可以在发生故障时回滚。

·barriers在数据流源处被注入并行数据流中。然后barriers向下游流动一旦sink操作算子从其所有输入流接收到barriers n,它就向checkpoint协调器确认快照n完成。

你可能感兴趣的:(Flink,flink,面试)