Flink高频面试题,来试试你能过关吗?

火影  金牌会员 | 2025-3-13 16:06:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 989|帖子 989|积分 2967

Flink知识回顾考卷如下

选择题

1.下面哪个不是 Dataset的转换算子() A. readTextFile B reduce distinct D rebalance
A
2.关于状态管理分类,下面哪个是错误的( A keyed state B operate state C broadcast state D transform state
D
3.查抄点的状态后端( state backend),下面哪个是错误的() A Mongodb State Backend B MemoryState Backend
A
4.Fink中的时间以下说法精确的是() A如果以 EventTime为基准来定义时间窗口将形成 ventTimeWindow,要求消息自己就应该 携帝 EventTime 8如果以 ngesingtTime为基准来定义时间窗口将形成 Ingesting Timewindow以 source的 systemTime为准 c如果以 ProcessingTime基准来定义时间窗口将形成 ProcessingTime window,以 opera 的 D以上说法都精确
D
5.fink的得当场景有哪些不得当() A实时数据 pipeline数据抽取 B实时数据仓库和实时ETL C事件驱动型场景,如告警、监控 D大批量的数据举行离线(t+1)报表盘算
D
多选题

1 fik流处理特性() A.支持带有事件时间的窗口( Window)操作 B.支持有状态盘算的 Exactly-once语义 C.支持基于轻量级分布式快照( Snapshot)实现的容错 D.支持步伐自动优化:制止特定情况下shue、排序等昂贵操作,中间结果有必要举行缓存
ABCD
2.以下哪些是fink提供状态存储( A. lOState Backend B. Memory Backend tate Backend D. Rocks DBState Backend
BCD
3.fink焦点组成部分提供了面向哪两种接口() A.批处理接口 B.流处理接口 C.表处理接口 D.复杂事件处理接口
AB 4. flink on yarn有哪两种提交模式() A. Yarm-alone B. yarn-session C. Yarn-cluste D. standalone
BC
5.fink实现的重启计谋包括() A故障率重启计谋( Failure Rate Restart Strategy) B.固定延迟重启计谋( Fixed Delay Restart strate C. Fallback重启策( Fallback Restart strategy) D.没有重启计谋
ABCD
判断题

6 task slot是 taskManager内资源分配的最小载体,代表了可根据资源需求自动调整大小 的资源子集,()
F
7fink的rich函数中的open方法是每来一条数据实行一次。()
F
8.fink的流处理操作底层是批处理,是特别批处理操作。()
F
9.fink的高可用模式,重要是防止 JobManager出现单点故障,确保集群的高可用。()
T
10 Hlink SoL底层 Runtime自己是一个流与批的统一的引擘, HlinkSQL可以做到AP层的流与 批统一。()
T 下面为模拟面试,如果面试官考你Flink相关,你该如何回答呢?
简答题

1.简朴介绍一下 Flink

Flink 焦点是一个流式的数据流实行引擎,其针对数据流的分布式盘算提供了数据分布、数 据通讯以及容错机制等功能。 基于流实行引擎,Flink 提供了诸多更高抽象层的 API 以便用户编 写分布式任务:DataSet API, 对静态数据举行批处理操作,将静态数据抽象成分布式的数据集, 用户可以方便地利用 Flink 提供的各种操作符对分布式数据集举行处理,支持 Java、Scala 和 Python。DataStream API,对数据流举行流处理操作,将流式的数据抽象成分布式的数据流,用 户可以方便地对分布式数据流举行各种操作,支持 Java 和 Scala。Table API,对结构化数据进 行查询操作,将结构化数据抽象成关系表,并通过类 SQL 的 DSL 对关系表举行各种查询操作,支 持 Java 和 Scala。此外,Flink 还针对特定的应用领域提供了领域库,例如:Flink ML,Flink 的呆板学习库,提供了呆板学习 Pipelines API 并实现了多种呆板学习算法。Gelly,Flink 的图 盘算库,提供了图盘算的相关 API 及多种图盘算算法实现。
2.Flink 相比 Spark Streaming 有什么区别?

架构模子上:Spark Streaming 的 task 运行依赖 driver 和 executor 和 worker,当然 driver 和 excutor 还依赖于集群管理器 Standalone 或者 yarn 等。而 Flink 运行时重要是 JobManager、 TaskManage 和 TaskSlot。另外一个最焦点的区别是:Spark Streaming 是微批处理,运行的时 候需要指定批处理的时间,每次运行 job 时处理一个批次的数据;Flink 是基于事件驱动的, 事件可以理解为消息。事件驱动的应用步伐是一种状态应用步伐,它会从一个或者多个流中注入 事件,通过触发盘算更新状态,或外部动作对注入的事件作出反应。 任务调理上:Spark Streaming 的调理分为构建 DGA 图,划分 stage,生成 taskset,调理 task 等步骤,而 Flink 起首会生成 StreamGraph,接着生成 JobGraph,然后将 jobGraph 提交 给 Jobmanager 由它完成 jobGraph 到 ExecutionGraph 的转变,最后由 jobManager 调理实行。 时间机制上:flink 支持三种时间机制事件时间,注入时间,处理时间,同时支持 watermark 机制处理滞后数据。Spark Streaming 只支持处理时间,Structured streaming 则支持了事件时 间和 watermark 机制。 容错机制上:二者保证 exactly-once 的方式不同。spark streaming 通过生存 offset 和事 务的方式;Flink 则利用两阶段提交协议来解决这个问题。
3 Flink 中的分区计谋有哪几种?

分区计谋是用来决定数据如何发送至卑鄙。目前 Flink 支持了8中分区计谋的实现。
1)GlobalPartitioner 数据会被分发到卑鄙算子的第一个实例中举行处理。
2)ShufflePartitioner 数据会被随机分发到卑鄙算子的每一个实例中举行处理。
3)RebalancePartitioner 数据会被循环发送到卑鄙的每一个实例中举行处理。
4)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。
5)BroadcastPartitioner 广播分区会将上游数据输出到卑鄙算子的每个实例中。得当于大数据集和小数据集做Jion的场景。
6)ForwardPartitioner ForwardPartitioner 用于将记录输出到卑鄙本地的算子实例。它要求上卑鄙算子并行度一样。简朴的说,ForwardPartitioner用来做数据的控制台打印。
7)KeyGroupStreamPartitioner Hash分区器。会将数据按 Key 的 Hash 值输出到卑鄙算子实例中。
8)CustomPartitionerWrapper 用户自定义分区器。需要用户自己实现Partitioner接口,来定义自己的分区逻辑
4 Flink 的并行度有了解吗?Flink 中设置并行度需要留意什么?

Flink 步伐由多个任务(Source、Transformation、Sink)组成。任务被分成多个并行实例 来实行,每个并行实例处理任务的输入数据的子集。任务的并行实例的数量称之为并行度。 Flink 中人物的并行度可以从多个不同层面设置: 操作算子层面(Operator Level)、 实行环境层面 (Execution Environment Level)、 客户端层面(Client Level)、 系统层面(System Level)。 Flink 可以设置好几个level的parallelism, 其中包括 Operator Level、 Execution Environment Level、 Client Level、 System Level 在 flink-conf.yaml 中通过 parallelism.default 设置项给所有 execution environments 指定系统级的默认 parallelism;在 ExecutionEnvironment 里头可以 通过 setParallelism 来给 operators、data sources、data sinks 设置默认的 parallelism;如 果 operators 、 data sources 、 data sinks 自 己 有 设 置 parallelism 则 会 覆 盖 ExecutionEnvironment 设置的 parallelism。 需要留意的优先级:算子层面>环境层面>客户端层面>系统层面。
5 Flink 支持哪几种重启计谋?分别如何设置?

重启计谋种类
固定延迟重启计谋(Fixed Delay Restart Strategy) 故障率重启计谋(Failure Rate Restart Strategy) 无重启计谋(No Restart Strategy) Fallback 重启计谋(Fallback Restart Strategy)
6 Flink 的分布式缓存有什么作用?如何利用?

Flink 提供了一个分布式缓存,雷同于 hadoop,可以利用户在并行函数中很方便的读取本地 文件,并把它放在 taskmanager 节点中,防止 task 重复拉取。 此缓存的工作机制如下:步伐注册一个文件或者目录(本地或者远程文件系统,例如 hdfs 或 者 s3),通过 ExecutionEnvironment 注册缓存文件并为它起一个名称。 当步伐实行,Flink 自动将文件或者目录复制到所有 taskmanager 节点的本地文件系统,仅 会实行一次。用户可以通过这个指定的名称查找文件或者目录,然后从 taskmanager 节点的本地 文件系统访问它。
7 Flink 中的广播变量,利用广播变量需要留意什么事项?

在 Flink 中,同一个算子可能存在若干个不同的并行实例,盘算过程可能不在同一个 Slot 中举行,不同算子之间更是如此,因此不同算子的盘算数据之间不能像 Java 数组之间一样相互 访问,而广播变量 Broadcast 便是解决这种情况的。我们可以把广播变量理解为是一个公共的共 享变量,我们可以把一个 dataset 数据集广播出去,然后不同的 task 在节点上都可以或许获取到, 这个数据在每个节点上只会存在一份。
8.Flink 中对窗口的支持包括哪几种?说说他们的利用场景


  • Tumbling Time Window 如果我们需要统计每一分钟中用户购买的商品的总数,需要将用户的举动事件按每一分钟进 行切分,这种切分被成为翻滚时间窗口(Tumbling Time Window)。翻滚窗口能将数据流切分成 不重叠的窗口,每一个事件只能属于一个窗口。
  • Sliding Time Window 我们可以每 30 秒盘算一次迩来一分钟用户购买的商品总数。这种窗口我们称为滑动时间窗 口(Sliding Time Window)。在滑窗中,一个元素可以对应多个窗口。
  • Tumbling Count Window 当我们想要每 100 个用户购买举动事件统计购买总数,那么每当窗口中填满 100 个元素了, 就会对窗口举行盘算,这种窗口我们称之为翻滚计数窗口(Tumbling Count Window),上图所 示窗口大小为 3 个。
  • Session Window 在这种用户交互事件流中,我们起首想到的是将事件聚合到会话窗口中(一段用户持续活跃 的周期),由非活跃的间隙分隔开。如上图所示,就是需要盘算每个用户在活跃期间统共购买的 商品数量,如果用户 30 秒没有活动则视为会话断开(假设 raw data stream 是单个用户的购买 举动流)。一般而言,window 是在无穷的流上定义了一个有限的元素集合。这个集合可以是基 于时间的,元素个数的,时间和个数结合的,会话间隙的,或者是自定义的。Flink 的 DataStream API 提供了简洁的算子来满意常用的窗口操作,同时提供了通用的窗口机制来答应用户自己定义 窗口分配逻辑。

9 请简朴形貌一下Flink On Yarn模式

1.Client上传jar包和设置文件到HDFS集群上 2.Client向Yarn ResourceManager提交任务并申请资源 3.ResourceManager分配Container资源并启动ApplicationMaster,然后AppMaster加载Flink的Jar包和设置构建环境,启动JobManager JobManager和ApplicationMaster运行在同一个container上。 一旦他们被乐成启动,AppMaster就知道JobManager的地点(AM它自己所在的呆板)。 它就会为TaskManager生成一个新的Flink设置文件(他们就可以毗连到JobManager)。 这个设置文件也被上传到HDFS上。 此外,AppMaster容器也提供了Flink的web服务接口。 YARN所分配的所有端口都是临时端口,这答应用户并行实行多个Flink 4.ApplicationMaster向ResourceManager申请工作资源,NodeManager加载Flink的Jar包和设置构建环境并启动TaskManager 5.TaskManager启动后向JobManager发送心跳包,并等待JobManager向其分配任务

10. Flink 中的时间种类有哪些?各自介绍一下?

Flink 中的时间与现实天下中的时间是不同等的,在 flink 中被划分为事件时间,摄入时间, 处理时间三种。 如果以 EventTime 为基准来定义时间窗口将形成 EventTimeWindow,要求消息自己 就 应 该 携 带 EventTime 如 果 以 IngesingtTime 为 基 准 来 定 义 时 间 窗 口 将 形 成 IngestingTimeWindow,以 source 的 systemTime 为准。 如果以 ProcessingTime 基准来定义时间窗口将形成 ProcessingTimeWindow,以 operator 的 systemTime 为准。
面到这里,面试官已经很满意你对Flink的掌握,那么更近一步让面试官折服:***
11.WaterMark 是什么?是用来解决什么问题?如何生成水 印?水印的原理是什么?

Watermark 是 Apache Flink 为了处理 EventTime 窗口盘算提出的一种机制,本质上也是一种 时间戳。watermark 是用于处理乱序事件的,处理乱序事件通常用 watermark 机制结合 window 来实现。
12 Flink 的容错机制

Flink 基于分布式快照与可部分重发的数据源实现了容错。用户可自定义对整个 Job 举行快 照的时间间隔,当任务失败时,Flink 会将整个 Job 规复到迩来一次快照,并从数据源重发快照 之后的数据。

13 Flink 在利用 Window 时出现数据倾斜,你有什么解决办法?

留意:这里 window 产生的数据倾斜指的是不同的窗口内积攒的数据量不同,重要是由源头 数据的产生速度导致的差异。焦点思路:1.重新设计 key 2.在窗口盘算前做预聚合
14 Flink 任务,delay 极高,请问你有什么调优计谋?

flink没学过调优,被问到了,我们总不能说俺不知道,洒家不会之类的吧٩(๑❛ᴗ❛๑)۶下面展示一种回答
起主要确定问题产生的缘故原由,找到最耗时的点,确定性能瓶颈点。比如任务频仍反压,找到 反压点。重要通过:资源调优、作业参数调优。资源调优即是对作业中的 Operator 的并发数 (parallelism)、CPU(core)、堆内存(heap_memory)等参数举行调优。作业参数调优包括:并行度的设置,State 的设置,checkpoint 的设置。
15 Flink 的内存管理是如何做的

Flink 并不是将大量对象存在堆上,而是将对象都序列化到一个预分配的内存块 上。此外,Flink 大量的利用了堆外内存。如果需要处理的数据超出了内存限定, 则会将部分数据存储到硬盘上。Flink 为了直接操作二进制数据实现了自己的序 列化框架。
16 Flink 是如何支持批流一体的

这道题问的比较开阔,如果知道 Flink 底层原理,可以具体说说,如果不是很了 解,就直接简朴一句话:Flink 的开发者认为批处理是流处理的一种特别情况。 批处理是有限的流处理。Flink 利用一个引擎支持了 DataSet API 和 DataStream API。
17 Flink 中的状态存储

Flink 在做盘算的过程中常常需要存储中间状态,来制止数据丢失和状态规复。 选择的状态存储计谋不同,会影响状态持久化如何和 checkpoint 交互。Flink 提 供了三种状态存储方式:MemoryStateBackend、FsStateBackend、 RocksDBStateBackend。
18. Flink 是如何保证 Exactly-once 语义的

Flink 通过实现两阶段提交和状态生存来实现端到端的同等性语义。分为以下几 个步骤: 开始事件(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件 夹里面 预提交(preCommit)将内存中缓存的数据写入文件并关闭 正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的 数据会有一些延迟 扬弃(abort)扬弃临时文件 若失败发生在预提交乐成后,正式提交前。可以根据状态来提交预提交的数据, 也可删除预提交的数据。
19. Flink 是如何处理反压的


Flink 内部是基于 producer-consumer 模子来举行消息传递的,Flink 的反压设计 也是基于这个模子。Flink 利用了高效有界的分布式阻塞队列,就像 Java 通用 的阻塞队列(BlockingQueue)一样。卑鄙消费者消费变慢,上游就会受到阻塞。
虽迟但到,面试总不能少了代码题:
利用JAVA或 Scala语言编程实现fink的 Word Count单词统计。
非常经典的wordcount题,雷同的用scala,spark,MapReduce手写wc你能写出来吗?
新建文件为 words. txt,文件路径在/ export/ server/data下面,内容如下 Spark Flink flume hadoop Flink spark flume hadoop
以下利用Flink 盘算引擎实现流式数据处理:从Socket吸收数据,实时举行词频统计WordCount
Java版:

  1. // 1.准备环境-env
  2.                 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  3.                 // 2.准备数据-source
  4. //                DataStreamSource<String> inputDataStream = env.socketTextStream("node1.itcast.cn", 9999);
  5.                 DataStreamSource<String> inputDataStream = env.readTextFile("D:\\0615\\bigdata-flink\\datas\\wordcount.data");
  6.                 // 3.处理数据-transformation
  7.                 // TODO: 流计算词频统计WordCount与处理思路基本一致
  8.                 SingleOutputStreamOperator<Tuple2<String, Integer>> resultDataStream = inputDataStream
  9.                                 // 分割单词
  10.                                 .flatMap(new FlatMapFunction<String, String>() {
  11.                                         @Override
  12.                                         public void flatMap(String line, Collector<String> out) throws Exception {
  13.                                                 for (String word : line.trim().split("\\s+")) {
  14.                                                         out.collect(word);
  15.                                                 }
  16.                                         }
  17.                                 })
  18.                                 // 转换二元组
  19.                                 .map(new MapFunction<String, Tuple2<String, Integer>>() {
  20.                                         @Override
  21.                                         public Tuple2<String, Integer> map(String word) throws Exception {
  22.                                                 return new Tuple2<>(word, 1);
  23.                                         }
  24.                                 })
  25.                                 // 分组聚合
  26.                                 .keyBy(0).sum(1);
  27.                 // 4.输出结果-sink
  28.                 resultDataStream.print();
  29.                 // 5.触发执行-execute
  30.                 env.execute(_02StreamWordCount.class.getSimpleName());
复制代码
思索一下Scala版,Python版该怎么写??
如何从Kafka中消费数据并过滤出状态为success的数据再写入到Kafka
{“user_id”: “1”, “page_id”:“1”, “status”: “success”}
{“user_id”: “1”, “page_id”:“1”, “status”: “success”}
{“user_id”: “1”, “page_id”:“1”, “status”: “success”}
{“user_id”: “1”, “page_id”:“1”, “status”: “success”}
{“user_id”: “1”, “page_id”:“1”, “status”: “fail”}
官方文档:
https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/connectors/kafka.html
代码实现:

  1. //1.准备环境 流执行环境和流表
  2.         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  3.         StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
  4. //2.执行SQL,创建 input_kafka 表
  5.         TableResult inputTable = tEnv.executeSql(
  6.                 "CREATE TABLE input_kafka (\n" +
  7.                         "  `user_id` BIGINT,\n" +
  8.                         "  `page_id` BIGINT,\n" +
  9.                         "  `status` STRING\n" +
  10.                         ") WITH (\n" +
  11.                         "  'connector' = 'kafka',\n" +
  12.                         "  'topic' = 'input_kafka',\n" +
  13.                         "  'properties.bootstrap.servers' = 'node1:9092',\n" +
  14.                         "  'properties.group.id' = 'testGroup',\n" +
  15.                         "  'scan.startup.mode' = 'latest-offset',\n" +
  16.                         "  'format' = 'json'\n" +
  17.                         ")"
  18.         );
  19. // 创建 output_kafka
  20.         TableResult outputTable = tEnv.executeSql(
  21.                 "CREATE TABLE output_kafka (\n" +
  22.                         "  `user_id` BIGINT,\n" +
  23.                         "  `page_id` BIGINT,\n" +
  24.                         "  `status` STRING\n" +
  25.                         ") WITH (\n" +
  26.                         "  'connector' = 'kafka',\n" +
  27.                         "  'topic' = 'output_kafka',\n" +
  28.                         "  'properties.bootstrap.servers' = 'node1:9092',\n" +
  29.                         "  'format' = 'json',\n" +
  30.                         "  'sink.partitioner' = 'round-robin'\n" +
  31.                         ")"
  32.         );
  33. // 根据 status 是否为 success 条件筛选出来值
  34.         String sql = "select " +
  35.                 "user_id," +
  36.                 "page_id," +
  37.                 "status " +
  38.                 "from input_kafka " +
  39.                 "where status = 'success'";
  40.         Table ResultTable = tEnv.sqlQuery(sql);
  41.         //3.toRetractStream
  42.         DataStream<Tuple2<Boolean, Row>> resultDS = tEnv.toRetractStream(ResultTable, Row.class);
  43.         //4.打印输出
  44.         resultDS.print();
  45.         //5.执行sql 将筛选出来success的数据表插入到 output_kafka
  46.         tEnv.executeSql("insert into output_kafka select * from "+ResultTable);
  47.         //6.excute
  48.         env.execute();
复制代码
再来一题,小试牛刀:
利用java或 scala语言编程实现消费 kafka中的数据并在数据处理阶段过滤掉 country Code不为cN的内容并打印输出 假设:集群主机 hostname为 node Kafka的 topic为data Kafka的消费组为 default Group 示例数据 {dt";“2020-08-05 10: 11: 09”,“country Code”: “CN”,“data”: [{“type” s1,score":0.8),“type”: 52,score": 0. 3}}} {“dt”:“202008-05 10: 13: 12”,“country Code”: KW",“data”: [{“type”: “s2”,“score”: 0. 41.“type”: “s1”,“score”: 0.3}}} {“dt”:“202008-05 10: 12: 15”, “country Code”: “US”, “data” [{“type”: “s4”,“score”: 0.3).“type”: 52","score: 0.5}}}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表