开发者学堂课程【大数据 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 去进行数据的转换,
我们已经了解到了 hadoopfile、hadooprdd 是如何生成,接下来要学习 map 和 flatmap 这两个算子可以生成怎样的RDD,在笔记中介绍了如何看源码,源码的真正作用是什么,这一小节中了解 map 和 flatmap
二、Map 算子的背后
进入 idea中,可以直接找到 map 算子,和 flatmap 算子
1.以下介绍了源码及源码的作用,如图:
2.Map 算子生成了 mappartitionsRDD
由源码可知,当 val rdd2 = rdd1.map()的时候,其实生成的新的 RDD 是 rdd2,rdd2 的类型是mappartitionsRDD,每个 RDD 中的五大属性都会有一些不同,由 map 算子生成的 RDD 中的计算函数,本质上就是遍历对应分区的数据,将每个数据转成另外的形式。
3.MappartitionsRDD 的计算函数是 collection.map(function)
真正运行的集群中的处理单元是 task,每个 task 对应一个 RDD 的分区,所以 collection 对应一个 RDD 的分区的所有数据,而这个计算的含义就是将一个 RDD 的分区上所有数据当作一个集合,通过这个 scala 集合的 map 算子,来执行一个转换操作,而其转移操作的函数就是传入 map 算子的 function。
4.传入map 算子的函数会被清理
这个清理主要是处理闭包中的依赖,使得这个闭包可以被序列化发往不同的集群节点运行。
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 算子,生成了 MappartitionsRDD,mappartitionsRDD 传入了函数 (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 = 生成。Clean(f)转换,变成 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,如图示框:
Map 算子和 flatmap 算子的区别:从本质上来讲,就是作用于分区数据集合的算子不同 //map 算子中调用的是 map,flatmap 算子中调用的是每一个分区的 ider 迭代器的 flatmap
本节主要了解了 map 算子和 flatmap 算子 生成了什么样的 RDD ,以及生成的 RDD 中的 compute 函数的作用,重点要了解 (context ,pid ,iter) => iter.map(cleanF) 就是
mappartitionsRDD 的 compute 函数,所接收到的 iter 就是每个分区的数据