Spark repartition和coalesce的区别

前言

有些时候,在很多partition的时候,我们想减少点partition的数量,不然写到HDFS上的文件数量也会很多很多。
我们使用reparation呢,还是coalesce。所以我们得了解这两个算子的内在区别。

正题

要知道,repartition是一个消耗比较昂贵的操作算子,Spark出了一个优化版的repartition叫做coalesce,它可以尽量避免数据迁移,
但是你只能减少RDD的partition.

举个例子,有如下数据节点分布:

Node 1 = 1,2,3
Node 2 = 4,5,6
Node 3 = 7,8,9
Node 4 = 10,11,12

用coalesce,将partition减少到2个:

Node 1 = 1,2,3 + (10,11,12)
Node 3 = 7,8,9 + (4,5,6)

注意,Node1 和 Node3 不需要移动原始的数据

The repartition algorithm does a full shuffle and creates new partitions with data that’s distributed evenly.
Let’s create a DataFrame with the numbers from 1 to 12.

repartition 算法会做一个full shuffle然后均匀分布地创建新的partition。我们创建一个1-12数字的DataFrame测试一下。
刚开始数据是这样分布的:

Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12

我们做一个full shuffle,将其repartition为2个。

这是在我机器上数据分布的情况:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11

The repartition method makes new partitions and evenly distributes the data in the new partitions (the data distribution is more even for larger data sets).
repartition方法让新的partition均匀地分布了数据(数据量大的情况下其实会更均匀)

coalesce 和 repartition 的区别

coalesce用已有的partition去尽量减少数据shuffle。
repartition创建新的partition并且使用 full shuffle。
coalesce会使得每个partition不同数量的数据分布(有些时候各个partition会有不同的size)
然而,repartition使得每个partition的数据大小都粗略地相等。

coalesce 会比 repartition 快速吗?

coalesce可能会比repartition更快,但是,在partition大小不相等的时候, 总体上会比repartition慢一些。
通常,在过滤掉大数据集后,你需要用repartition一下。
我发现repartition总体上会快一些,因为Spark一般都是用相同大小的partition。

Referrence

https://stackoverflow.com/questions/31610971/spark-repartition-vs-coalesce