本文分享字节跳动大数据架构师面试经验,详细解析SQL谓词下推技术原理与实现,以及Flink状态管理机制。涵盖状态类型划分(KeyedState/OperatorState)、扩缩容原理、状态重建流程及KeyGroup概念,通过图示与代码示例帮助读者掌握大数据面试核心知识点。
今年字节为了抢顶尖校招人才,薪资给的真的太多了,真的吓到我了。
字节在今年校招给 26 届应届生 Top Seed 人才计划开的薪资是年薪 260w + 豆包股,这是双一流硕士给的薪资待遇,说实话,我慕了
说年薪260w 可能大家都没啥感觉,按照一年工作日 248 天算的话,每天薪水10483 元,一天工资上万,一下子就直观了
大家有没有后悔自己为啥早毕业好几年,要是现在毕业,非得去面个 seed 岗位。
行了,刚到 2026 年年初,估计好多小伙伴也在找工作,这里给大家奉献一篇之前小伙伴面试字节的大数据架构师岗位面经,帮助你们回忆回忆知识点~
面试官:在SQL执行时,谓词下推在什么时候可以做过滤下推?
谓词下推的含义:
将外层查询块的 WHERE 子句中的谓词移入所包含的较低层查询块(例如视图),从而能够提早进行数据过滤以及有可能更好地利用索引。
举个例子:
当有两张表 join 时,先对两张表 join, 然后进行过滤操作。此时可以先 filter 条件,先将 两张表无用数据过滤掉,然后再进行 join 操作。
面试官:ok,我现在给你两张表,你求一下所有 100 分成绩的学生,先用正常 sql 写一下,然后再用谓词下推的方式写一下
现在有两张表 student,Grade,求所有 100 分成绩的学生,
正常 sql :
SELECT * FROM Student t , Grade gwhere t.S_id = g.S_idAND g.grade = 100谓词下推方式:
SELECT * FROM Student RIGHT JOIN t1 (SELECT * FROM Grade WHERE grade = 100) t2ON t1.S_id = t2.S_id面试官:谓词下推的原理图会吗?在电脑屏幕上画一下
我靠, SQL 写完还不行,还得画一下图,我也是醉了…
原理图如下:
面试官:flink 状态了解吗?包含几种划分方式
state 一般指一个具体的 Task/Operator 的状态,主要是用来保存中间的计算结果或者缓存数据。
state 按照 Flink 管理还是用户管理分为:RowState(原始状态)和 Managedstate(托管状态)
- RowState 由用户自行管理,只支持 字节 数组,所有状态都要转换为二进制字节数组才可以。
- ManagedState 由 Flink RunTime 管理,支持多种数据结构,如 Map List 等
State 按照 key 划分,可以分为 KeyedState,OperatorState.
keyedState只能用在 keyStream 上,并且每一个 key 对应一个 state 对象,keyedState 保存在 StateBackend 中,通过 RuntimeContext 访问,实现 Rich Function 接口,支持多种数据结构,如 ListState、MapState、AggregatingState 等
OperatorState 可以用于所有算子,但整个算子只对应一个state,实现 CheckpointedFunction 或者 ListCheckpointed 接口,目前只支持 ListState 数据结构。
面试官: ok,那介绍一下 keyState 扩缩容的原理
所谓扩缩容,在Flink中就是指改变算子的并行度。Flink 是不支持动态改变并行度的,必须先停止作业,修改并行度之后再从 Savepoint 恢复。如果没有状态,那么不管scale-in还是scale-out都非常简单,只要做好数据流的重新分配就行。
举个例子, 假如原先 map 算子的并行度为 2,现在任务暂停了,我们把算子并行度改为 3 或者 改为 1 ,这时通过指定savepoint,重新恢复 job 任务。如下图的例子所示。
但对于有状态数据,如果并行度改变之后,HDFS 里的状态数据将经历状态下载、状态重建,被重新分配给各个sub-Task,如下图所示:原理图如下图所示:
面试官: 状态是如何重建的 ?
对于有状态数据,由于并行度从 2 变成 3。
最开始 Flink 中的 key 是按照hash(key) % parallelism的规则分配到各个 Sub-Task 上去的,那么我们可以在扩容完成后,根据新分配的 key 集合从 HDFS 直接取回对应的Keyed State数据。如下图所示:并行度从 从 2 增加到 3 后,Keyed State 中各个 key 的状态重建原理图。
但因为上述在 Checkpoint 发生时,状态数据是顺序写入文件系统的。从上图可以看出,当状态重建时,存在两个问题:
1. 状态随机读取,效率低下;
2. 缩放之后各 Sub-Task 处理的 key 有可能大多都不是缩放之前的那些 key
基于这两个问题,引出了 KeyGroup。
Key Group是 Keyed State 分配的原子单位,且 Flink 作业内 ,Key Group 的数量与最大并行度相同,也就是说 Key Group 的索引位于 [0, maxParallelism - 1]的区间内。每个 Sub-Task 都会处理一个到多个 Key Group,在源码中,以KeyGroupRange数据结构来表示。
KeyGroupRange 由两部分组成,startKeyGroup和endKeyGroup,实际上指的是 Key Group 的索引,左闭右开区间。
当并行度从 2 改为 3 时,KeyGroupRange 对应的原理图如下:
面试官: 状态重建时,调用的源码了解吗 ?
在并行度更改后,需要对原先的状态进行重建,状态重建的代码实现主要位于
RocksDBIncrementalRestoreOperation#restoreWithRescaling(Collection restoreStateHandles),
参数 restoreStateHandles 表示与该 task 实例所负责的 keygroup 有交叉的 state。
下面以上图对 restoreStateHandles 做一个具象解释,假设有个 task 的并行度是 2,对应的 task 实例为 task-0,1,之后将其并行度调整到 3,对应的 task 实例为 new-task-0,1,2。图中的条形长度表示 task 实例所负责的 keygroup 范围。
new-task 0的 keygroup 只与 task0 有交叉,重建 new-task-0 的状态时,restoreStateHandles 中只包含 task-0 的 checkpoint 数据。new-task-1的 keygroup 只与 task-0,1 都有交叉,重建 new-task-1 的状态时,restoreStateHandles 中需要包含 task-0,1 的 checkpoint 数据。new-task 2的 keygroup 只与 task1 有交叉,重建 new-task-2 的状态时,restoreStateHandles 中只包含 task-1 的 checkpoint 数据。
上述原理 对应到 源码 RocksDBIncrementalRestoreOperation#restoreWithRescaling 中的含义就是
- 直接从 StateBackend 创建 DB
- 对这个 StateBackend 进行剪枝,删除不需要的 keygroup。
我们知道 new-task-1 的 keygroup 只与 task-0,1 都有交叉,重建 new-task-1 的状态时,restoreStateHandles 中需要包含 task-0,1 的 checkpoint 数据。所以在对 StateBackend 进行剪枝时,就是找到 StateHandle 与目标 keygroup 非重叠的部分,然后调用deleteRange方法,将其删除。图解表示如下:
如何学习AI大模型?
如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!
这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!
第一阶段:从大模型系统设计入手,讲解大模型的主要方法;
第二阶段:在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段:大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段:大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段:大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段:以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段:以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
100套AI大模型商业化落地方案
大模型全套视频教程
200本大模型PDF书籍
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
LLM面试题合集
大模型产品经理资源合集
大模型项目实战合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓