Spark 内部结构 - 重新分区是否将所有分区加载到内存中?

Spark internals - Does repartition loads all partitions in memory?

我在任何地方都找不到如何在内部对 RDD 执行重新分区?我知道您可以在 RDD 上调用 repartition 方法来增加分区数,但它是如何在内部执行的?

假设,最初有 5 个分区,它们有 -

一些分区是倾斜的,因为它们是从 HBase 加载的,并且数据在 HBase 中没有正确加盐,这导致一些区域服务器有太多条目。

在这种情况下,当我们重新分区到10时,它会先加载所有分区,然后再进行shuffle创建10个分区吗?如果无法将完整数据加载到内存中,即无法将所有分区一次加载到内存中怎么办?如果 Spark 没有将所有分区加载到内存中,那么它如何知道计数以及如何确保数据被正确地划分为 10 个分区。

据我了解,repartition肯定会触发shuffle。从 Job Logical Plan 文件下面可以说 repartition

   - for each partition, every record is assigned a key which is an increasing number.
   - hash(key) leads to a uniform records distribution on all different partitions.

如果Spark无法将所有数据加载到memory中,那么memory issue将被抛出。所以 Spark 的默认处理全部在 memory 中完成,即 应该始终为您的数据提供足够的内存
如果没有足够的内存,Persist 选项可用于告诉 sparkspill 您在 disk 中的数据。
Jacek Laskowski 还解释了重新分区。
Understanding your Apache Spark Application Through Visualization 应该足够你自己测试和了解了。