Spark 批处理与结构化流测试

共 19 题
#

1. Spark 单元测试中如何用本地模式验证 RDD/DataFrame 的转换逻辑,规避集群依赖?

A 本地模式无法测试 DataFrame 转换逻辑
B 本地模式测试必须依赖真实集群
C 本地模式只能测 RDD,不能测 DataFrame
D 用 local[*] 启动本地 SparkSession,用内存集合构造输入并断言转换结果,将外部数据源 mock 掉,从而规避集群依赖 ✓ 正确答案
#

2. Spark Structured Streaming 的窗口计算测试如何控制事件时间与水位线(Watermark)?

A 通过手动推进时钟、注入带时间戳数据并设置 watermark,可确定性验证窗口触发时机与迟到数据处理 ✓ 正确答案
B 水位线不影响窗口计算
C 迟到数据总是被丢弃
D 事件时间只能依赖真实时钟,无法控制
#

3. Spark Catalyst 优化器对测试断言的影响,逻辑计划与物理计划的差异如何导致结果不同

A 物理计划与测试无关
B 逻辑计划与物理计划总是相同
C 优化器不影响结果,只需断言执行顺序
D Catalyst 可能改变 join 顺序、过滤位置与聚合顺序,测试应断言排序后的结果集而非执行顺序,并通过 explain 检查物理计划 ✓ 正确答案
#

4. 如何测试 Spark 任务的"数据倾斜"修复方案(加盐/广播/重分区)是否真正生效?

A 只要耗时下降,修复就有效
B 修复方案无需关注结果正确性
C 应对比修复前后 Task 耗时与数据分布,验证加盐/广播/重分区后均衡且耗时下降,同时确认结果与未修复基线一致 ✓ 正确答案
D 加盐总是能解决所有倾斜
#

5. Spark 任务失败重试与 Checkpoint 恢复后,如何验证输出数据的幂等性?

A 重试后输出可能有重复,无法避免
B 应通过多次执行、失败重试与从 Checkpoint 恢复,比对输出行数、内容与主键唯一性,验证无重复无丢失 ✓ 正确答案
C Checkpoint 恢复后无需验证数据一致性
D 幂等性与 sink 无关
#

6. 如何对 Spark SQL 的谓词下推、分区裁剪做执行计划级断言?

A 通过解析 executedPlan 断言 Filter 是否下推到 Scan 前、PartitionFilters 是否包含目标分区条件,验证谓词下推与分区裁剪生效 ✓ 正确答案
B 分区裁剪与执行计划无关
C 只要结果正确,性能优化无需断言
D 无法从执行计划判断谓词下推是否生效
#

7. Spark 批处理测试,RDD/DataFrame 转换逻辑的单元测试、多数据源(Hive/Kafka)的集成测试如何做?

A 多数据源无需集成测试
B 单元测试即可覆盖所有场景,无需集成测试
C 集成测试无法验证数据源对接
D 单元测试用本地模式验证转换逻辑,集成测试用真实/嵌入式 Hive、Kafka 数据源验证对接,分层覆盖逻辑与真实性 ✓ 正确答案
#

8. Structured Streaming 的测试,水印、窗口、延迟数据处理(late data)如何构造流式场景验证?

A 通过手动推进时钟、注入带事件时间的数据并设置水印,可确定性验证窗口触发、迟到数据丢弃与重聚合行为 ✓ 正确答案
B 迟到数据总是被重新聚合
C 水印设置不影响迟到数据
D 流式场景无法确定性测试
#

9. 结构化流的幂等输出测试,Sink 重复写入场景下如何验证 Exactly-Once 语义

A 应通过唯一键去重、批次幂等 Sink 与重复批次输入,断言输出无重复主键且总量正确,验证 Exactly-Once ✓ 正确答案
B 重复写入不会导致重复输出
C 用 Kafka 事务就能保证任何 Sink 都 Exactly-Once
D 幂等性与主键无关
#

10. UDF 与闭包的序列化陷阱,自定义函数中未序列化对象、外部状态与广播变量如何导致任务失败,如何提前暴露?

A 闭包会在 executor 上序列化分发,未序列化对象或外部状态会导致 NotSerializableException,应及早序列化验证并用广播变量替代外部状态 ✓ 正确答案
B 广播变量也会被序列化多次
C 外部状态无法影响任务结果
D 闭包引用的对象无需序列化
#

11. 分区与并行度对结果的影响,repartition 与 coalesce 的 shuffle 行为、数据分布与并行度变化如何用测试断言?

A repartition 与 coalesce 行为完全相同
B repartition 触发全量 shuffle、coalesce 可避免 shuffle,应验证分区数、数据分布与 shuffle 行为,并确认结果不因分区变化而改变 ✓ 正确答案
C coalesce 总是触发 shuffle
D 分区数不影响并行度
#

12. Spark 3.x 的 AQE(自适应查询执行)开启后,如何防止测试结果在不同规模数据下不稳定?

A AQE 不会改变执行计划
B AQE 开启后结果一定不稳定
C AQE 会按数据动态调整计划,测试应断言逻辑结果而非分区数/计划等物理细节,并可在需要时固定相关参数保证可复现 ✓ 正确答案
D 测试必须依赖 Task 数断言
#

13. Spark 任务的性能与稳定性测试,数据倾斜、shuffle 调优、OOM 场景如何验证与定位?

A OOM 只能靠增大内存解决
B 数据倾斜不影响性能
C 应通过统计 key 分布与 Task 耗时定位倾斜、对比 shuffle 参数验证调优、构造大内存场景触发 OOM 并监控资源定位根因 ✓ 正确答案
D shuffle 调优无需对比验证
#

14. Spark 测试数据,模拟与回放?

A 模拟数据能完全替代生产数据
B 回放数据无需脱敏
C 模拟数据可控覆盖边界与异常,回放数据保留真实分布用于回归与性能,两者互补结合使用 ✓ 正确答案
D 模拟数据无法覆盖边界场景
#

15. Spark 任务验证,输出与血缘?

A 只需验证输出结果正确即可
B 应通过行数/内容/主键对账验证输出正确,并通过解析血缘确认上下游依赖关系正确,两者结合 ✓ 正确答案
C 血缘与输出验证无关
D 输出验证无需与期望基线比对
#

16. Spark Structured Streaming 的端到端延迟测试,处理延迟、事件时间延迟如何度量与断言?

A 处理延迟度量计算耗时,事件时间延迟度量产生到处理的时间差,应统计延迟分布并与 SLA 阈值断言 ✓ 正确答案
B 处理延迟与事件时间延迟是同一概念
C 事件时间延迟无法度量
D 延迟测试无需设置阈值
#

17. Spark 测试的种子数据与 golden 文件管理,输入输出基线如何版本化与更新?

A golden 文件可以随意覆盖更新
B 种子数据与 golden 文件应版本化纳入版本管理,更新时先审查变更合理性再重新生成,防止掩盖回归 bug ✓ 正确答案
C golden 文件无需与代码一起提交
D golden 文件更新不需要审查
#

18. Spark 多版本兼容性测试,Spark 2/3 行为差异对任务结果的影响如何回归?

A Spark 2 与 3 行为完全一致
B 升级 Spark 无需回归
C 行为差异不影响结果
D 应在双版本分别执行并对账,重点验证类型转换、NULL/空串、窗口函数与 legacy 开关等差异,通过兼容开关或改写 SQL 保证结果一致 ✓ 正确答案
#

19. Spark 缓存与持久化策略测试,cache 与 persist 的存储级别选择、内存不足降级与失效时机如何验证?

A 缓存失效无需验证
B cache 与 persist 完全等价
C 内存不足时缓存不会丢失
D 应验证存储级别选择、内存不足时的降级行为与 unpersist 失效时机,并确认无论是否降级结果一致 ✓ 正确答案