分区介绍

RDD 如何分区?

默认情况下,为每个 HDFS 分区创建一个分区,默认情况下为 64MB。在这里阅读更多。

如何跨分区平衡我的数据?

首先,看看可以重新分配数据的三种方式 :

  1. 将第二个参数 RDD 的所需最小分区数) 传递给 textFile() ,但要小心:

    在[14]中:lines = sc.textFile(data

    在[15]中:lines.getNumPartitions()Out [15]:1000

    在[16]中:lines = sc.textFile(data,500)

    在[17]中:lines.getNumPartitions()Out [17]:1434

    在[18]中:lines = sc.textFile(data,5000)

    在[19]中:lines.getNumPartitions()Out [19]:5926

正如你所看到的,[16] 没有达到预期的效果,因为 RDD 具有的分区数量已经大于我们请求的最小分区数量。

  1. 使用 repartition() ,如下所示:

    在[22]中:lines = lines.repartition(10)

    在[23]中:lines.getNumPartitions()Out [23]:10

警告:这将调用随机播放,并且当你想要增加 RDD 具有的分区数时应该使用它。

来自文档

随机播放是 Spark 的重新分配数据的机制,因此它可以跨分区进行不同的分组。这通常涉及跨执行程序和机器复制数据,使得混洗成为复杂且昂贵的操作。

  1. 使用 coalesce() ,如下所示:

    在[25]中:lines = lines.coalesce(2)

    在[26]中:lines.getNumPartitions()Out [26]:2

在这里,Spark 知道你会缩小 RDD 并获得它的优势。阅读有关 repartition()vs coalesce()更多信息。

但这一切能否保证你的数据在你的分区中完美平衡?不是真的,因为我在如何跨分区平衡数据方面经验丰富