分区介绍
RDD 如何分区?
默认情况下,为每个 HDFS 分区创建一个分区,默认情况下为 64MB。在这里阅读更多。
如何跨分区平衡我的数据?
首先,看看可以重新分配数据的三种方式 :
-
将第二个参数 ( 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 具有的分区数量已经大于我们请求的最小分区数量。
-
使用
repartition()
,如下所示:在[22]中:lines =
lines.repartition(10)
在[23]中:
lines.getNumPartitions()
Out [23]:10
警告:这将调用随机播放,并且当你想要增加 RDD 具有的分区数时应该使用它。
来自文档 :
随机播放是 Spark 的重新分配数据的机制,因此它可以跨分区进行不同的分组。这通常涉及跨执行程序和机器复制数据,使得混洗成为复杂且昂贵的操作。
-
使用
coalesce()
,如下所示:在[25]中:lines =
lines.coalesce(2)
在[26]中:
lines.getNumPartitions()
Out [26]:2
在这里,Spark 知道你会缩小 RDD 并获得它的优势。阅读有关 repartition()
vs coalesce()
的更多信息。