Spark内核解析之七:核心组件解析
BlockManager数据存储与管理机制
BlockManager是整个Spark底层负责数据存储与管理的一个组件,Driver和Executor的所有数据都由对应的BlockManager进行管理。
Driver上有BlockManagerMaster,负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如block的增删改等操作,都会在这里维护好元数据的变更。
每个节点都有一个BlockManager,每个BlockManager创建之后,第一件事即使去向BlockManagerMaster进行注册,此时BlockManagerMaster会为其长难句对应的BlockManagerInfo。
BlockManager运行原理如下图所示:
BlockManagerMaster与BlockManager的关系非常像NameNode与DataNode的关系,BlockManagerMaster中保存中BlockManager内部管理数据的元数据,进行维护,当BlockManager进行Block增删改等操作时,都会在BlockManagerMaster中进行元数据的变更,这与NameNode维护DataNode的元数据信息,DataNode中数据发生变化时NameNode中的元数据信息也会相应变化是一致的。
每个节点上都有一个BlockManager,BlockManager中有3个非常重要的组件:
- DiskStore:负责对磁盘数据进行读写;
- MemoryStore:负责对内存数据进行读写;
- BlockTransferService:负责建立BlockManager到远程其他节点的BlockManager的连接,负责对远程其他节点的BlockManager的数据进行读写;
每个BlockManager创建之后,做的第一件事就是想BlockManagerMaster进行注册,此时BlockManagerMaster会为其创建对应的BlockManagerInfo。
使用BlockManager进行写操作时,比如说,RDD运行过程中的一些中间数据,或者我们手动指定了persist(),会优先将数据写入内存中,如果内存大小不够,会使用自己的算法,将内存中的部分数据写入磁盘;此外,如果persist()指定了要replica,那么会使用BlockTransferService将数据replicate一份到其他节点的BlockManager上去。
使用BlockManager进行读操作时,比如说,shuffleRead操作,如果能从本地读取,就利用DiskStore或者MemoryStore从本地读取数据,但是本地没有数据的话,那么会用BlockTransferService与有数据的BlockManager建立连接,然后用BlockTransferService从远程BlockManager读取数据;例如,shuffle Read操作中,很有可能要拉取的数据在本地没有,那么此时就会到远程有数据的节点上,找那个节点的BlockManager来拉取需要的数据。
只要使用BlockManager执行了数据增删改的操作,那么必须将Block的BlockStatus上报到BlockManagerMaster,在BlockManagerMaster上会对指定BlockManager的BlockManagerInfo内部的BlockStatus进行增删改操作,从而达到元数据的维护功能。
Spark 共享变量底层实现
Spark一个非常重要的特性就是共享变量。
默认情况下,如果在一个算子的函数中使用到了某个外部的变量,那么这个变量的值会被拷贝到每个task中,此时每个task只能操作自己的那份变量副本。如果多个task想要共享某个变量,那么这种方式是做不到的。
Spark为此提供了两种共享变量,一种是Broadcast Variable(广播变量),另一种是Accumulator(累加变量)。Broadcast Variable会将用到的变量,仅仅为每个节点拷贝一份,即每个Executor拷贝一份,更大的用途是优化性能,减少网络传输以及内存损耗。Accumulator则可以让多个task共同操作一份变量,主要可以进行累加操作。Broadcast Variable是共享读变量,task不能去修改它,而Accumulator可以让多个task操作一个变量。
1. 广播变量
广播变量允许编程者在每个Executor上保留外部数据的只读变量,而不是给每个任务发送一个副本。
每个task都会保存一份它所使用的外部变量的副本,当一个Executor上的多个task都使用一个大型外部变量时,对于Executor内存的消耗是非常大的,因此,我们可以将大型外部变量封装为广播变量,此时一个Executor保存一个变量副本,此Executor上的所有task共用此变量,不再是一个task单独保存一个副本,这在一定程度上降低了Spark任务的内存占用。
Spark还尝试使用高效的广播算法分发广播变量,以降低通信成本。
Spark提供的Broadcast Variable是只读的,并且在每个Executor上只会有一个副本,而不会为每个task都拷贝一份副本,因此,它的最大作用,就是减少变量到各个节点的网络传输消耗,以及在各个节点上的内存消耗。此外,Spark内部也使用了高效的广播算法来减少网络消耗。
可以通过调用SparkContext的broadcast()方法来针对每个变量创建广播变量。然后在算子的函数内,使用到广播变量时,每个Executor只会拷贝一份副本了,每个task可以使用广播变量的value()方法获取值。
在任务运行时,Executor并不获取广播变量,当task执行到 使用广播变量的代码时,会向Executor的内存中请求广播变量,如下图所示:
之后Executor会通过BlockManager向Driver拉取广播变量,然后提供给task进行使用,如下图所示:
广播大变量是Spark中常用的基础优化方法,通过减少内存占用实现任务执行性能的提升。
2. 累加器
累加器(accumulator):Accumulator是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它们可用于实现计数器(如MapReduce)或总和计数。
Accumulator是存在于Driver端的,集群上运行的task进行Accumulator的累加,随后把值发到Driver端,在Driver端汇总(Spark UI在SparkContext创建时被创建,即在Driver端被创建,因此它可以读取Accumulator的数值),由于Accumulator存在于Driver端,从节点读取不到Accumulator的数值。
Spark提供的Accumulator主要用于多个节点对一个变量进行共享性的操作。Accumulator只提供了累加的功能,但是却给我们提供了多个task对于同一个变量并行操作的功能,但是task只能对Accumulator进行累加操作,不能读取它的值,只有Driver程序可以读取Accumulator的值。
Accumulator的底层原理如下图所示:
Spark内核解析之七:核心组件解析相关推荐
- Spark内核以及源码解析
2019独角兽企业重金招聘Python工程师标准>>> 一:图RDD 1.上图groupBy,Join会产生shuffle,shuffle可以做性能优化. 2.stage1和stag ...
- Spark内核解析1
Spark通讯架构 脚本探究: 概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark 任务调度机制.Spark 内存管理机制.Spark 核心功能的 ...
- 05_大数据技术之Spark内核解析(1.1)
1. Spark 内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spa ...
- Spark内核(上)——附:两种Yarn模式源码解析
文章目录 一.Spark内核概述 1.1 Spark核心组件回顾 1.1.1 Driver 1.1.2 Executor 1.2 Spark通用运行流程概述 二.Spark通信架构概述 2.1 Spa ...
- Spark内核解析之一:内核概述
Spark 内核概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark任务调度机制.Spark 内存管理机制.Spark 核心功能的运行原理等,熟练掌 ...
- Linux进程调用execve,linux内核系统调用函数do_execve()解析实例源码
linux内核系统调用函数do_execve()解析,彻底解析内核调用用户空间代码入口函数do_execve() sys_execve() –> do_execve() /usr/src/lin ...
- Spark ALS recommendForAll源码解析实战之Spark1.x vs Spark2.x
文章目录 Spark ALS recommendForAll源码解析实战 1. 软件版本: 2. 本文要解决的问题 3. 源码分析实战 3.1 Spark2.2.2 ALS recommendForA ...
- Spark SQL 工作流程源码解析(四)optimization 阶段(基于 Spark 3.3.0)
前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark SQL 工 ...
- spark word2vec 源码详细解析
spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...
- 【usb】linux内核USB键盘驱动解析--普通键值上报及转化
一.概况 建议阅读前置文章[usb]linux内核USB键盘驱动解析–特殊键值上报及转化 以Linux5.10内核中USB键盘驱动为例进行解析:https://mirrors.edge.kernel. ...
最新文章
- [YTU]_2002(C语言实验——单词统计)
- C#当中的BeginInvoke和EndInvoke
- Java类之File记录
- hana studio版本和hana版本的区别
- WordPress通过插件发送邮件
- 计算机科学技术考研内容,计算机科学技术考研考什么科目
- 不瞒你说,我最近跟Java源码杠上了
- 金融工程与并行计算:第二章 仿真法在财务工程的使用 Part 2
- pathon的安装与环境部署,数据类型
- 用C语言恶搞你的好朋友strcmp()
- 《沧海一声笑》简谱图修正版
- 如何通过组策略统一为公司电脑设置“兼容性视图设置”
- oracle rollup 合计,oracle中关于分组合计函数rollup使用
- 扎心“我学了六个月 Python,怎么还是会找不到工作”
- 毛戈平VS完美日记,“国货美妆第一股“新战争
- DAU、MAU、ARPU等究竟是什么——互联网企业常用指标科普
- win7快速连接系统补丁服务器,Win7旗舰版运行优化设置——如何快速安装系统补丁...
- linux主备dns切换时间,linux实现DNS轮询实现负载平衡
- 创新工场2014笔试算法题汇总
- 全国女子足球U13锦标赛
热门文章
- android4.4之后的HttpUrlConnection的实现是基于okhttp
- weak引用表原理探究
- 在Adobe Html5 Extension的使用Nodejs的问题
- 第十一次立会暨第四次集体开发
- AC自动机(Aho-Corasick automation)(转)
- Wayland 1.0 发布,图形服务器
- 【转】socket提交http表单 [C++]
- 简记Inception系列
- 搭建rocketMq环境
- python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法...