请解释 Apache Spark 中分区的概念,并说明有哪些方法可以调整 RDD 的分区数量?
考察说明
考查对 Spark 分区概念的理解以及调整分区数量的常用操作。
回答思路
- 【回答框架 1】分区是 RDD 逻辑上被划分成的多个数据块,每个分区对应集群中的一个任务执行单元,分区数决定了任务的并行度。
- 【回答框架 2】调整 RDD 分区数主要有两种方式:一是通过 repartition 方法,它会进行 shuffle 操作,可增加或减少分区数,但代价较高;二是通过 coalesce 方法,它默认不进行 shuffle,只能减少分区数,能有效减少网络传输。
- 【回答框架 3】对于增加分区数,应使用 repartition;对于减少分区数,优先考虑 coalesce 以减少 shuffle 开销。此外,创建 RDD 时可以通过指定分区数参数(如 parallelize 的 numSlices)来初始设置分区数。
- 【回答框架 4】在应用场景上,应根据数据量和集群资源合理设置分区数,避免分区过小导致任务过多、调度开销大,或分区过大导致数据倾斜和资源浪费,通常建议分区数为集群核心数的 2-3 倍。
- 【关键点 1】分区是 RDD 数据划分的最小逻辑单元,决定任务并行度。
- 【关键点 2】repartition 可增加或减少分区数,但会触发 shuffle。
- 【关键点 3】coalesce 通常用于减少分区数,且默认不触发 shuffle,性能更优。
- 【关键点 4】分区数量应结合数据规模与集群资源合理设置,避免过小或过大。
- 【易错点 1】误以为 coalesce 可以随意增加分区数,实际上 coalesce 默认只能减少分区,若需增加应使用 repartition。
- 【易错点 2】忽视 shuffle 的开销,在需要减少分区时仍使用 repartition,导致不必要的数据重分布。
- 【易错点 3】未考虑数据倾斜,仅调整分区数可能无法解决热点问题,还需结合 key 散列或加盐等策略。