Storage模块负责了Spark计算过程中所有的存储,包括基于Disk的和基于Memory的。用户在实际编程中,面对的是RDD,可以将RDD的数据通过调用org.apache.spark.rdd.RDD#cache将数据持久化;持久化的动作都是由Storage模块完成的。包括Shuffle过程中的数据,也都是由Storage模块管理的。可以说,RDD实现了用户的逻辑,而Storage则管理了用户的数据。本章将讲解Storage模块的实现。

1.1     模块整体架构

org.apache.spark.storage.BlockManager是Storage模块与其他模块交互最主要的类,它提供了读和写Block的接口。 这里的Block,实际上就对应了RDD中提到的partition,每一个partition都会对应一个Block。每个Block由唯一的Block ID(org.apache.spark.storage.RDDBlockId) 标识,格式是"rdd_" + rddId + "_" + partitionId。

BlockManager会运行在Driver和每个Executor上。而运行在Driver上的BlockManger负责整个Job的Block的管理工作;运行在Executor上的BlockManger负责管理该Executor上的Block,并且向Driver的BlockManager汇报Block的信息和接收来自它的命令。

各个主要类的功能说明:

1)       org.apache.spark.storage.BlockManager: 提供了Storage模块与其他模块的交互接口,管理Storage模块。

2)       org.apache.spark.storage.BlockManagerMaster: Block管理的接口类,主要通过调用org.apache.spark.storage.BlockManagerMasterActor来完成。

3)       org.apache.spark.storage.BlockManagerMasterActor: 在Driver节点上的Actor,负责track所有Slave节点的Block的信息

4)       org.apache.spark.storage.BlockManagerSlaveActor:运行在所有的节点上,接收来自org.apache.spark.storage.BlockManagerMasterActor的命令,比如删除某个RDD的数据,删除某个Block,删除某个Shuffle数据,返回某些Block的状态等。

5)       org.apache.spark.storage.BlockManagerSource:负责搜集Storage模块的Metric信息,包括最大的内存数,剩余的内存数,使用的内存数和使用的Disk大小。这些是通过调用org.apache.spark.storage.BlockManagerMaster的getStorageStatus接口实现的。

6)       org.apache.spark.storage.BlockObjectWriter:一个抽象类,可以将任何的JVM object写入外部存储系统。注意,它不支持并发的写操作。

7)       org.apache.spark.storage.DiskBlockObjectWriter:支持直接写入一个文件到Disk,并且还支持文件的append。实际上它是org.apache.spark.storage.BlockObjectWriter的一个实现。现在下面的类在需要Spill数据到Disk时,就是通过它来完成的:

a)        org.apache.spark.util.collection.ExternalSorter

b)       org.apache.spark.shuffle.FileShuffleBlockManager

8)       org.apache.spark.storage.DiskBlockManager:管理和维护了逻辑上的Block和存储在Disk上的物理的Block的映射。一般来说,一个逻辑的Block会根据它的BlockId生成的名字映射到一个物理上的文件。这些物理文件会被hash到由spark.local.dir(或者通过SPARK_LOCAL_DIRS来设置)上的不同目录中。

9)       org.apache.spark.storage.BlockStore:存储Block的抽象类。现在它的实现有:

a)        org.apache.spark.storage.DiskStore

b)       org.apache.spark.storage.MemoryStore

c)        org.apache.spark.storage.TachyonStore

10)     org.apache.spark.storage.DiskStore:实现了存储Block到Disk上。其中写Disk是通过org.apache.spark.storage.DiskBlockObjectWriter实现的。

11)     org.apache.spark.storage.MemoryStore:实现了存储Block到内存中。

12)     org.apache.spark.storage.TachyonStore:实现了存储Block到Tachyon上。

13)     org.apache.spark.storage.TachyonBlockManager:管理和维护逻辑上的Block和Tachyon文件系统上的文件之间的映射。这点和org.apache.spark.storage.DiskBlockManager功能类似。

14)     org.apache.spark.storage.ShuffleBlockFetcherIterator:实现了取Shuffle的Blocks的逻辑,包括读取本地的和发起网络请求读取其他节点上的。具体实现可以参照《Shuffle模块详解》。

如果您喜欢 本文,那么请动一下手指支持以下博客之星的评比吧。非常感谢您的投票。每天可以一票哦。

Spark技术内幕:Storage 模块整体架构的更多相关文章

  1. Spark技术内幕:Stage划分及提交源码分析

    http://blog.csdn.net/anzhsoft/article/details/39859463 当触发一个RDD的action后,以count为例,调用关系如下: org.apache. ...

  2. Spark技术内幕: Task向Executor提交的源码解析

    在上文<Spark技术内幕:Stage划分及提交源码分析>中,我们分析了Stage的生成和提交.但是Stage的提交,只是DAGScheduler完成了对DAG的划分,生成了一个计算拓扑, ...

  3. Spark技术内幕:Master的故障恢复

    Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现  详细阐述了使用ZK实现的Master的HA,那么Master是如何快速故障恢复的呢? 处于 ...

  4. Spark技术内幕: Task向Executor提交的源代码解析

    在上文<Spark技术内幕:Stage划分及提交源代码分析>中,我们分析了Stage的生成和提交.可是Stage的提交,仅仅是DAGScheduler完毕了对DAG的划分,生成了一个计算拓 ...

  5. 我的第一本著作:Spark技术内幕上市!

    现在各大网站销售中! 京东:http://item.jd.com/11770787.html 当当:http://product.dangdang.com/23776595.html 亚马逊:http ...

  6. Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现

    如果Spark的部署方式选择Standalone,一个采用Master/Slaves的典型架构,那么Master是有SPOF(单点故障,Single Point of Failure).Spark可以 ...

  7. 社区布道师揭秘消息中间件技术内幕,撰写MQ架构设计与实现原理

    RocketMQ是什么 RocketMQ是由阿里捐赠给Apache的一款分布式.队列模型的开源消息中间件,经历了淘宝双十一的洗礼. RocketMQ的特性 RocketMQ基本概念 Client端 P ...

  8. Spark技术内幕:Shuffle Read的整体流程

    回忆一下,每个Stage的上边界,要么需要从外部存储读取数据,要么需要读取上一个Stage的输出:而下边界,要么是需要写入本地文件系统(需要Shuffle),以供childStage读取,要么是最后一 ...

  9. Spark技术内幕:Worker源码与架构解析

    首先通过一张Spark的架构图来了解Worker在Spark中的作用和地位: Worker所起的作用有以下几个: 1. 接受Master的指令,启动或者杀掉Executor 2. 接受Master的指 ...

随机推荐

  1. [LeetCode] Contain Virus 包含病毒

    A virus is spreading rapidly, and your task is to quarantine the infected area by installing walls. ...

  2. 【实验吧】CTF_Web_简单的SQL注入之1

    题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...

  3. [SDOI 2013]方程

    Description 题库链接 求不定方程 \(x_1+x_2+\cdots +x_n=m\) 的正整数解的个数,并且要求满足限定: \(\forall i\in[1,n_1] x_i\leq a_ ...

  4. [测试题]wows

    Description 山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目标身后的圆形 ...

  5. C++多态?

    以前看资料只是理解多态是"一个接口,多种调用" ,但是没有理解其真正意思,不明白具体咋么实现. 不过看了这位博主的博客后对多态有了一些理解,链接:https://www.cnblo ...

  6. c语言程序设计第四次作业——顺序结构

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  7. php留言板的实现

    留言板功能的实现,主要就是通过编程语言对数据库进行操作,简单说也就是插入和查询的实现.不管是什么语言进行实现,道理都是一样的. 应学习需要,这里用php世界上最美的语言来进行实现. 主要步骤为: 连接 ...

  8. 阿里Java研发工程师实习面经

    十分幸运 拿到阿里云的offer,感谢周围无数人对我的支持和鼓励,所以写篇面经希望可以帮助大家. 面试中,运气占很大一部分的,所以你们若是没有通过,一定不要气馁,继续加油. 每个努力的人 都值得钦佩, ...

  9. Linux学习之CentOS(十六)-----内存置换空间(swap)之建置(转)

    内存置换空间(swap)之建置 安装时一定需要的两个 partition 啰! 一个是根目录,另外一个就是 swap(内存置换空间), swap 的功能就是在应付物理内存不足的情况下所造成的内存延伸记 ...

  10. JVM Class详解之一

    首先看Class中包含哪些信息简单的说所有Java文件中有的信息class文件都有,编译器帮我们将java文件转化成了JVM能看懂的class格式而已 Class 概述 Class文件是一组以8位字节 ...