我无法在任何地方找到如何在内部对RDD执行重新分区?我知道你可以在RDD上调用repartition方法来增加分区数量但是如何在内部执行它?
假设,最初有5个分区,他们有 -
某些分区是偏斜的,因为它们是从HBase加载的,并且HBase中的数据未正确加密,这导致某些区域服务器的条目过多。
在这种情况下,当我们重新分区为10时,它会先加载所有分区然后再进行洗牌以创建10分区吗?如果完整数据无法加载到内存中,即所有分区无法立即加载到内存中,该怎么办?如果Spark没有将所有分区加载到内存中,那么它如何知道计数以及如何确保将数据正确分区为10个分区。
答案 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应该足以让您自己测试和了解。