spark学习3:RDD运行原理

2023-11-05

 

1.RDD设计背景

为了解决 MapReduce的 频繁磁盘IO开销,序列化和反序列化的开销,

因为从磁盘读取数据转换为对象 需要反序列化, 在对象落磁盘时候 需要序列化。

 

spark通过抽象的RDD对象和DAG图,对数据读取流转进行优化, 最优方案实现流水线开发。

2.RDD概念

1.RDD本质是一个 抽象的分布式集合

RDD逻辑上是一个数据集合,其数据是被分区后 分布式存储在各个机器上

2.高度受限的共享内存模型

即 每次生成的RDD是不能修改的,但是可以对老RDD进行转换 生成新RDD,来实现对RDD转换。

3.RDD操作类型主要分为两种: action  和 transformation

transformation: 只是记录转换的动作,并不会立马去执行, 具有懒惰性

action: 是行动动作,会立马触发 转换操作。

4.RDD的粗粒度性

RDD支持粗粒度修改,只能一次对RDD全集进行转换

RDD 只能对全局数据进行修改,不能像 关系型数据库一样,精确的对某个特定的值进行修改

5.高效的容错性

通过DAG 找到丢失的RDD的父类,来重新拉取/生成 已经丢失的RDD

6.流水线优化

把中间结果写入内存,减少磁盘io ,以及序列化和反序列化

 

 

3.DAG schedule 如何划分stage 阶段 (作业)的

DAG schedule 划分的主要依据是 各个RDD之间的依赖关系,  有两种依赖关系:宽依赖和窄依赖

如果是宽依赖 那就切分stage

如果是窄依赖 不切分

 

什么是宽依赖 和 窄依赖:

RDD之间是 宽依赖 或 窄依赖 主要看  两个RDD之间 有没有shuffle  即洗牌操作

如果从父RDD 到子RDD的时候 ,发生了 shuffle ,那么这两个 RDD就是 宽依赖, 那就会被DAG schedule 切分为两个 stage 阶段/作业

如果 父RDD 到子RDD的时候,没发生shuffle  ,那么是窄依赖, 不会切分 stage 

 

什么是 shuffle 操作:

shuffle 中文意思是 洗牌,

那么对数据进行 打散重新分配,这个过程其实就是shuffle

 

如下图,文件中的数据, 传给了 3台 map节点,那么这3台蓝色的 map节点 处理完数据后,  要把数据传给  黄色的3台 reduce 节点, 

关键点 就在这 3台蓝色的map节点是怎么 传给 黄色 3台reduce 节点的,   

其实是 把map节点 所有数据进行 盘点洗牌,找到 (a, 1) 元素发给  reduce1节点,找到 (b, 1) 元素发给  reduce2节点.....

这个就是洗牌,对数据进行重新清洗,找到 特定元素 发给特定 节点。

 

shuffle 是需要大量的 节点之间的 网络IO开销的,并且shuffle一定会落磁盘。

 

什么是窄依赖:

有2种情况:

1、一个父RDD 对应一个子RDD

2、两个或多个 父RDD 对应一个子RDD

 

什么是宽依赖

一个父RDD 对应多个 子RDD

因为如果 一个父RDD 对应多个 子RDD ,那么父RDD 会进行洗牌操作,找到特定的元素 发给特定的 某个子节点。

4.DAG schedule 为什么要划分stage 阶段 (作业)

DAG schedule  根据RDD之间的宽窄依赖关系,划分stage ,其实是为了提高数据处理的效率,为了实现流水线优化。

简单点说 spark只能对 窄依赖进行优化,  宽依赖没法优化,所以要把宽窄依赖分开。

 

先来看下spark的流水线优化 的基本原理

首先,在并行处理有2个基本的操作,fork 和 join ,  fork 是分发   ,join是汇集

spark的流水线优化 其实就是对 不必要的join的 优化,减少不必要join,因为 join就可能有时间的等待

 

比如说,要实现把 北京一个学校的学生 送到厦门,根据宽窄依赖不同 可以有2种方案

 

第一种,窄依赖情况,

如下图,  分别由班长带男生 和 组织委员带女生 ,分别乘坐飞机(并行处理),先飞往上海 集合后,再由班长带领男生 、组织委员带女生 ,从上海飞往厦门。

那么在这个过程中 由于要在上海集合, 所以班长带的男生 到达上海后 ,需要等待1小时的  女生,  

然后,两班人马 从上海出发 到厦门后,又要 集合,所以 女生要等 男生1小时,

所以,全程用了 6小时。

 

 

在上边的例子中,班长带男生到上海后,等女生 1小时,其实是可以优化掉的,   班长可以直接从北京到厦门,组织委员也是

 

这个就是 DAG的流水线优化最基本原理

 

第二种,宽依赖的情况:

班长在带领 男生到上海后,需要带领 1班的学生去厦门,  而组织委员在带领女生到上海后,需要带领 2班学生去厦门

 

那么在 上海这个环节 就需要把同学重新分配,组织委员带领的1班女生要到 班长那边去 ,班长带的2班男生要到 组织委员那边去,

就有重新洗牌的操作了,就有shuffle,

而且班长提前到达 上海后,必须等组织委员和女生都到达以后 才能出发, 这也就是 宽依赖不能优化的原因。

 

 

宽依赖一定会落磁盘

 

如下图,A -> B 就是一个宽依赖, 所以A这部分 ,就切分为 一个stage

然后 C -> D -> F都是窄依赖 , F -> G 是宽依赖 ,所以 C D F是一个stage

最后 G汇总又是一个stage

一共3个stage

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spark学习3:RDD运行原理 的相关文章

随机推荐

  • 正态分布图_正态QQ图(BIO100B)

    QQ图是一种散点图 对应于正态分布的QQ图 就是由标准正态分布的分位数为横坐标 样本值为纵坐标的散点图 其他版本 2 有将 x m std 作为纵坐标 那么正态分布得到的散点图是直线 y x 要利用QQ图鉴别样本数据是否近似于正态分布 只需
  • Mysql生成数据字典

    实现原理 在MySQL中 有个自带的数据库 名为information schema 其中保存着关于MySQL服务器所维护的所有其他数据库的信息 如数据库名 数据库的表 表栏的数据类型与访问权 限等 我们通过查询这个数据库的COLUMNS表
  • [MySQL]去掉字符串两边的双引号

    select TRIM BOTH FROM username from table
  • 导入导出操作vue

    导出的时候可以导出table某一行的详情数据 也可以导出整个表格 导入的时候相当于新增操作
  • FASTADMIN框架避坑指南

    框架都有一个通病 就是基础基础功能用起来都很快 但是稍微复杂一点的你就要开始翻文档了 可能文档还没有 社区也没有人回答 既然用了 就记录下遇到的问题 不定期更新 1 列表自定义按钮 先上一段代码 操作按钮 field operate tit
  • 西门子PLC S7-300系列的PID控制器参数整定的一般方法分享

    西门子PLC S7 300系列的模块配置灵活 扩展性强 通讯功能强大 为自动化控制系统提供了解决方案 西门子PLC S7 300的编程软件是STEP7 V5 5 在编程软件中 用户可以通过PID功能块实现PID控制 本文下面为您介绍一下西门
  • Qt的动态内存回收问题(1)

    Qt的动态内存回收机制容易让人觉得困惑 而能够参考的相关资料又很少 不少都是对此一笔带过 或者给出错误的说明 费了不少劲 了解到了一些皮毛 前言 程序开始时 最好先把指向动态内存的指针赋值为NULL 在delete这些变量的时候 也将指针赋
  • java servlet 获取请request的IP地址

    本文转载至 http blog csdn net g893465244 article details 40828513 基本逻辑 先取得配置的IP列表 然后通过request getRemoteAddr 取得客户端的IP地址 做鉴权和校
  • 鼎信通讯2023届提前批一面技术面

    问题 介绍自己 您好面试官 我叫张 哪里人 班级排名 四六级成绩 手上有没有offer 目前没有 有两家公司在谈 还没发书面Offer 如果你手里有Offer 可以坦诚说大体信息 比如 我目前手里有两个Offer 但是我更倾向加入咱们公司
  • 多文件下载含进度条可视频可图片

    html篇
  • 微信公众号开发笔记3(获取token、自定义菜单)

    微信公众号接口调试工具地址 选择基础支持 获取token 填好appid和secret点击检查问题 微信就会返回token 复制token 选择自定义菜单创建接口 token就填刚刚获取的token 具体可看官方文档 也有提供body请求示
  • JedisException: Could not return the resource to the pool

    1 报错信息 2020 07 25 16 20 11 085 analyser thread 3 ERROR com everdata etl main ETLMain analyser error redis clients jedis
  • python中round函数的一个小坑——奇进偶弃

    gt gt gt round 10 5 按照round的四舍五入 本来应该是11的 但是这里是10 10 gt gt gt round 11 5 整数部分为奇数的时候 又进位了 这里很迷 值得关注一下 12 总结一下 其实就是取靠近的偶数
  • Java当中的泛型(知识点详解)

    Java当中的泛型 一 为什么要有泛型 泛型的概念 二 在集合中使用泛型 三 自定义泛型结构 泛型类 泛型接口 泛型类 泛型方法 四 泛型在继承上的体现 请输出如下来两段代码有何不同 五 通配符的使用 注意点 有限制的通配符 六 泛型应用举
  • 转 C++ new和数组

    转 C new和数组 https blog csdn net u010292561 article details 77877266 大多数应用应该使用标准库容器而不是动态分配的数组 使用容器更为简单 更不容易出现内存管理错误并且可能有更好
  • 【数据库】第四章课后作业

    6 1 grant all privileges on 学生 to U1 with grant option grant all privileges on 班级 to U1 with grant option 6 2 grant sele
  • [python]异步 async

    encoding utf 8 Modify Time Author Version Description 2021 12 3 14 02 xlgui2 1 0 asyncio py3 8 异步IO 就是发起一个IO操作 如 网络请求 文件
  • map将传进来的函数应用于序列中的每一个元素,返回迭代器

    map将传进来的函数应用于序列中的每一个元素 并返回迭代器 map function iterable 举例来说 map 就是对 seq 列表中的每一个元素 item 进行 int 操作 int item 匿名函数同理 就是对序列中的每一个
  • PCB Layout 设计流程

    先有一些基本PCB概念 再开始进行软件上教学 首先要有个观念 PCB谈的是制作工艺 不是电路设计 所以即使你不太懂什么叫电路设计 只要确定有一个可正常工作的电路图 基本上也就可以做出一个PCB板 你也可以做出你自己的PCB板 只要你掌握了一
  • spark学习3:RDD运行原理

    1 RDD设计背景 为了解决 MapReduce的 频繁磁盘IO开销 序列化和反序列化的开销 因为从磁盘读取数据转换为对象 需要反序列化 在对象落磁盘时候 需要序列化 spark通过抽象的RDD对象和DAG图 对数据读取流转进行优化 最优方