zoukankan      html  css  js  c++  java
  • cache,persist以及checkpoint

    checkpoint写流程

    可以看到checkpoint使用非常简单,设置checkpoint目录,然后调用RDD的checkpoint方法。针对checkpoint的写入流程,主要有以下四个问题:

    Q1:RDD中的数据是什么时候写入的?是在rdd调用checkpoint方法时候吗?

    Q2:在做checkpoint的时候,具体写入了哪些数据到HDFS了?

    Q3:在对RDD做完checkpoint以后,对做RDD的本省又做了哪些收尾工作?

    Q4:实际过程中,使用RDD做checkpoint的时候需要注意什么问题?

    弄清楚了以上四个问题,我想对checkpoint的写过程也就基本清楚了。接下来将一一回答上面提出的问题。

    A1:首先看一下RDD中checkpoint方法,可以看到在该方法中是只是新建了一个ReliableRDDCheckpintData的对象,并没有做实际的写入工作。实际触发写入的时机是在runJob生成改RDD后,调用RDD的doCheckpoint方法来做的。

    A2:在经历调用RDD.doCheckpoint → RDDCheckpintData.checkpoint → ReliableRDDCheckpintData.doCheckpoint → ReliableRDDCheckpintData.writeRDDToCheckpointDirectory后,在writeRDDToCheckpointDirectory方法中可以看到:将作为一个单独的任务(RunJob)将RDD中每个parition的数据依次写入到checkpoint目录(writePartitionToCheckpointFile),此外如果该RDD中的partitioner如果不为空,则也会将该对象序列化后存储到checkpoint目录。所以,在做checkpoint的时候,写入的hdfs中的数据主要包括:RDD中每个parition的实际数据,以及可能的partitioner对象(writePartitionerToCheckpointDir)。

    A3:在写完checkpoint数据到hdfs以后,将会调用rdd的markCheckpoined方法,主要斩断该rdd的对上游的依赖,以及将paritions置空等操作。

    A4:通过A1,A2可以知道,在RDD计算完毕后,会再次通过RunJob将每个partition数据保存到HDFS。这样RDD将会计算两次,所以为了避免此类情况,最好将RDD进行cache。即1.1中rdd的推荐使用方法如下:

    sc.setCheckpointDir(checkpointDir.toString)
    val rdd = sc.makeRDD(1 to 20, numSlices = 1)
    rdd.cache()
    rdd.checkpoint()

    checkpoint 读流程

    在做完checkpoint后,获取原来RDD的依赖以及partitions数据都将从CheckpointRDD中获取。也就是说获取原来rdd中每个partition数据以及partitioner等对象,都将转移到CheckPointRDD中。

    在CheckPointRDD的一个具体实现ReliableRDDCheckpintRDD中的compute方法中可以看到,将会从hdfs的checkpoint目录中恢复之前写入的partition数据。而partitioner对象(如果有)也会从之前写入hdfs的paritioner对象恢复。

    总的来说,checkpoint读取过程是比较简单的。

  • 相关阅读:
    oracle--角色权限
    oracle--权限的传递
    oracle--少见操作、如何调整dos窗口大小、字符集设置
    oracle--对象权限
    oracle-系统权限管理
    IOS-swift5.1快速入门之旅
    oracle--用户区别sys和system
    JSP基础--EL表达式
    JSP基础--javaBean
    hdu_A Walk Through the Forest ——迪杰特斯拉+dfs
  • 原文地址:https://www.cnblogs.com/muyue123/p/13229757.html
Copyright © 2011-2022 走看看