Spark 内部结构 - 重新分区是否将所有分区加载到内存中?
Spark internals - Does repartition loads all partitions in memory?
我在任何地方都找不到如何在内部对 RDD 执行重新分区?我知道您可以在 RDD 上调用 repartition 方法来增加分区数,但它是如何在内部执行的?
假设,最初有 5 个分区,它们有 -
- 第一个分区 - 100 个元素
- 第二个分区 - 200 个元素
- 第 3 个分区 - 500 个元素
- 第 4 个分区 - 5000 个元素
- 第 5 个分区 - 200 个元素
一些分区是倾斜的,因为它们是从 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
选项可用于告诉 spark
到 spill
您在 disk
中的数据。
Jacek Laskowski 还解释了重新分区。
Understanding your Apache Spark Application Through Visualization 应该足够你自己测试和了解了。
我在任何地方都找不到如何在内部对 RDD 执行重新分区?我知道您可以在 RDD 上调用 repartition 方法来增加分区数,但它是如何在内部执行的?
假设,最初有 5 个分区,它们有 -
- 第一个分区 - 100 个元素
- 第二个分区 - 200 个元素
- 第 3 个分区 - 500 个元素
- 第 4 个分区 - 5000 个元素
- 第 5 个分区 - 200 个元素
一些分区是倾斜的,因为它们是从 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
选项可用于告诉 spark
到 spill
您在 disk
中的数据。
Jacek Laskowski 还解释了重新分区。
Understanding your Apache Spark Application Through Visualization 应该足够你自己测试和了解了。