Spart 原理_逻辑图_MapPartitionsRDD | 学习笔记

简介: 快速学习 Spart 原理_逻辑图_MapPartitionsRDD

开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段Spart 原理_逻辑图_MapPartitionsRDD】学习笔记,与课程紧密联系,让用户快速学习知识。

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


Spart 原理_逻辑图_MapPartitionsRDD


内容简介

一、了解 RDD 的生成

二、Map 算子的背后

三、Map 算子与 FlatMap 算子的区别

 

一、Rdd 的生成

RDD 如何生成的这一小节中,整个按照小案例大致的顺序

首先通过 textfile 读取 HIDFS 上的文件,以及 hadoopRDD 是如何生成的;这节学习通过 map flatmap 去进行数据的转换,

我们已经了解到了 hadoopfilehadooprdd 是如何生成,接下来要学习 map flatmap 这两个算子可以生成怎样的RDD,在笔记中介绍了如何看源码,源码的真正作用是什么,这一小节中了解 map flatmap

 

二、Map 算子的背后

进入 idea中,可以直接找到 map 算子,和 flatmap 算子

1.以下介绍了源码及源码的作用,如图:

image.png

2.Map 算子生成了 mappartitionsRDD

由源码可知,当 val rdd2 = rdd1.map()的时候,其实生成的新的 RDD rdd2rdd2 的类型是mappartitionsRDD,每个 RDD 中的五大属性都会有一些不同,由 map 算子生成的 RDD 中的计算函数,本质上就是遍历对应分区的数据,将每个数据转成另外的形式。

3.MappartitionsRDD 的计算函数是 collection.map(function)

真正运行的集群中的处理单元是 task,每个 task 对应一个 RDD 的分区,所以 collection 对应一个 RDD 的分区的所有数据,而这个计算的含义就是将一个 RDD 的分区上所有数据当作一个集合,通过这个 scala 集合的 map 算子,来执行一个转换操作,而其转移操作的函数就是传入 map 算子的 function

4.传入map 算子的函数会被清理

image.png

这个清理主要是处理闭包中的依赖,使得这个闭包可以被序列化发往不同的集群节点运行。

5.进入 ider 中,可以直接找到 map 算子,和 flatmap 算子。


三、Map 算子与 FlatMap 算子的区别

1.Map 算子和 flatmap 算子生成的东西是一样的,map 相对而言会更简单一些,点进 map 算子

可以看到:

def map[U: ClassTag](f: T => U): RDD[ U ] = withScope { //括号内在外面传进的函数,调用 map 算子

Val cleanF = sc.clean(f) // 经过转换,变成 cleanF,直接传给下方

New MapPartitionsRDD[U,T](prev = this,(context ,pid ,iter) => iter.map(cleanF)) //集合.map

//可以观察到这里的 map 算子,生成了 MappartitionsRDDmappartitionsRDD 传入了函数 (context ,pid ,iter) =>

iter.map(cleanF)) #mappartitionsRDD compute

通过翻看 mappartitionsRDD 的源码,可以发现源码的 compute 函数就是调用了 (context ,pid ,iter) => iter.map(cleanF)) 函数

Iter 就可以理解为 scala 当中的集合

结论

spark map 算子中接收的函数,其实最终交给了 iter.map 这个算子

//第一行外面的 map 算子就相当于 最后一行内部的 map 算子,外面的 (f: T => U)函数经过 val claenF = 生成。Cleanf)转换,变成 cleanF,直接传给了内部 claenF

理解 map 算子的关键,就是理解 iter 是什么,iter 代表一个分区的迭代器,RDD 有多个分区,compute 中通常只含有一个分区,这里 iter 就代表了一个分区的迭代器

定论:map 算子就是生成了mappartitionsRDD

mappartitionsRDD 中的 compute 函数,其实就是计算每一个分区的数据

怎么计算呢?通过 scala map 算子直接操作每个分区的数据集合

Map 算子来说,生成了 mappartitionsRDD

MappartitionsRDD 的 compute 函数,处理整个 RDD 中每一个分区的每一条数据,通过传入 map function 来进行处理,这就是整个过程,以及 map 算子的原理

2.如图是 map 算子与 flatmap 算子,对于二者的区别是 map 算子调用的是 iter 分区中的 map,而 flatmap 调用的则是 flatmap,如图示框:

image.png

Map 算子和 flatmap 算子的区别:从本质上来讲,就是作用于分区数据集合的算子不同 //map 算子中调用的是 mapflatmap 算子中调用的是每一个分区的 ider 迭代器的 flatmap

本节主要了解了 map 算子和 flatmap 算子 生成了什么样的 RDD ,以及生成的 RDD 中的 compute 函数的作用,重点要了解 (context ,pid ,iter) => iter.map(cleanF) 就是

mappartitionsRDD compute 函数,所接收到的 iter 就是每个分区的数据

相关文章
|
3月前
|
Kubernetes 监控 Perl
在K8S中,hpa原理是什么?
在K8S中,hpa原理是什么?
|
3月前
|
Kubernetes 监控 API
在K8S中,HPA原理是什么?
在K8S中,HPA原理是什么?
|
6月前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
前端开发
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之8
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之8
44 0
|
前端开发
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之9
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之9
42 0
|
前端开发
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之10
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之10
54 0
|
前端开发
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之11
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之11
41 0
|
前端开发
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之12
前端学习笔记202305学习笔记第二十七天-什么是对象结构 set map之12
37 0
|
前端开发
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之14
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之14
44 0
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
774 0