CheckPoint
CheckPoint的作用
checkPoint的主要作用事斩断RDD的依赖关系,并将数据存储在可靠的数据引擎中,例如分布式文件存储系统HDFS.
checkPoint的方式:
- 可靠的将数据存储在可靠的存储引擎中,例如HDFS
- 本地的,将数据存储在本地
什么斩断依赖
斩断依赖链是一个非常重非要的操作,接下来以HDFS的nameNode的原理来举例说明:
Hdfs的NameNOde中主要职责是维护两个文件,一个叫做edits,另外一个是fsimage,edits中主要存放EditLog,FsImage保存了当前系统中所有目录和文件的信息,这个FsImage其实就是哟个Checkpoint(检查点).
Hdfs的NameNode维护这两个文件主要过程是:首先,会由fsimage文件记录当前系统某个时间点的完整数据,自此之后的数据并不是时刻写入fsimage文件的,而是操作将操作记录存在edits文件中,其次,在一定出发条件下,edits会将自身合并进入fimage,最后生成新的fsimage文件,edits重置,重新记录这次fsimage以后的操作日志.
如果不合并edits文件进入fsimage文件会怎么样?会导致edits中记录的日志较长,容易出错.所以当spark的一个job之星流程过长的时候,也需要这样使得接下来的计算可以轻装上阵.
如果当前的RDD出现错误,那么就会从上一个正确的数据重4重新计算.
checkpoint和缓存的区别
Cache可以把RDD计算出来然后放到内存中,但是RDD的依赖(相当于NameNode中的Edits日志)是不能丢的,因为这种缓存是不可靠的,如果出现一些错误(例如Executor宕机),这个RDD的容错就只能通过回溯依赖链,重新计算出来.
但是checkpoint检查点把结果保存在Hdfs这类存储中,就可靠,所以可以斩断依赖链,如果出错,可以通过复制HDFS中的文件来实现容错.所以他们的区别主要在以下两点:
1.checkpoint可以保存数据到HDFS中这类可靠的存储上,Persisit和Cache只能保存在本地的磁盘或者内存中.
2.checkpoint可以斩断依赖链,而Persisit和Cache不行
3.因为Chackpoint没有向上的依赖链,所以程序结束后依然存在,不会被删除,而Cache和Persisit回在程序结束后被清除.
Checkpoint的使用
简单的示例:
def main(args: Array[String]): Unit = {
val config = new SparkConf().setMaster("local").setAppName("My App")
val sc = new SparkContext(config)
//设置保存checkpoint的目录,可以是本地也可以是hdfs中的目录
// sc.setCheckpointDir("hdfs://plat/myCheckpoint") //生产
sc.setCheckpointDir("checkpoint") //测试
val sources = sc.textFile("D:\\test.properties")
val countRDD = sources.map(item => (item.split(" ")(0),1))
val cleanRDD = countRDD.filter(item => StringUtils.isNotEmpty(item._1))
val aggRDD = cleanRDD.reduceByKey((curr,agg) => curr + agg)
aggRDD.cache() //缓存下避免一直计算前面的RDD导致资源的浪费
aggRDD.checkpoint();
}