首页 理论教育 如何选择合适的分区器来提高并行计算性能?

如何选择合适的分区器来提高并行计算性能?

时间:2023-06-21 理论教育 版权反馈
【摘要】:分区器,在前面章节中或多或少有被提及。RDD中,分区器主要有如下的两个作用。2)决定Shuffle过程中reducer的个数以及map端的一条数据记录应该分配给哪一个reducer。3)决定依赖类型,若父RDD和子RDD都有分区器且分区器相同,则两个RDD相互之间是窄依赖,否则是Shuffle依赖.由于分区器能够间接决定RDD中分区的数量和分区内部数据记录的个数,因此选择合适的分区器能够有效提高并行计算的性能。

如何选择合适的分区器来提高并行计算性能?

分区器,在前面章节中或多或少有被提及。RDD中,分区器主要有如下的两个作用。

1)决定RDD的分区数量。例如执行操作groupByKey(new HashPartitioner(2))所生成的ShuffledRDD中,分区的数目等于2。

2)决定Shuffle过程中reducer的个数(实际上是子RDD的分区个数)以及map端的一条数据记录应该分配给哪一个reducer。

3)决定依赖类型,若父RDD和子RDD都有分区器且分区器相同,则两个RDD相互之间是窄依赖,否则是Shuffle依赖.

由于分区器能够间接决定RDD中分区的数量和分区内部数据记录的个数,因此选择合适的分区器能够有效提高并行计算的性能。Spark内置了两类分区器,分别是哈希分区器(Hash Partitioner)和范围分区器(Range Partitioner),此外,开发者还可以根据实际需求编写自己的分区器。分区器对应的源码实现是Partitioner抽象类,Partitioner的子类(包括自定义分区器)需要实现自己的getPartition函数,用于确定对于某一特定键值的键值对记录,会被分配到子RDD中的哪一个分区。实现代码如下。(www.xing528.com)

abstract class Partitioner extends Serializable{

def numPartitions:Int

def getPartition(key:Any):Int

}

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈