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 就是每个分区的数据

相关文章
|
XML 存储 JSON
Python学习 -- 常用数据交换格式(CSV、XML、JSON)
Python学习 -- 常用数据交换格式(CSV、XML、JSON)
210 0
【Echarts】封装几个酷炫(发光)图表
【Echarts】封装几个酷炫(发光)图表
【Echarts】封装几个酷炫(发光)图表
|
10月前
|
机器学习/深度学习 人工智能 监控
API超越应用的时代,深入了解F5 API安全解决方案
API超越应用的时代,深入了解F5 API安全解决方案
125 3
|
SQL 分布式计算 监控
在hue上部署spark作业
7月更文挑战第11天
331 3
|
11月前
|
搜索推荐 开发者 UED
技术与艺术的碰撞:探索软件开发中的美学##
【10月更文挑战第29天】 在本文中,我们将探讨软件开发不仅是一种技术实践,更是一门艺术。通过分析软件设计、用户体验和代码质量的重要性,本文旨在揭示如何在编程过程中融入美学元素,从而提升软件的整体质量和用户满意度。 ##
148 4
|
机器学习/深度学习 PyTorch 算法框架/工具
彻底告别微调噩梦:手把手教你击退灾难性遗忘,让模型记忆永不褪色的秘密武器!
【10月更文挑战第5天】深度学习中,模型微调虽能提升性能,但也常导致灾难性遗忘,即学习新任务时遗忘旧知识。本文介绍几种有效解决方案,重点讲解弹性权重巩固(EWC)方法,通过在损失函数中添加正则项来防止重要权重被更新,保护模型记忆。文中提供了基于PyTorch的代码示例,包括构建神经网络、计算Fisher信息矩阵和带EWC正则化的训练过程。此外,还介绍了其他缓解灾难性遗忘的方法,如LwF、在线记忆回放及多任务学习,以适应不同应用场景。
1345 8
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
存储 监控 数据可视化
ELK与Fluentd的结合
【6月更文挑战第18天】构建Python分布式日志系统,结合ELK(Elasticsearch、Logstash、Kibana)与Fluentd,用于日志收集、存储和分析。Fluentd作为数据收集器,接收Python应用日志,通过Logstash转发至Elasticsearch索引,Kibana提供可视化界面。流程包括安装配置ELK,配置Fluentd输入输出插件,Python中使用`fluent-logger`发送日志,Kibana查看分析数据。系统可扩展、优化,涉及数据格式化、性能调优、安全性和监控。
ELK与Fluentd的结合
|
Prometheus 运维 监控
基于 Prometheus + Grafana 实现 Nexus 监控观测
前言 Nexus 是开源的 Maven 私服仓库,同时 Nexus 还支持 Npm 、 .Net、Golang 、Python 等开发语言的包管理。Nexus 也是我们重度使用的一个应用,Nexus 保存着 Tap 各开发组的代码构建产物。Nexus 出现问题会导致项目 CI 、CD 流程阻断。本文旨在通过 Prometheus + Grafana 实现 Nexus 运行时监控观测,帮助运维人员更加了解 Nexus ,轻松从容应对线上各种疑难杂症。
|
Python
【已解决】ModuleNotFoundError: No module named ‘DBUtils‘,from DBUtils.PooledDB import PooledDB,
【已解决】ModuleNotFoundError: No module named ‘DBUtils‘,from DBUtils.PooledDB import PooledDB,
1129 0