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内核解析之七:核心组件解析相关推荐

  1. Spark内核以及源码解析

    2019独角兽企业重金招聘Python工程师标准>>> 一:图RDD 1.上图groupBy,Join会产生shuffle,shuffle可以做性能优化. 2.stage1和stag ...

  2. Spark内核解析1

    Spark通讯架构 脚本探究: 概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark 任务调度机制.Spark 内存管理机制.Spark 核心功能的 ...

  3. 05_大数据技术之Spark内核解析(1.1)

    1. Spark 内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spa ...

  4. Spark内核(上)——附:两种Yarn模式源码解析

    文章目录 一.Spark内核概述 1.1 Spark核心组件回顾 1.1.1 Driver 1.1.2 Executor 1.2 Spark通用运行流程概述 二.Spark通信架构概述 2.1 Spa ...

  5. Spark内核解析之一:内核概述

    Spark 内核概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark任务调度机制.Spark 内存管理机制.Spark 核心功能的运行原理等,熟练掌 ...

  6. Linux进程调用execve,linux内核系统调用函数do_execve()解析实例源码

    linux内核系统调用函数do_execve()解析,彻底解析内核调用用户空间代码入口函数do_execve() sys_execve() –> do_execve() /usr/src/lin ...

  7. Spark ALS recommendForAll源码解析实战之Spark1.x vs Spark2.x

    文章目录 Spark ALS recommendForAll源码解析实战 1. 软件版本: 2. 本文要解决的问题 3. 源码分析实战 3.1 Spark2.2.2 ALS recommendForA ...

  8. Spark SQL 工作流程源码解析(四)optimization 阶段(基于 Spark 3.3.0)

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark SQL 工 ...

  9. spark word2vec 源码详细解析

    spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...

  10. 【usb】linux内核USB键盘驱动解析--普通键值上报及转化

    一.概况 建议阅读前置文章[usb]linux内核USB键盘驱动解析–特殊键值上报及转化 以Linux5.10内核中USB键盘驱动为例进行解析:https://mirrors.edge.kernel. ...

最新文章

  1. [YTU]_2002(C语言实验——单词统计)
  2. C#当中的BeginInvoke和EndInvoke
  3. Java类之File记录
  4. hana studio版本和hana版本的区别
  5. WordPress通过插件发送邮件
  6. 计算机科学技术考研内容,计算机科学技术考研考什么科目
  7. 不瞒你说,我最近跟Java源码杠上了
  8. 金融工程与并行计算:第二章 仿真法在财务工程的使用 Part 2
  9. pathon的安装与环境部署,数据类型
  10. 用C语言恶搞你的好朋友strcmp()
  11. 《沧海一声笑》简谱图修正版
  12. 如何通过组策略统一为公司电脑设置“兼容性视图设置”
  13. oracle rollup 合计,oracle中关于分组合计函数rollup使用
  14. 扎心“我学了六个月 Python,怎么还是会找不到工作”
  15. 毛戈平VS完美日记,“国货美妆第一股“新战争
  16. DAU、MAU、ARPU等究竟是什么——互联网企业常用指标科普
  17. win7快速连接系统补丁服务器,Win7旗舰版运行优化设置——如何快速安装系统补丁...
  18. linux主备dns切换时间,linux实现DNS轮询实现负载平衡
  19. 创新工场2014笔试算法题汇总
  20. 全国女子足球U13锦标赛

热门文章

  1. android4.4之后的HttpUrlConnection的实现是基于okhttp
  2. weak引用表原理探究
  3. 在Adobe Html5 Extension的使用Nodejs的问题
  4. 第十一次立会暨第四次集体开发
  5. AC自动机(Aho-Corasick automation)(转)
  6. Wayland 1.0 发布,图形服务器
  7. 【转】socket提交http表单 [C++]
  8. 简记Inception系列
  9. 搭建rocketMq环境
  10. python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法...