spark存储,缓存,断点模块

来源:互联网 发布:网络畅销书排行榜 编辑:程序博客网 时间:2024/05/17 07:30

一. blockManager
1. driver上有BlockmanagerMaster, 负责维护各个节点上blockManager的元数据,比如block增删改等操作。
driver->DAGScheduler->blockManagerMaster->blockManagerInfo->blockStatus
blockManager创建后,先向blockManagerMaster进行注册,此时blockManagerMaster会创建其对应的blockManagerInfo。
blockManager执行数据的增删改操作,必须将blockStatus上报给blockManagerMaster。
2. blockManager有几个组件:DiskStore负责磁盘数据读写,MemoryStore负责内存数据读写,ConnectionManager负责建立BlockManager到远程其他节点的连接,BlockManagerWork负责远程其他节点的blockManager的数据读写。
二. CacheManager
CacheManager管理缓存数据,包括磁盘和内存数据,通过 blockManager操作数据。每当task执行rdd的compute方法,而 Compute 方法会调用 iterator 方法;如果rdd是之前持久过的,其StorageLevel肯定不是none,此时会用CacheManager读取持久化数据。cacheManager通过blockManager首先尝试从本地获取数据,本地没有,尝试从远程获取。如果虽然持久化过,但仍然读取不到数据,尝试读取checkpoint过的数据,如果没读到,就重新计算,计算完的数据会用blockManager持久化一次。如果之前没有对rdd持久化,会从rdd的父rdd执行算子计算rdd的partition数据。
三. checkPoint
checkPoint,设置断点,其和持久化的区别在于,持久化只是将数据保存在blockManager中,rdd的lineage依赖关系是不变的。而checkPoint会改变rdd的lineage,执行checkpoint操作后,rdd没有之前的依赖rdd,只有一个强行为其设置的checkPointRDD。其次,持久化的数据丢失的可能性更大,只是存在磁盘或者内存,而checkPoint的数据,通常保存在HDFS,高容错高可用的文件系统,数据丢失的可能性非常小。RDD.checkpoint()之后,此rdd接收RDDCheckpointData对象的管理,RDDCheckpointData对象,会checkpoint的rdd状态设置为MarkedForCheckpoint。当rdd所在的job运行结束了,会调用job中最后一个RDD的doCheckpoint方法,沿着finalRDD的lineage想上查找状态为MarkedForCheckpoint的rdd,并更改其状态为CheckpointingInPorgress。启动一个单独的job,将lineage中状态为CheckpointInProgress的RDD进行checkpoint操作,将其数据写入SparkContext.setCheckpointDir()方法设置的文件系统中。
如果rdd没有持久化,还设置的checkpoint,那么在job执行结束后,启动checkpoint job要将rdd的数据写入外部文件系统时,需要将该rdd之前的rdd重新计算一次,再将其checkpoint到外部文件系统。所以,要对checkpoint的rdd使用persist持久化操作。

原创粉丝点击