Spark技术内幕:Storage 模块整体架构

id="cproIframe_u1728839_2" width="120" height="240" src="http://pos.baidu.com/acom?adn=4&at=160&aurl=&cad=1&ccd=24&cec=GBK&cfv=15&ch=0&col=zh-CN&conOP=0&cpa=1&dai=2&dis=0&layout_filter=rank%2Cimage&ltr=http%3A%2F%2Fwww.aboutyun.com%2Fthread-11749-1-1.html&ltu=http%3A%2F%2Fwww.aboutyun.com%2Fthread-12421-1-1.html&lunum=6&n=92051019_cpr&pcs=1263x674&pis=10000x10000&ps=544x1090&psr=1280x800&pss=1263x904&qn=4d2b1a3be3553960&rad=&rsi0=120&rsi1=240&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=tabcloud_skin_3&stid=5&td_id=1728839&tn=text_default_120_240&tpr=1428454774974&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1728839&tt=1428454774928.514.855.856" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="word-wrap: break-word;">
问题导读:

1、如何理解Spark模块整体架构?
2、理解Spark中各个类的功能作用都有什么?




 

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模块详解》。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值