内容提要
本文介绍了Spark Core的基本功能和应用场景,RDD的特性和转换算子和行动算子的使用,共享变量的使用方法和原理,内核调度和DAG的作用,宽窄依赖和内存迭代计算的优势,并行度设置和Shuffle阶段的工作原理,以及任务调度和层级关系。
延伸解读
RDD 分区与本地性:性能优化的关键
RDD 的分区数决定了并行计算的任务数,默认采用 CPU 核心数。分区规划会尽量靠近数据存储位置,实现本地读取,避免网络传输。Spark 在调度时遵循“移动数据不如移动计算”的理念,尽可能将任务分配到数据所在节点。但本地读取并非 100% 保证,因此这是“可能的”特性。合理设置分区数对性能至关重要。
宽窄依赖与 Stage 划分:理解 DAG 调度
窄依赖指父 RDD 一个分区只对应子 RDD 一个分区,可在内存中高效并行执行;宽依赖则对应多个子分区,需要 Shuffle。Spark 根据宽依赖划分 Stage,从后向前遇到宽依赖就切分,Stage 内部都是窄依赖,形成内存迭代管道。因此,减少宽依赖能降低 I/O 和网络开销,提升性能。
缓存与 Checkpoint:持久化策略选择
缓存将 RDD 数据保留在内存或磁盘,保留血缘关系,丢失后可重算,但分区越多风险越高。Checkpoint 仅支持硬盘存储,不保留血缘关系,支持写入 HDFS,被视为安全。缓存性能更好,Checkpoint 更可靠。建议内存充足时用 MEMORY_AND_DISK,内存小则用 DISK_ONLY 或 Checkpoint。
并行度设置:平衡资源与效率
并行度指同时运行的 task 数量,建议设置为 CPU 总核心的 2~10 倍。例如 100 核心可设 200~1000 并行度。这样即使某些 task 提前完成,后续 task 也能补上,避免 CPU 空闲。设置过低会导致资源利用不足,过高则增加调度开销。可通过代码、提交参数或配置文件调整全局并行度。
Q&A
Spark Core 的主要功能是什么?
Spark Core 是 Apache Spark 的核心模块,提供分布式内存计算和数据处理的基础支持。
RDD 的特性有哪些?
RDD 的特性包括不可变性、可分区性和支持并行计算。
如何创建 RDD?
RDD 可以通过并行化集合或读取外部数据源(如文件)来创建。
Spark 中的转换算子和行动算子有什么区别?
转换算子是懒加载的,返回值仍是 RDD;行动算子会触发计算,返回非 RDD 的结果。
DAG 在 Spark 中的作用是什么?
DAG 描述了 Spark 作业的各个阶段及其依赖关系,是任务调度和执行的核心。
Spark 的并行度应该如何设置?
建议将并行度设置为 CPU 核心数的 2 到 10 倍,以提高任务执行效率。