
Spark SQL 的 Catalyst 优化器原理是什么?一条 SQL 是怎么变成物理计划的?
考察 Catalyst 的完整流水线:逻辑计划解析、Analyzer 绑定元数据、规则优化(谓词下推/列裁剪/常量折叠)、代价模型选 join 策略、生成物理计划与 code-gen 执行。
共 12 篇文章

考察 Catalyst 的完整流水线:逻辑计划解析、Analyzer 绑定元数据、规则优化(谓词下推/列裁剪/常量折叠)、代价模型选 join 策略、生成物理计划与 code-gen 执行。

考察 Spark 在 YARN 上的完整生命周期:ApplicationMaster 申请资源、driver 位置(client/cluster)、executor 注册与任务分发,以及两种部署模式的网络拓扑差异和选型。

考察两种物化机制的本质差异:cache 保留血缘、内存/磁盘存储、服务于复用提速;checkpoint 切断血缘、写可靠存储、服务于长链容错,以及 cache 后再 checkpoint 的标准用法。

考察数据倾斜的实战处理:从 UI 指标定位倾斜,到加盐打散、两阶段聚合、广播小表、过滤热点 key 等手段的取舍,以及 AQE 自动倾斜优化的边界。

考察对 Spark 3.x AQE 的理解:运行时利用 shuffle 物化后的真实统计,动态合并小分区、切换 join 策略(SMJ 转 BHJ)、拆分倾斜分区,解决计划阶段统计不准的问题。

考察 Spark 1.6+ 统一内存管理:execution 与 storage 区域动态借用、on-heap/off-heap 的划分、OOM 时的逐出与 spill 策略,以及 spark.memory.fraction 等参数的调优逻辑。

考察广播 join 的完整链路:driver 收集、TorrentBroadcast 分块分发、executor 建 hash 表探测,autoBroadcastJoinThreshold 的语义与调优,以及统计失真、driver OOM 等典型坑。

考察对 Broadcast Hash Join、Shuffled Hash Join、Sort Merge Join 三种实现的原理与适用场景,以及 Catalyst 的 join 选择逻辑和强制广播的 hint 写法。

考察对 map 端预聚合(combine)的理解:reduceByKey 在 shuffle 前做本地聚合削减数据量,groupByKey 全量搬运,网络 IO 和内存压力差异可达数量级,以及 groupByKey 不可替换的场景。

考察对 Spark shuffle 机制演进的理解:HashShuffle 的小文件问题、SortShuffleManager 的排序与归并、unsafe/sort 分支的选择条件,以及 Tungsten 的二进制排序和堆外内存优化。

考察 DAG 调度核心:宽窄依赖的本质区别在于子分区是否依赖父 RDD 全部分区,stage 以 shuffle(宽依赖)为边界切分,决定了流水线执行与失败重算的粒度。

考察对 Spark 计算抽象的理解:RDD 五大特性、immutable 设计的动机、血缘(lineage)如何通过重算实现容错,以及血缘过长时 checkpoint 的兜底作用。