Spark分布式计算原理
Spark分布式计算原理
- 一、RDD特征
- 1、Lineage:血统、遗传
- 2、依赖关系
- 二、DAG(有向无环图)工作原理
- 三、Spark Shuffle过程
- 四、RDD持久化
- 1、RDD缓存机制
- 2、缓存策略
- 3、缓存应用场景
- 4、检查点
- 五、RDD共享变量
- 1、广播变量
- 2、累加器
- 六、RDD分区设计
- 1、分区大小限制为2G
- 2、分区太少
- 3、分区过多
- 4、经验
- 5、数据倾斜
一、RDD特征
1、Lineage:血统、遗传
- RDD最重要的特性之一,保存了RDD的依赖关系
- RDD实现了基于Lineage的容错机制
2、依赖关系
宽依赖
一个父RDD的分区被子RDD的多个分区使用
窄依赖
一个父RDD的分区被子RDD的一个分区使用
宽依赖对比窄依赖
- 宽依赖对应shuffle操作,需要在运行时将同一个父RDD的分区传入到不同的子RDD分区中,不同的分区可能位于不同的节点,就可能涉及多个节点间数据传输
- 当RDD分区丢失时,Spark会对数据进行重新计算,对于窄依赖只需重新计算一次子RDD的父RDD分区
- 结论:相比于宽依赖,窄依赖对优化更有利
算子依赖
- map(窄)
- flatMap(窄)
- filter(窄)
- distinct(宽)
- reduceByKey(宽)
- groupByKey(宽)
- sortByKey(宽)
- union(窄)
- join(宽)
二、DAG(有向无环图)工作原理
1、根据RDD之间的依赖关系,形成一个DAG
2、DAGScheduler将DAG划分为多个Stage
- 划分依据:是否发生宽依赖(Shuffle)
- 划分规则:从后往前,遇到宽依赖切割为新的Stage
- 每个Stage由一组并行的Task组成
3、为什么划分Stage
(1)数据本地化
- 移动计算,而不移动数据
- 保证一个 Stage 内不会发生数据移动
(2)优化
- 尽量避免 Shuffle
- 提前部分聚合减少数据移动
三、Spark Shuffle过程
在分区之间重新分配数据
- 父RDD中同一分区中的数据按照算子要求重新进入子RDD的不同分区中
- 中间结果写入磁盘
- 由子RDD拉取数据,而不是由父RDD推送
- 默认情况下,Shuffle不会改变分区数量
四、RDD持久化
1、RDD缓存机制
- 缓存是在计算结束后,直接将计算结果通过用户定义的存储级别(存储级别定义了缓存存储的介质,现在支持内存、本地文件系统和Tachyon)写入不同的介质
- 缓存数据至内存/磁盘,可大幅度提升Spark应用性能
- cache()或persist()后不能再有其他算子
- cache()或persist()遇到Action算子完成后才生效
val conf = new SparkConf().setMaster("local[*]").setAppName("CacheDemo")val sc = new SparkContext(conf)val rdd = sc.textFile("in/users.csv")rdd.cache()var start = System.currentTimeMillis()rdd.count()var end = System.currentTimeMillis()println("缓存时count时间:"+(end - start))start = System.currentTimeMillis()rdd.count()end = System.currentTimeMillis()println("缓存完成后count时间:"+(end - start))//缓存时count时间:627//缓存完成后count时间:34
2、缓存策略
(1)数据持久缓存到内存中
- data.cache()
(2)设置缓存级别(StorageLevel
)
- data.persist(StorageLevel.MEMORY_ONLY)
缓存级别
缓存级别 | 使用空间 | CPU时间 | 是否在内存中 | 是否在磁盘上 | 备注 |
---|---|---|---|---|---|
MEMORY_ONLY | 高 | 低 | 是 | 否 | 默认为该级别 |
MEMORY_ONLY_2 | 高 | 低 | 是 | 否 | 数据存2份 |
MEMORY_ONLY_SER | 低 | 高 | 是 | 否 | 数据序列化 |
MEMORY_ONLY_SER_2 | 低 | 高 | 是 | 否 | 数据序列化,数据存2份 |
MEMORY_AND_DISK | 高 | 中等 | 部分 | 部分 | 如果数据在内存中放不下,则溢写到磁盘 |
MEMORY_AND_DISK_2 | 高 | 中等 | 部分 | 部分 | 数据存2份 |
MEMORY_AND_DISK_SER | 低 | 高 | 部分 | 部分 | |
MEMORY_AND_DISK_SER_2 | 低 | 高 | 部分 | 部分 | 数据存2份 |
DISK_ONLY | 低 | 高 | 否 | 是 | |
DISK_ONLY_2 | 低 | 高 | 否 | 是 | 数据存2份 |
NONE | |||||
OFF_HEAP |
(3)清除缓存
- data.unpersist
3、缓存应用场景
- 从文件加载数据之后,因为重新获取文件成本较高
- 经过较多的算子变换之后,重新计算成本较高
- 单个非常消耗资源的算子之后
4、检查点
- 检查点是在计算完成后,重新建立一个Job来计算
- 为了避免重复计算,推荐先将RDD缓存,这样就能保证检查点的操作可以快速完成
- 检查点会删除 RDD Lineage,而缓存不会
- SparkContext 被销毁后,检查点数据不会被删除
设置检查点
//设置检查点路径,可设置在hdfs、本地上sc.setCheckpointDir("in/check")rdd.checkpoint()
五、RDD共享变量
1、广播变量
允许开发者将一个只读变量(Driver端)缓存到每个节点(Executor)上,而不是每个任务传递一个副本
使用
val broadcastVar=sc.broadcast(Array(1,2,3)) //定义广播变量
broadcastVar.value //访问方式
2、累加器
只允许added操作,常用于实现计数
使用
val accum = sc.accumulator(0,"My Accumulator")
sc.parallelize(Array(1,2,3,4)).foreach(x=>accum+=x)
accum.value
六、RDD分区设计
1、分区大小限制为2G
2、分区太少
- 不利于并发
- 更容易受数据倾斜影响
- groupBy, reduceByKey, sortByKey等内存压力增大
3、分区过多
- Shuffle开销越大
- 创建任务开销越大
4、经验
- 每个分区大小建议为128MB
- 如果分区小于但接近2000,则设置为大于2000
5、数据倾斜
指分区中的数据分配不均匀,数据集中在少数分区中
- 严重影响性能
- 通常发生在groupBy,join等之后
解决方案
使用新的Hash值(如对key加盐)重新分区
Spark分布式计算原理相关推荐
- Spark 分布式计算原理
Spark 分布式计算原理 Spark Shuffle 1)在数据之间重新分配数据 2)(将父RDD重新定义进入子RDD)每一个分区里面的数据要重新进入新的分区 3)每一个shuffle阶段尽量保存在 ...
- 2020.11.10课堂笔记(Apache Spark 分布式计算原理)
Spark WordCount运行原理 一.RDD的依赖关系 为什么需要划分Stage 数据本地化- 移动计算,而不是移动数据 保证一个Stage内不会发生数据移动 Lineage:血统.遗传 RDD ...
- spark启动的worker节点是localhost_Spark大数据在线培训:Spark运行原理解析
在大数据技术框架当中,Spark是继Hadoop之后的又一代表性框架,也是学习大数据当中必学的重点技术框架.在这些年的发展当中,Spark所占据的市场地位,也在不断拓展.今天的Spark大数据在线培训 ...
- Spark工作原理入门
Spark工作原理入门 文章目录 Spark工作原理入门 1.功能概要 基本描述 运用场景 实际使用 2.模块组成 HDFS MLlib Mesos Tachyon GraphX Spark SQL ...
- Spark Shuffle原理解析
Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...
- .Spark Streaming(上)--实时流计算Spark Streaming原理介
Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...
- Spark SQL原理及常用方法详解(二)
Spark SQL 一.Spark SQL基础知识 1.Spark SQL简介 (1)简单介绍 (2)Datasets & DataFrames (3)Spark SQL架构 (4)Spark ...
- 深入理解Spark SQL原理
1.前言 本文是对自己阅读Spark SQL源码过程的一个记录,主线是对尚硅谷Spark SQL最后练习中建立的表的一个简单SQL编写的源码实现流程的跟读.通过自问自答的方式,学习完了整个Spar ...
- Spark 核心原理
文章目录 1. Spark核心原理 2. 消息通信原理 2.1. Spark运行时消息通信 2.2. 作业执行原理 2.2.1. 总述 2.2.2. 提交Job 2.2.3. 划分stage 2.2. ...
最新文章
- mysql查询枚举类型转换_zendframework获取数据库中枚举类enum的数据并将其转换成数组...
- 医院选址问题--数据结构课程设计
- 维基解密揭秘CIA五种恶意软件用法
- 第二期 AOSP 环境搭建、下载和编译 《手机就是开发板》遇到问题解决
- New Text Document.udl
- Python入门4_之字典的使用
- ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)
- html php滚动代码,html中滚动条的代码是什么?如何设置html滚动条?
- 方法 手写promise_JS探索-手写Promise
- 20 个 GPU 可承载相当于全球互联网流量、Grace CPU 超级芯片现世,英伟达这届 GTC 发布了什么?...
- java 序列号 1l_private static final long serialVersionUID=1L 是什么意思
- 深入浅出SCSI子系统(六)SCSI 磁盘驱动
- Games 101 作业2 超详细说明
- 微信小程序 + 腾讯位置服务SDK 实现路线规划
- 如何设计出骚气的秒杀系统?
- 企业邮箱安全防盗措施
- 前端学习笔记2——错误解决,接口,echart
- 快速解决Win 7升级后无法正常进入睡眠模式的问题——386w.com
- 分布式系统 淘宝数据魔方技术架构解析
- 雷达传感器模块,智能门锁感应技术,科技赋能智慧安防应用