文档章节

Spark(Storage)

赵-猛
 赵-猛
发布于 2017/06/17 11:57
字数 662
阅读 5
收藏 0

存储管理

    diskstore
    memorystore


一大组件

  BlockManager

 

消息通信(Actor模型)

    master(BlockManager) to slave(BlockManager)
    slave(BlockManager) to master(BlockManager)


    
RDD/Block

  在调度层, RDD由多个partition/bucket构成
  在存储层, RDD又是以block为单位进行存取,
     对于DiskStore,则一个blcok一个物理文件,再由hash map管理id和路径
     对于MemoryStore,则直接由HashMap管理id和block
  在task的rdd.iterator()中,即partition/bucket要进行运算时,会处理通过BlockManager管理block

  (rdd的partition和block为一一对应)

 

spark 中的block是rdd在被task执行之前,其基本组成partition被blockManage映射而来的一种抽象
spark 中,在storage模块里面所有的操作都是和block相关的,但是在RDD里面所有的运算都是基于partition的
如果当前RDD的storage level不是NONE的话,表示该RDD在BlockManager中有存储,那么调用CacheManager中的getOrCompute()函数计算RDD,
在这个函数中partition和block发生了关系:
  首先根据RDD id和partition index构造出block id (rdd_xx_xx),接着从BlockManager中取出相应的block
需要注意的是block的计算和存储是阻塞的,若另一线程也需要用到此block则需等到该线程block的loading结束

(hdfs 中的 block 是存储的最小单元)

spark中的RDD-Cache, Shuffle-output, 以及broadcast的实现都是基于BlockManager来实现, BlockManager提供了数据存储(内存/文件存储)接口.
这里的Block和HDFS中谈到的Block块是有本质区别:
  HDFS中是对大文件进行分Block进行存储,Block大小固定为512M等;
  Spark中的Block是用户的操作单位, 一个Block对应一块有组织的内存,一个完整的文件或文件的区间端,并没有固定每个Block大小的做法;
  
(hdfs 中的 block 是存储的最小单元)

trait BlockDataManager {
  def getBlockData(blockId: String): Option[ManagedBuffer]
  def putBlockData(blockId: String, data: ManagedBuffer, level: StorageLevel): Unit
}

Spark中Block类型

    RDDBlock:"rdd_" + rddId + "_" + splitIndex; 即每个RDD block表示一个特定rdd的一个分片
    ShuffleBlock:关于shuffle,在Spark的1.1版本中发布一个sort版本的shuffle,原先的版本为hash,因此两种类型的shuffle也对应了两种数据结构
        Hash版本,ShuffleBlock:"shuffle_" + shuffleId + "" + mapId + "" + reduceId
        Sort版本,对于每一个bucket(shuffleId + "" + mapId + "" + reduceId组合)由ShuffleDataBlock和ShuffleIndexBlock两种block组成
            "shuffle_" + shuffleId + "" + mapId + "" + reduceId + ".data"
            "shuffle_" + shuffleId + "" + mapId + "" + reduceId + ".index"
    BroadcastBlock:"broadcast_" + broadcastId + "_" + field)
    TaskResultBlock:"taskresult_" + taskId;Spark中task运行的结果也是通过BlockManager进行管理
    StreamBlock: "input-" + streamId + "-" + uniqueId应该是用于streaming中
    TempBlock: "temp_" + id

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 产业分类
下一篇: Spark(Scheduler)
赵-猛
粉丝 6
博文 760
码字总数 462301
作品 0
深圳
技术主管
私信 提问
[Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情

本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM ...

hblt-j
2017/11/08
0
0
你不能错过的 spark 学习资源

1. 书籍,在线文档 2. 网站 3. Databricks Blog 4. 文章,博客 5. 视频

u012608836
04/12
0
0
Apache Spark 统一内存管理模型详解

本文将对 Spark 的内存管理模型进行分析,下面的分析全部是基于 Apache Spark 2.2.1 进行的。为了让下面的文章看起来不枯燥,我不打算贴出代码层面的东西。文章仅对统一内存管理模块(Unifie...

Spark
04/02
0
0
一文理清Apache Spark内存管理脉络

Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优。本文旨在梳理...

技术小能手
05/31
0
0
Spark 学习资源收集【Updating】

(一)spark 相关安装部署、开发环境 1、Spark 伪分布式 & 全分布式 安装指南 http://my.oschina.net/leejun2005/blog/394928 2、Apache Spark探秘:三种分布式部署方式比较 http://dongxic...

大数据之路
2014/09/08
0
1

没有更多内容

加载失败,请刷新页面

加载更多

利用cefSharp实现网页自动注册登录的需要注册的一些事项

最近朋友有个需要自动注册登录点击的事,我帮着写了写,好久没写过这东西了,在写的过程中总结了需要注意的一些事项。 一、换IP之后要测试一下速度,我目前用的最简单的测试方法就是20-30秒加...

我退而结网
14分钟前
1
0
Go语言中使用 BoltDB数据库

boltdb 是使用Go语言编写的开源的键值对数据库,Github的地址如下: https://github.com/boltdb/bolt boltdb 存储数据时 key 和 value 都要求是字节数据,此处需要使用到 序列化和反序列化。...

Oo若离oO
15分钟前
1
0
zookeeper分布式锁

//lock 锁 定义分布式锁public interface Lock {//获取锁public void getLock();//释放锁public void unLock();} public abstract class ZookeeperAbstractLock implements Loc......

熊猫你好
22分钟前
0
0
mysql_事务隔离机制

事务隔离机制 事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在mysql中,事务支持是在引擎层实现的。mysql是一个支持多引擎的系统,但并不是所有引擎都支持事务,比如mysql...

grace_233
25分钟前
0
0
不学无数——Java中IO和NIO

JAVA中的I/O和NIO I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其...

不学无数的程序员
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部