Spark内部 - 重新分区是否会加载内存中的所有分区?

时间:2017-05-13 23:49:57

标签: performance apache-spark shuffle

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

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

  • 第一个分区--100个元素
  • 第二个分区 - 200个元素
  • 第3个分区 - 500个元素
  • 第4个分区 - 5000个元素
  • 第5分区 - 200个元素

某些分区是偏斜的,因为它们是从HBase加载的,并且HBase中的数据未正确加密,这导致某些区域服务器的条目过多。

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

1 个答案:

答案 0 :(得分:2)

根据我的理解,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应该足以让您自己测试和了解。