2024.1.4 Spark Core ,RDD ,算子

目录

[一 . RDD(弹性分布式数据集)](#一 . RDD(弹性分布式数据集))

[二 . RDD的五个特性](#二 . RDD的五个特性)

[三 .RDD的五大特点](#三 .RDD的五大特点)

[四 . 算子](#四 . 算子)

[五 . 分区算子 ,重分区算子 , 聚合算子 ,关联算子](#五 . 分区算子 ,重分区算子 , 聚合算子 ,关联算子)

分区算子:

重分区算子

聚合算子

关联算子:


一 . RDD(弹性分布式数据集)

Resilent弹性 Distrbuted分布式 Dataset数据集

  1. rdd是Spark底层的数据结构

  2. Task 在Spark中就是线程

3 . RDD中的一个分区就是一个线程,分区数有多少线程数就有多少 ,set Master local里设置的就是线程

  1. 使用 sc.parallelize(result)构建rdd,他的分区数量是受setMaster的local数影响的,你设置多少个就是多少分区 ; 如果这里写local[*],就会默认分区数是cpu核数 ; 如果在参数里有设置numslices, name就以参数的这个数量为分区数

  2. 使用 sc.textfile构建RDD , 把setMaster 的local[]的值设置大于2的时候,不生效,分区的数量还是2 , 但是调小会生效 ;

在minPartitions里没有设置参数,那么一般就根据公式min(spark.default.parallelism,2)

在参数里设置 minPartitions, 这个参数设置的是最小分区的,所以得出来分区数是大于等于minPartitions设置的数的, 个别情况底层也会有优化,钥匙设置100,可能会出来36, 总之到底是多少没法保证 ;

  1. 使用wholeTextFile 构建RDD, setMaster 的local 数量 ,minPartitions , 文件的具体数量 ,都会影响分区的数量, 当设置了minPartitions的时候,最大的分区数量为 文件的最大数量

查看分区数的命令

data = [1,2,3,4,5,6]

init_rdd = sc.parallelize(data)

print(init_rdd.getNumPartitions())

查看分区数

init_rdd = sc.textFile( 'file:///export/data/2024.1.2_Spark/1.2_day01/content.txt' , minPartitions=10 )

7 .RDD 的分区数据量受到多个因素,例如:机器Cpu的核数 , 调用的算子 , 算子中参数的设置, 集群的类型等 . 实际中一般设置分区数量为cpu核数的两到三倍, 其目的是为了防止类似数据倾斜等现象,一个服务器忙死一个闲死 ;

二 . RDD的五个特性

1、(必须的)RDD是有一系列分区组成的

2、(必须的)对RDD做计算,相当于对RDD的每个split或分区做计算

3、(必须的)RDD之间存在着依赖关系,宽依赖和窄依赖

4、(可选的)对于KV类型的RDD,我们可以进行自定义分区方案

5、(可选的)移动数据不如移动计算,让计算程序离数据越近越好

三 .RDD的五大特点

1、分区:RDD逻辑上是分区的,仅仅是定义分区的规则,并不是直接对数据进行分区操作,因为RDD本身不存储数据。

2、只读:RDD是不可变类型,RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。

3、依赖:RDD之间存在着依赖关系,宽依赖和窄依赖

4、缓存:如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据

5、checkpoint:与缓存类似的,都是可以将中间某一个RDD的结果保存起来,只不过checkpoint支持持久化保存,检查点成为了Spark的容错性,持久化

四 . 算子

RDD对象中提供了非常多的具有特殊功能的函数,我们将这些函数称为算子(函数/方法/API)

Spark算⼦有两类,分别是transformation算⼦和action算⼦。

● Transformation算⼦有:map,mapPartitions,groupBy,filter,distinct,repartition,union,

reduceByKey,groupByKey,Join,aggregateByKey等。

● Action算⼦有:reduce,collect,count,save,countByKey,aggregate,take。

在代码执行时,transfor的算子直接打印不会有结果,需要加.collect ; action算子就可以直接打印

flatmap和map的区别 : flatmap把split切分后的东西全部放在了一起 , map就只是一对一的

在打印输出的时候如果返回的是可迭代对象,就要在算子后面加 .mapValues(list).collect()

五 . 分区算子 ,重分区算子 , 聚合算子 ,关联算子

分区算子:

Map和mapPartitions的区别?
1) Map :每次处理⼀条数据
2) mapPartitions :每次处理⼀个分区数据

假如有10亿个数据要处理

foreach 一次处理10亿个

foreachPartition 10次处理,每次循环处理1亿个.

如果有反复消耗资源的操作,比如打开和关闭文件 ,数据库的关闭和连接 , 能够减少操作的次数

如果没有反复消耗资源的操作,那两种方法都一样

重分区算子

repartitions :重新修改RDD分区数, 可以增大和减少,只要有向无环图中间有两个stage,那stage之间就进行了shuffle过程,底层起始也是调用了coalesce, shuffle默认设了True ;

coalesce : 默认情况下减少RDD分区数 ,不会shuffle, shuffle过程会慢 ,在后面 传入参数shuffle = True ,就可以增加RDD分区数

rdd.coalesce(5,shuffle=True)

partition by 算子 : 该算子主要是用来改变key-value键值对数据类型RDD的分区数的。num表示要设置的分区数;fn参数是可选,用来让用户自定义分区规则。

聚合算子

reduce():根据传入的函数对数据进行聚合处理

fold:

aggregate:
reduceByKey:具有预聚合操作
groupByKey:没有预聚合
在不影响业务逻辑的前提下,优先采⽤reduceByKey。

关联算子:

  • join:实现两个RDD的join关联操作

  • leftOuterJoin:实现两个RDD的左关联操作

  • rightOuterJoin:实现两个RDD的右关联操作

  • fullOuterJoin:实现两个RDD的满外(全外)关联操作

相关推荐
霖霖总总几秒前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
ZC跨境爬虫35 分钟前
Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
分布式·爬虫·python·scrapy
智能化咨询41 分钟前
(163页PPT)某著名企业K3生产制造售前营销指导方案P164(附下载方式)
大数据·人工智能
sg_knight1 小时前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
石榴树下的七彩鱼1 小时前
图片修复 API 接入实战:网站如何自动去除图片水印(Python / PHP / C# 示例)
图像处理·后端·python·c#·php·api·图片去水印
Polar__Star1 小时前
C#怎么操作Chart图表控件 C#如何用WinForms Chart控件绑定数据绘制统计图表【控件】
jvm·数据库·python
2401_897190551 小时前
CSS如何制作数字滚动效果_利用transform位移数字
jvm·数据库·python
2301_813599552 小时前
HTML图片怎么用UnoCSS对齐_UnoCSS原子化CSS图片对齐实战
jvm·数据库·python
m0_377618232 小时前
c++怎么在不加载整个大文件的情况下获取其SHA256校验值【进阶】
jvm·数据库·python
LN花开富贵2 小时前
【ROS】鱼香ROS2学习笔记二
linux·笔记·python·学习·嵌入式