开发者学堂课程【大数据Spark2020最新课程(知识精讲与实战演练)第二阶段:RDD 的分区和 Shuflee_通过其他算子指定分区数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11994
RDD 的分区和 Shuflee_通过其他算子指定分区数
内容介绍
一、很多算子都可以指定分区数
二、Partitioner 分区函数
Rdd 五大属性中就有一个是分区函数,指的就是 patitioner , patitioner 的作用是指定一个 ky 有型数据的分区,在 shuffle 的时候非常有用,patitioner 只有在 ky 有型数据的 rdd 中才有。
一、很多算子都可以指定分区数
在代码当中有一个 reduceByKey 这样的函数,点进去往上滚动,
发现其实是有一个重载的方法,这个方法允许传入一个 numPartitions ,它的意义是指定为指定新生成 rdd 的分区数。
所看到的基本上涉及分组聚合这些算子,shuffle 的算子大部分都允许重新指定分区数。第二点,一般一个算子可以通过重载在第二个或后一个参数的位置允许传入分区数,从而使新生成的 rdd 改变分区数。如果没有改变分区数就会记成自老 rdd 的分区数。
一般情况下设计 shuffle 操作的算子都允许重新指定分区数;指定分区数的方式在最后一个参数的位置传入新的分区数;如果没有重新指定分区数,默认从父 RDD 中继承分区数。
二、Partitioner 分区函数
进入代码当中搜索 reduceByKey ,这个 reduceByKey 函数当中有一个重载,允许指定分区数。
这个 partitioner 函数有两个分区,如果要 shuffle 三个分区里,这两个分区里就有很多数据,假设有三条数据,确定每条数据分发到哪里是由 partitioner 函数确定的,在 mypriduce 函数中也有这样的分区函数。
在 spark 中分区函数特殊一些,因为只有 ky 型数据才有 shuffle 操作,所以 partitioner 也只作用于 ky 型的 RDD 上。在 spark 中函数默认的分区函数是 HashPartitioner,HashPartitioner 要先求得 k 的 hashcode ,按照 hashcode 到对应的 reducer 数量取一个模,模到谁就是谁。
首先 key.toHashCode 本质上是一个数字, key.toHashCode 模上一个 reucer count 这个模的结果,取值范围是在 0-reducer count 之间,大于 reducer count ,这个时候就可以把对应的 key 的数据加到对应的 reducer 当中。
点进 HashPartitioner 可以看到这个HashPartitioner。 其实是继承了 Partitioner 一个,再点进 Partitioner 的一个特质,这个抽象类当中有两个方法是需要复习的,第一个叫 numPartitions 即指定有多少分区;还有一个叫做getPartition 有了 key 才能分区。
本节讲解两个内容,第一个内容告诉大家有很多算子都有指定分区数的功能;第二个是通过 partitioner 去设置分区函数,这个分区函数跟 myreduce 中的分区函数作用是一模一样的。