大数据Flink相关面试题(一)
文章目录
- 一、基础概念
- 1. Flink的核心设计目标是什么?与Spark Streaming的架构差异?
- 2. 解释Flink的“有状态流处理”概念。
- 3. Flink的流处理(DataStream API)与批处理(DataSet API)底层执行模型有何不同?
- 4. Flink的时间语义(Event Time、Processing Time、Ingestion Time)区别与应用场景。
- 5. 如何配置Flink使用Event Time?需要哪些组件支持?
- 6. Flink的并行度(Parallelism)如何设置?Slot与Task的关系?
- 7. Flink的JobManager、TaskManager、Client角色与交互流程?
- 8. Flink的Checkpoint机制是如何保证状态一致性的?
- 9. 解释Exactly-Once、At-Least-Once、At-Most-Once语义?
- 10. Flink的反压(Backpressure)机制如何处理?
- 二、API与编程模型
- 1. DataStream API中map、flatMap、filter区别与使用场景。
- 2. KeyedStream的作用是什么?如何通过keyBy实现数据分组?
- 3. 窗口(Window)的分类:滚动窗口、滑动窗口、会话窗口、全局窗口的区别?
- 4. 如何自定义窗口分配器(Window Assigner)?
- 5. 窗口函数(Window Function)中ReduceFunction与ProcessWindowFunction的区别?
- 6. 旁路输出(Side Output)的实现与应用场景?
- 7. 如何通过Broadcast State实现动态规则更新?
- 8. CEP(复杂事件处理)中Pattern API的基本使用方法?
- 9. Table API与SQL的优势及适用场景。
- 10. 如何将DataStream转换为Table?Catalog的作用是什么?
一、基础概念
1. Flink的核心设计目标是什么?与Spark Streaming的架构差异?
Flink以流处理为核心,旨在实现低延迟、高吞吐的事实数据处理,支持对有界与无界数据流的统一处理模型。其设计强调精确地状态管理和时间时间处理能力,确保端到端的一致性语义。
特性 | Flink | Spark Streaming |
---|---|---|
处理模型 | 原生流处理,通过连续逐条事件处理实现毫秒级延迟 | 基于微批处理,将流数据划分为小批次(秒级),延迟较高 |
时间机制 | 优先支持事件时间,通过水位线处理乱序数据,适用于复杂时间窗口场景 | 默认采用处理时间,事件时间支持较弱且需额外配置 |
容错机制 | 基于分布式快照 记录全局一致性状态,支持轻量级容错 | 依赖RDD检查点 机制,因微批处理需额外存储中间结果,开销较大。 |
2. 解释Flink的“有状态流处理”概念。
Flink的“有状态流处理“指在数据流处理过程中,持久化维护中间状态(如聚合结果、会话记录),并结合事件时间机制实现状态一致性。例如,实时统计用户点击量的累计值时,Flink会将每个用户的当前计数保存在状态中,并在窗口触发时输出结果。
3. Flink的流处理(DataStream API)与批处理(DataSet API)底层执行模型有何不同?
流处理模型
连续处理:连续处理基于事件驱动的流水线执行,无明确边界,任务常驻运行。
状态管理:支持动态更新状态,并实时触发窗口计算。
批处理模型
有界数据执行:将批处理视为有界流,按阶段划分任务,完成后释放资源。
优化策略:批处理模式下自动优化执行计划,以减少调度开销。
4. Flink的时间语义(Event Time、Processing Time、Ingestion Time)区别与应用场景。
时间类型 | 定义 | 应用场景 |
---|---|---|
Event Time | 数据产生时的原始时间戳 | 需处理乱序数据的场景(如日志分析) |
Processing Time | 数据到达处理节点时的系统事件 | 低延迟但允许轻微误差的场景(如监控) |
Ingestion Time | 数据进入Flink系统的时间 | 需平衡一致性与处理效率的场景 |
5. 如何配置Flink使用Event Time?需要哪些组件支持?
启用事件时间语义
:设置时间特性为EventTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
指定时间戳与水位线
:通过assignTimestampsAndWatermarks方法定义提取逻辑
依赖组件
:时间戳提取器(从数据中解析实践实践)、水位线生成器(控制乱序数据的最大延迟,如周期性或标点式生成)
6. Flink的并行度(Parallelism)如何设置?Slot与Task的关系?
并行度设置
全局设置:flink-conf.yaml中配置parallelism.default
算子级设置:通过setParallelism()方法指定单个算子的并行度
Slot与Task关系
Slot:TaskManager的资源单元,代表固定大小的计算资源
Task:算子的并行实例,每个Task需分配至少一个Slot
7. Flink的JobManager、TaskManager、Client角色与交互流程?
Client:提交作业到JobManager,可选择生成执行计划。
JobManager:协调作业执行、解析DAG、调度Task、触发Checkpoint、故障恢复。
TaskManager:执行具体Task、接受JobManager分配的Task,管理Slot资源,上报状态。
8. Flink的Checkpoint机制是如何保证状态一致性的?
机制原理
屏障插入:数据流中插入特殊标记,触发各算子快照本地状态
异步快照:状态后端异步持久化状态,避免阻塞处理。
一致性保证
Exactly-Once语义:通过全局一致性快照确保故障恢复后状态与数据流对齐。
9. 解释Exactly-Once、At-Least-Once、At-Most-Once语义?
语义 | 描述 | 典型框架 |
---|---|---|
At-Least-Once | 数据至少处理一次,可能重复 | Spark Streaming默认 |
At-Most-Once | 数据至多处理一次,可能丢失 | 早期Storm(无状态) |
Exactly-Once | 数据严格处理一次,状态与输出一致 | Flink(需要端到端支持) |
10. Flink的反压(Backpressure)机制如何处理?
动态反压检测
网络缓冲区监控:TaskManagerr监控网络缓冲区的填充率,触发反压信号。
自适应速率控制
下游反馈:上游算子根据下游处理能力动态调整发送速率。
流量整形:通过调整窗口触发策略或增加并行度缓解压力。
二、API与编程模型
1. DataStream API中map、flatMap、filter区别与使用场景。
特性 | 作用 | 场景 |
---|---|---|
map | 一对一转换,每个输入元素生成一个输出元素 | 简单字段提取或数值转换 |
flatMap | 一对多转换,单个输入元素可生成零个、一个或多个输出元素 | 文本分词(如将橘子拆分为单词留)或条件分支展开 |
filter | 过滤元素,仅保留满足条件的元素 | 筛选异常数据 |
2. KeyedStream的作用是什么?如何通过keyBy实现数据分组?
作用
状态隔离:相同键的数据由同一子任务处理,支持键控状态(如累加器)
窗口操作基础:窗口计算需基于KeyedStream(如用户ID分组后统计会话时长)
keyBy实现分组
逻辑分区:基于键的哈希值阿静数据分发到不同并行子任务
键选择方式
dataStream.keyBy(event -> event.getUserId()); // 字段选择
dataStream.keyBy(0); // 元组字段索引
3. 窗口(Window)的分类:滚动窗口、滑动窗口、会话窗口、全局窗口的区别?
窗口类型 | 定义 | 适用场景 |
---|---|---|
滚动窗口 | 固定长度、无重叠窗口(如每小时统计) | 周期性聚合(每日PV统计) |
滑动窗口 | 固定长度、可重叠窗口(如每5分钟统计近1小时) | 互动趋势分析(实时流量监控) |
会话窗口 | 动态间隙划分(如用户两次操作间隔超阈值) | 用户行为会话分析 |
全局窗口 | 无边界窗口,需自定义触发器 | 自定义聚合逻辑(如计数达到阈值触发) |
4. 如何自定义窗口分配器(Window Assigner)?
继承WindowAssigner类,重写assignWindows方法定义窗口划分逻辑。
public class DynamicEventTimeWindowAssigner extends WindowAssigner<Object, TimeWindow> { @Override public Collection<TimeWindow> assignWindows(Object element, long timestamp, WindowAssignerContext context) { // 根据元素属性动态生成窗口 long windowSize = calculateWindowSize(element); return Collections.singletonList(new TimeWindow(timestamp, timestamp + windowSize)); }
}
5. 窗口函数(Window Function)中ReduceFunction与ProcessWindowFunction的区别?
特性 | ReduceFunction | ProcessWindowFunction |
---|---|---|
计算模式 | 增量聚合(逐条处理) | 全量聚合(窗口触发时处理所有元素) |
内存开销 | 低(仅维护聚合结果) | 高(需缓存窗口所有元素) |
元数据访问 | 无窗口元数据访问权限 | 可获取窗口起止时间、水位线等 |
适用场景 | 简单聚合(求和、最大值) | 复杂计算(Top-N、自定义指标关联) |
6. 旁路输出(Side Output)的实现与应用场景?
实现方法:使用OutputTag标识旁路输出流
OutputTag<String> errorTag = new OutputTag<String>("error"){};
SingleOutputStreamOperator<String> mainStream = dataStream .process(new ProcessFunction<Event, String>() { @Override public void processElement(Event event, Context ctx, Collector<String> out) { if (event.isInvalid()) { ctx.output(errorTag, "Invalid event: " + event); } else { out.collect(event.toString()); } } });
DataStream<String> errorStream = mainStream.getSideOutput(errorTag);
应用场景
异常数据记录、多分支处理(如日志分级存储)
7. 如何通过Broadcast State实现动态规则更新?
广播规则流:将规则流(如阈值配置)编辑为广播流
DataStream<Rule> ruleStream = ...;
BroadcastStream<Rule> broadcastRuleStream = ruleStream.broadcast(ruleStateDescriptor);
连接主数据流:主数据流与广播流连接,处理规则更新
DataStream<Event> mainStream = ...;
mainStream.connect(broadcastRuleStream) .process(new BroadcastProcessFunction<Event, Rule, Result>() { @Override public void processElement(Event event, ReadOnlyContext ctx, Collector<Result> out) { // 使用最新规则处理事件 Rule currentRule = ctx.getBroadcastState(ruleStateDescriptor).get("key"); if (event.getValue() > currentRule.getThreshold()) { out.collect(new Result(event, "ALERT")); } } @Override public void processBroadcastElement(Rule rule, Context ctx, Collector<Result> out) { // 更新广播状态 ctx.getBroadcastState(ruleStateDescriptor).put("key", rule); } });
8. CEP(复杂事件处理)中Pattern API的基本使用方法?
定义事件模式:通过Pattern.begin()构建事件序列规则
Pattern<Event, ?> pattern = Pattern.<Event>begin("start") .where(event -> event.getType().equals("login")) .next("fail").times(3) .within(Time.seconds(10));
应用场景:检测连续登录失败、订单欺诈模式等复杂事件序列
9. Table API与SQL的优势及适用场景。
优势
声明式编程:简化逻辑表达(如JOIN、GROUP BY)
统一流批处理:相同语法处理有界/无界数据
自动优化:基于Calcite优化器生成高效执行计划
适用场景:快速开发ETL任务、交互式分析、与BI工具集成
10. 如何将DataStream转换为Table?Catalog的作用是什么?
转换方法
创建Table环境并注册DataStream为临时表
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
Table eventTable = tableEnv.fromDataStream(dataStream, $("userId"), $("eventTime"));
tableEnv.createTemporaryView("Events", eventTable);
Catalog作用
元数据管理:统一管理表、数据库、UDF等信息,支持跨会话复用。
多数据源集成:通过Hive Catalog访问Hive元数据,实现湖仓一体。
相关文章:
大数据Flink相关面试题(一)
文章目录 一、基础概念1. Flink的核心设计目标是什么?与Spark Streaming的架构差异?2. 解释Flink的“有状态流处理”概念。3. Flink的流处理(DataStream API)与批处理(DataSet API)底层执行模型有何不同&…...
填坑记: 古董项目Apache POI 依赖异常排除
当你看到NoSuchMethodError的时候,不要慌,深呼吸,这可能只是JAR包版本的问题… 引子:一个平静的周二下午 那是一个看似平常的周二下午,系统运行良好,开发团队在有条不紊地推进着新功能的开发。突然&#x…...

leetcode2934. 最大化数组末位元素的最少操作次数-medium
1 题目:最大化数组末位元素的最少操作次数 官方标定难度:中 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,这两个数组的长度都是 n 。 你可以执行一系列 操作(可能不执行)。 在每次操作中,你可以选…...

环境配置与MySQL简介
目录 1 环境配置 2 MySQL简介 1 环境配置 本专栏使用CentOS7进行讲解。首先我们查看系统中是否已经安装了MySQL,可以使用rpm -qa 命令查看系统安装包/压缩包 列表 这只是看我们是否下载过对应安装包,不一定就安装了。如果我们需要重新下载,…...
07_SpringBoot2集成Redis连接失败
🌟 07_SpringBoot2 集成 Redis 连接失败 ❓ 场景描述 在 Spring Boot 2 项目中集成 Redis 时,将配置写成了如下形式: spring:data:redis:host: localhostport: 6379password: 123456结果启动项目时 Redis 连接失败,报错内容类似…...
mysql的一个缺点
最近再移植一个从oracle转mysql的项目,喜提一个报错: You cant specify target table A016 for update in FROM clause 对应的程序代码: public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…...

适用于 iOS 的 开源Ultralytics YOLO:应用程序和 Swift 软件包,用于在您自己的 iOS 应用程序中运行 YOLO
一、软件介绍 文末提供程序和源码下载 该项目利用 Ultralytics 最先进的 YOLO11 模型将您的 iOS 设备转变为用于对象检测的强大实时推理工具。直接从 App Store 下载该应用程序,或浏览我们的指南,将 YOLO 功能集成到您自己的 Swift 应用程序中。 二、…...

Java零基础学习Day12——集合ArrayList
一、基本使用 1. 集合与数组 集合只存引用数据类型;长度可变 数组可存基本数据类型、引用数据类型;长度固定 2. 基本格式 ArrayList<String> list new ArrayList<>(); 3. 方法 增、删 import java.util.ArrayList; public class St…...

[论文阅读]Formalizing and Benchmarking Prompt Injection Attacks and Defenses
Formalizing and Benchmarking Prompt Injection Attacks and Defenses Formalizing and Benchmarking Prompt Injection Attacks and Defenses | USENIX 33rd USENIX Security Symposium (USENIX Security 24) 提出了一个框架来形式化提示注入攻击,对提示注入攻击…...
ffmpeg 写入avpacket时候,即av_interleaved_write_frame方法是如何不需要 业务层释放avpacket的 逻辑分析
我们在通过 av_interleaved_write_frame方法 写入 avpacket的时候,通常不需要关心 avpacket的生命周期。 本文分析一下内部实现的部分。 ----> 代表一个内部实现。 A(){ B(); C(); } B(){ D(); } 表示为: A ---->B(); ---->D(); ---->C(); int…...
目标检测中的IoU损失函数
目标检测中的IoU损失函数 目标检测中的IoU损失函数一、为什么需要IoU损失函数?二、常见IoU损失函数详解1. **IoU Loss**2. **GIoU Loss(Generalized IoU)**3. **DIoU Loss(Distance IoU)**4. **CIoU Loss(C…...
深入剖析 MyBatis 位运算查询:从原理到最佳实践
深入剖析 MyBatis 位运算查询:从原理到最佳实践 引言 在数据库设计中,位运算是一种高效存储和查询多选字段的常用技术。然而,在实际开发中,特别是在使用 MyBatis 这样的 ORM 框架时,位运算查询往往会遇到一些意想不到…...

JavaScript性能优化实战,从理论到落地的全面指南
在前端开发领域,JavaScript的性能优化是提升用户体验的核心环节。随着Web应用复杂度的提升,开发者面临的性能瓶颈也日益多样化。本文将从理论分析、代码实践和工具使用三个维度,系统性地讲解JavaScript性能优化的实战技巧,并通过大…...
第二个五年计划!
下一阶段!5年后!33岁!体重维持在125斤内!腰围74! 健康目标: 体检指标正常,结节保持较小甚至变小! 工作目标: 每年至少在一次考评里拿A(最高S,A我理…...
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
文章目录 🕊️ 中介者模式(Mediator Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(成就系统协调)1. 定义中介者接口与同事基类2. 实现具体同事类3. 实现具体中介者4. 客户端使用 四、模式…...
分布式微服务系统架构第125集:AI大模型
加群联系作者vx:xiaoda0423 仓库地址:https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ 一、user 表(用户表) sql 复制编辑 create table if not exists user (id bigint auto_increment comment id pri…...

MySQL 8.0 OCP 英文题库解析(三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题16~25 试题16:…...
MapReduce 模型
引言 MapReduce 是分布式计算领域的里程碑式模型,由 Google 在 2004 年论文中首次提出,旨在简化海量数据处理的复杂性。其核心思想是通过函数式编程的 Map (映射)和 Reduce (归约)阶段&#x…...

Docker容器启动失败?无法启动?
Docker容器无法启动的疑难杂症解析与解决方案 一、问题现象 Docker容器无法启动是开发者在容器化部署中最常见的故障之一。尽管Docker提供了丰富的调试工具,但问题的根源往往隐藏在复杂的配置、环境依赖或资源限制中。本文将从环境变量配置错误这一细节问题入手&am…...
mysql dump 导入导出用法
导出 指定库中指定的表 mysqldump -uroot -pmysql databasename table1 table2 > ./bak.sql 导入 mysql -uroot -p123456 databasename< ./bak.sql 导出指定数据库 mysqldump -uroot -p123456 databasename > ./databasename.sql 导入: mysql -uroot…...

MySQL 数据类型全面指南:从理论到实践
在数据库设计和开发中,数据类型的选择是构建高效、可靠系统的基石。MySQL作为最流行的关系型数据库之一,提供了丰富的数据类型以满足各种数据存储需求。本文将全面介绍MySQL的数据类型体系,通过理论讲解和实际示例,帮助开发者做出…...
第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化
第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化 🧠 一、PWM 占空比与亮度/音量控制原理 PWM(Pulse Width Modulation,脉宽调制)是一种常用的数字信号控制方式,广泛应用于 LED 灯光亮度、电…...
Quartus与Modelsim-Altera使用手册
目录 文章内容: 视频内容: Quartus: ModelSim: 顶层设计与子模块: 只是对所查阅的相关文章的总结与视频总结 文章内容: 这篇对基础操作很详细: 一、Quartus II软件的使用_quartus2软件上…...

uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
在父组件中给子组件添加类名,子组件的样式由父组件决定 由于"微信小程序"存在【样式隔离机制】,且默认设置为isolated(启用样式隔离),因此这里给出以下两种解决方案: // 小程序编译机制 1. 当 <style scoped> 存在时&#…...

【HCIA】BFD
前言 前面我们介绍了浮动路由以及出口路由器的默认路由配置,可如此配置会存在隐患,就是出口路由器直连的网络设备并不是运营商的路由器,而是交换机。此时我们就需要感知路由器的存活状态,这就需要用到 BFD(Bidirectio…...

计算机视觉最不卷的方向:三维重建学习路线梳理
提到计算机视觉(CV),大多数人脑海中会立马浮现出一个字:“卷”。卷到什么程度呢?2022年秋招CV工程师岗位数下降了16%,但求职人数增加了23%,求职人数与招聘岗位的比例达到了恐怖的15:1࿰…...

android抓包踩坑记录
由于需要公司业务需求,需要抓取APP中摄像机插件的网络包,踩了两天坑,这里做个总结吧。 事先准备 android-studio emulatesdk 需要android模拟器和adb调试工具。如果已经有其他模拟器的话,可以只安装adb调试工具即可 mitmproxy…...

Webpack其他插件
安装html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…...
如何正确地写出单例模式
如何正确地写出单例模式 | Jarks Blog 枚举方式: public class SingletonObject {private SingletonObject() {}/*** 枚举类型是线程安全的,并且只会装载一次*/private enum Singleton {INSTANCE;private final SingletonObject instance;Singleton() {…...
常见相机焦段的分类及其应用
相机焦段是指镜头的焦距范围,决定了拍摄时的视角、画面范围和透视效果。不同焦段适合不同的拍摄场景和主题,以下是常见焦段的分类及其应用: 一、焦段的核心概念 焦距:镜头光学中心到成像传感器的距离(单位:…...