RDD 的分区和 Shuflee_通过算子重分区 | 学习笔记

简介: 快速学习 RDD 的分区和 Shuflee_通过算子重分区

开发者学堂课程【大数据Spark2020最新课程(知识精讲与实战演练)第二阶段RDD 的分区和 Shuflee_通过算子重分区学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/689/detail/11993


RDD 的分区和 Shuflee_通过算子重分区


内容介绍

一、通过 coalesce 算子指定

二、通过 repartitions 算子指定

 

重分区涉及到的算子一个叫 coalesce 还有一个叫 repatitions ,两个算子都可以重新指定分区数,但这两个算子还是有一些区别的。


一、通过 coalesce 算子指定

coalesce(numPartitions:Int, shuffle : Boolean = false)(implicitord:0rdering[T]=nul):RDD[T]

numPartitions

新生成的 RDD 的分区数

shuffle

是否 Shuffle

scala > val source = sc . parallelize (1 to 100,6)

source : org . apache . spark . rdd . RDD [ Int ]=ParallelCollectionRDD[0]atparallelizeat

< console >:24

scala > source . partitions . size

resθ:Int=6

scala > val noShuffleRdd = source . coalesce ( numPartitions =8, shuffle = false )

noShuffleRdd : org . apache . spark . rdd . RDD [ Int ]= CoalescedRDD [1] at coalesce at <console >:26

scala > noShuffleRdd . toDebugString

res l : String =

(6) CoalescedRDD [1] at coalesce at < console >:26[]

ParallelCollectionRDD [0] at parallelize at < console >:24[]

scala > val noShuffleRdd = source . coalesce ( numPartitions =8, shuffle = false )

noShuffleRdd : org . apache . spark .rdd . RDD[ Int ]=CoalescedRDD [1] at coalesce at < Console >:26

scalashuffleRdd.toDebugString

res3:String=

(8)MapPartitionsRDD [5] at coalesce at < Console >:26[]

coalescedRDD [4] at coalesce at < console >:26[]

Coalesce 算子接受两个参数,一个是 numPartitions ,另一个是 shuffle,默认情况下 shuffle 的值为 false 。默认情况下 coalesce 不进行 shuffle ,通过 coalesce 指定分区是可以不 shuffle 的,但是如果默认情况下 shuffle false ,那么 coalesce 只能减少分区。

举例

原本的 rdd 分区是6,那么新生成的 rdd 分区只能比6小,不能比6大,如果比6大,就必须要 shuffle。随意创建一个 rdd3scalaval rdd3=sc.parallelize(Seq(1,2,3,4,5,6),6),通过 seq 去创建1,2,3,4,5,6,指定分区数为3,新生成 rdd 原本分区数为3,通过 coalesce 算子,可以重新指定分区数,降低分区数值为1,第二个值为 false,即默认情况下不 shuffle ,即生成一个新的 rdd4rdd4生成一个新的 Partitions,这个时候就变成了1

Rdd5通过 rdd3来创建,这个时候 rdd3分区数为3,使用 coalesce 指定为4或者5,这个时候分区数和原来比是没有变化的,依然是3rdd6通过 rdd3.coalesce(5),rdd3的分区数是3想指定为5,需穿插一个 true,得到 rdd6,rdd6 Partitions.size 变成了5Coalesce 有两个参数,一个是重新指定的分区数,需要注意这个分区数是改变 rdd3的分区数还是新生成的 rdd 的分区数(改变新生成的 rdd 分区数)。如果希望通过 coalesce 减少 rdd 的分区数,制定一个参数就可以,如果希望增加分区数,第二个参数必须指定为 true ,第二个参数含义为 shuflle ,必须是 shuffle 操作才能把少的分区数变为多的分区数。

image.png

image.png


二、repartitions 算子指定

创建 rdd7rdd3的分区数依旧是3,生成新的 rdd 才会生成新的分区数。还有一个算子叫做 repartitions,发现分区数减少了,即新生成的 rdd7分区数等于1。再创建一个新的 rdd8,指定为5。这个时候 rdd8指定分区数为5,新生成rdd8的分区数等于5 repatitions 不仅能减少分区数,还可以增加分区数,并且 repatitions 这个只有一个参数。

image.png

repatitions 只有一个参数,但是 coalesce 有两个参数,进入 IDEA 当中写一下 repatition 看一下 repatition ,发现 repatition 的底层还是 coalesce ,并且 shuffle 永远指定为 true

相关文章
|
安全 索引 算法
分布式唯一ID系列(2)——UUID适合做分布式ID吗
UUID的生成策略: UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
5979 0
|
存储 Java 测试技术
ClickHouse Keeper: 一个用 C++ 编写的 ZooKeeper 替代品
ClickHouse Keeper: 一个用 C++ 编写的 ZooKeeper 替代品介绍
71338 34
ClickHouse Keeper: 一个用 C++ 编写的 ZooKeeper 替代品
|
人工智能 算法
算法金 | 平均数、众数、中位数、极差、方差,标准差、频数、频率 一“统”江湖
**统计学江湖概要** - **平均数(均值)**:数字的总和除以数量,代表集中趋势,如分赃时平均分配。 - **众数**:出现次数最多的数字,反映了最常见的值,如同一招式被频繁使用。 - **中位数**:排序后位于中间的值,反映数据的中心位置,如同武者武功的中等水平。 - **极差**:最大值减最小值,表示数据波动范围,类似武功最高与最低的差距。 - **方差**:衡量数据波动性,计算每个数值与均值差的平方和的平均数。 - **标准差**:方差的平方根,同单位的波动度量。 - **频数**:某个值出现的次数,如统计武器使用情况。 - **频率**:频数与总次数的比例,显示出现的相对频率。
588 2
算法金 | 平均数、众数、中位数、极差、方差,标准差、频数、频率 一“统”江湖
|
Linux API Android开发
Sync File API 指南【ChatGPT】
Sync File API 指南【ChatGPT】
|
存储 算法 安全
【C/C++ 数据结构 】从零开始实现哈希表:C++实践指南
【C/C++ 数据结构 】从零开始实现哈希表:C++实践指南
1661 0
|
存储 XML 缓存
「领域驱动设计」领域驱动的设计和开发最佳实践
「领域驱动设计」领域驱动的设计和开发最佳实践
|
API 数据库 网络架构
Django前后端分离实践之DRF--05
一、基于类的视图(CBV) 1. 导入模块 from rest_framework.views import APIView 2. GET from .
1569 0
|
Shell Linux C++
U-Boot编译过程完全分析
2.1       U-Boot Makefile分析 2.1.1             U-Boot编译命令        对于mini2440开发板,编译U-Boot需要执行如下的命令: $  make  mini2440_config $  make  all        使用上面的命令编译U-Boot,编译生成的所有文件都保存在源代码目录中。
1225 0
《C++ Primer》学习笔记:向vector对象添加元素蕴含的编程假定
练习《C++ Primer》中的3.14节时,当敲入: #include #include using namespace std; int main(){ string word; vector text; while (cin >> word) text.
818 0