【摘要】:分区器,在前面章节中或多或少有被提及。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
}
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。