Spark高频面试问题

基础概念

Spark有哪些核心组件

集群级别

Master:管理集群资源,接收任务提交,分配任务到worker。

Worker:接收master指令,启停executor,向master发送心跳。

应用级别

Driver:解析任务代码,转成执行计划,申请资源,分发任务给executor。

Executor:执行具体计算任务,管理内存数据,向driver汇报状态。

其他

ClusterManager:资源调度框架,Yarn/Mesos/Standalone

DAGScheduler:划分Stage,构建依赖关系

TaskScheduler:负责任务调度、重试、负载均衡

Task:最小执行单元,MapTask、ReduceTask

RDD、DataFrame和DataSet

RDD 是 Spark 底层分布式数据集,无 Schema、无类型、无优化器;

DataFrame 基于 RDD,增加表结构与字段类型,内置优化引擎,弱类型,适配 SparkSQL;

Dataset 基于 DataFrame,增加编译期强类型校验,兼顾类型安全与执行性能。

内存管理

解释下Spark内存模型

Spark里的内存主要分为执行内存和存储内存。

执行内存主要是用于算子计算过程中的开销,如shuffle排序、聚合、join等。内存不足时,计算中间数据会溢写到磁盘。

存储内存主要是用于缓存RDD、广播变量、checkpoint持久化数据等。内存不足时,冷门缓存数据会被淘汰或落盘。

这两部分内存是由内存管理器统一管理和动态调整的,二者可以相互抢占调整,不足时自动溢出到磁盘,避免OOM,使用memory.fraction/storageFraction这两个参数来调节。

性能优化

如何处理数据倾斜

  1. 优化数据源,过滤无效key,拆分大小key

  2. 优化join逻辑,广播小表

  3. 重分区打散,repartition均匀分区,coalesce减少小文件

  4. 随机前缀打散

  5. 增加reduce并行度,spark.sql.shuffle.partitions

  6. 开启倾斜自适应,单独拆分倾斜任务

如何优化资源配置

  1. 合理分区,spark.default.parallelism,spark.sql.shuffle.partitions

  2. 合理内存,spark.driver/executor.memory,spark.storage.memoryFraction,spark.shuffle.memoryFraction

  3. 调度策略,FIFO、FAIR、Capacity scheduler

  4. 数据本地化,spark.locality.wait,spark.locality.wait.process,spark.locality.wait.node