news 2026/4/16 13:32:18

2026字节跳动大数据架构师面经:谓词下推与Flink状态深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026字节跳动大数据架构师面经:谓词下推与Flink状态深度解析

本文分享字节跳动大数据架构师面试经验,详细解析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(托管状态)

  1. RowState 由用户自行管理,只支持 字节 数组,所有状态都要转换为二进制字节数组才可以。
  2. 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 由两部分组成,startKeyGroupendKeyGroup,实际上指的是 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 范围。

  1. new-task 0的 keygroup 只与 task0 有交叉,重建 new-task-0 的状态时,restoreStateHandles 中只包含 task-0 的 checkpoint 数据。
  2. new-task-1的 keygroup 只与 task-0,1 都有交叉,重建 new-task-1 的状态时,restoreStateHandles 中需要包含 task-0,1 的 checkpoint 数据。
  3. new-task 2的 keygroup 只与 task1 有交叉,重建 new-task-2 的状态时,restoreStateHandles 中只包含 task-1 的 checkpoint 数据。

上述原理 对应到 源码 RocksDBIncrementalRestoreOperation#restoreWithRescaling 中的含义就是

  1. 直接从 StateBackend 创建 DB
  2. 对这个 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%免费】🆓

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:19:21

FlinkCDC实战:将 MySQL 数据同步至 ES

?? 当前需要处理的业务场景: 将订单表和相关联的表(比如: 商品表、子订单表、物流信息表)组织成宽表, 放入到 ES 中, 加速订单数据的查询. 同步数据到 es. 概述 1. 什么是 CDC 2. 什么是 Flink CDC 3. Flink CDC Connectors 和 Flink 的版本映射 实战 1. 宽表查询 1.1 …

作者头像 李华
网站建设 2026/4/15 23:07:55

DBeaver连接本地MySQL、创建数据库表的基础操作

一、连接本地MySQL 1、新建连接 打开DBeaver,点击左上角的文件或者点击箭头所指的连接按钮。新建数据库连接-选择数据库(mysql),点击“下一步”输入服务器地址、端口、用户名、密码(数据库自己选填,不填则连接所有数据库&#xff…

作者头像 李华
网站建设 2026/4/16 12:21:08

基于Django的网络设备租赁系统设计与实现-计算机毕业设计源码+LW文档

摘 要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,网络设备租赁系统利用计算机网络实现信息化管理,使整个网络设备租赁的发展和服务水平有显著提升。在系统开发过程中…

作者头像 李华
网站建设 2026/4/16 13:42:32

docker中配置redis

1、常规操作 docker pull redis(默认你的docker中没有redis) 2、查看redis是否拉取成功 docker images redis 3、创建目录,在你的宿主机,(我是在虚机中建的centos7)为了给redis配置文件使用 4、下载redis…

作者头像 李华
网站建设 2026/4/15 13:19:49

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下: Docker[这里是图片001]https://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本,先拉取镜像。命令如下: docker pull redis:6.2.14查看刚刚…

作者头像 李华
网站建设 2026/4/16 12:15:23

微信小程序 PHP_uniapp的大学生校园生活服务系统的 二手 自习室 会议 失物招领40ifxo7d

目录微信小程序与PHPUniApp的校园生活服务系统设计项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理微信小程序与PHPUniApp的校园生活服务系统设计 该系统整合二手交易、自习室预约、会议管理及失物招领四大功能模块,采用前后端分离架构…

作者头像 李华