基础概念
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这两个参数来调节。
性能优化
如何处理数据倾斜
优化数据源,过滤无效key,拆分大小key
优化join逻辑,广播小表
重分区打散,repartition均匀分区,coalesce减少小文件
随机前缀打散
增加reduce并行度,spark.sql.shuffle.partitions
开启倾斜自适应,单独拆分倾斜任务
如何优化资源配置
合理分区,spark.default.parallelism,spark.sql.shuffle.partitions
合理内存,spark.driver/executor.memory,spark.storage.memoryFraction,spark.shuffle.memoryFraction
调度策略,FIFO、FAIR、Capacity scheduler
数据本地化,spark.locality.wait,spark.locality.wait.process,spark.locality.wait.node