决定Spark RDD分区算法因素的总结
来源:互联网 发布:关于程序员的日漫 编辑:程序博客网 时间:2024/06/05 05:03
RDD在调用引起Shuffle的方法的时候,如果没有显示指定ShuffledRDD的分区,那么会调用Partitioner.defaultPartitioner方法来确定ShuffledRDD的分区,比如RDD.combineByKey:
RDD.groupByKey:
RDD.join:
Partitioner.defaultPartitioner代码如下:
1. 如果依赖的RDD中存在RDD已经设置了RDD.partitioner,则从设置了分区的RDD中则挑选出分区数最大的RDD.partitioner
2. 如果依赖的所有RDD都没有设置RDD.partitioner,但是设置了Spark.default.parallelism,那么根据spark.default.parallelism设置创建HashPartitioner,作为ShuffledRDD的分区依据
3. 以上2点都不满足,则从依赖的RDD中,去除分区数最大的RDD的分区个数,创建HashPartitioner,作为ShuffledRDD的分区依据
一个Spark应用可能包含多个Stage,假设Stage1经过Shuffle后生成新的ShuffledRDD1,然后再开始Stage2,但是从Stage2到Stage3的时候,在确定ShuffledRDD2的时候,ShuffledRDD1.partitioner是不是还存在呢?RDD.map是RDD最常调用的方法,RDD.map会创建MapPartitionsRDD,下面看看MapPartitionsRDD的创建:
可见MapPartitionsRDD.partitioner为None,由此可见ShuffledRDD1执行完map方法转换之后,ShuffledRDD1的partitioner没有传递到MapPartitionsRDD
为什么呢?
因为进行map操作之后,RDD中的数据已经发生了变化,每个数据如果shuffle的话计算出来的Hash值已经发生了改变,而Hash值确定了RDD中一个元素所在的分区,RDD的每个元素在下一个Stage所在的分区很可能发生了变化,所以默认情况下MapPartitionsRDD.partitioner设置为None,这样即使shuffle前的Stage1和Shuffle后的Stage2的分区个数相同,也需要Shuffle来重新确定RDD中每个元素所在的分区。
假设Shuffle后的RDD依赖多个RDD,比如说CoGroupedRDD,会不会两个RDD都会发生Shuffle呢?下面以CoGroupedRDD为例看一看。CoGroupedRDD.getDependencies的定义如下:
可见如果CoGroupedRDD依赖的某个RDD和CoGroupedRDD分区相同,则这个被依赖的RDD就不会进行Shuffle。
- 决定Spark RDD分区算法因素的总结
- Spark RDD系列-------1. 决定Spark RDD分区算法因素的总结
- 举例说明Spark RDD的分区、依赖
- 举例说明Spark RDD的分区、依赖
- 举例说明Spark RDD的分区、依赖
- Spark-RDD 分区
- spark RDD 分区
- spark rdd 自动分区
- Spark RDD 内部结构(二) RDD分区
- Spark自定义RDD重分区
- Spark RDD 分区数详解
- 决定成败的因素
- 决定英语水平的因素
- spark RDD系列------2.HadoopRDD分区的创建以及计算
- 影响Spark输出RDD分区的操作函数
- 影响到Spark输出RDD分区的操作函数
- 影响到Spark输出RDD分区的操作函数
- 影响Spark输出RDD分区的操作函数
- 键盘快捷键
- caffe将网络模型由protot转换成变成网络结构模型图--caffe学习(5)
- 微信分享sdk,无法回调,望大神解惑
- 请教一个小问题。太头疼
- 我的网站中毒了,asp的网站,状况超奇怪!气死我了。
- 决定Spark RDD分区算法因素的总结
- 删除记录后,返回前一页时参数传递问题!
- 为什么我的IP访问不了网站上其中一个页面?
- Java 日历程序
- http,TCP,UDP,SOCKET,三次握手,get/post区别
- 开机进程
- 请教关于 View.OnClickListener() 的问题
- Spring 事务处理(应用篇)
- Numpy