Spark中的checkpoint作用与用法
来源:互联网 发布:剑灵洪门崛起进阶数据 编辑:程序博客网 时间:2024/06/05 22:53
checkpoint的意思就是建立检查点,类似于快照,例如在spark计算里面 计算流程DAG特别长,服务器需要将整个DAG计算完成得出结果,但是如果在这很长的计算流程中突然中间算出的数据丢失了,spark又会根据RDD的依赖关系从头到尾计算一遍,这样子就很费性能,当然我们可以将中间的计算结果通过cache或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储的这个内存出问题了或者磁盘坏了,也会导致spark从头再根据RDD计算一遍,所以就有了checkpoint,其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到一个高可用的地方(通常这个地方就是HDFS里面)
- 说道checkpoint就得说说RDD的依赖
比如我们计算wordcount的时候:
sc.textFile("hdfspath").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfspath")
- 1
1.在textFile读取hdfs的时候就会先创建一个HadoopRDD,其中这个RDD是去读取hdfs的数据key为偏移量value为一行数据,因为通常来讲偏移量没有太大的作用所以然后会将HadoopRDD转化为MapPartitionsRDD,这个RDD只保留了hdfs的数据
2.flatMap 产生一个RDD MapPartitionsRDD
3.map 产生一个RDD MapPartitionsRDD
4.reduceByKey 产生一个RDD ShuffledRDD
5.saveAsTextFile 产生一个RDD MapPartitionsRDD
可以根据查看RDD的依赖:
scala> val rdd = sc.textFile("hdfs://lijie:9000/checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20/rdd-0/part-00000").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)rdd: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[29] at reduceByKey at <console>:27scala> rdd.toDebugStringres3: String = (2) ShuffledRDD[29] at reduceByKey at <console>:27 [] +-(2) MapPartitionsRDD[28] at map at <console>:27 [] | MapPartitionsRDD[27] at flatMap at <console>:27 [] | hdfs://lijie:9000/checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20/rdd-0/part-00000 MapPartitionsRDD[26] at textFile at <console>:27 [] | hdfs://lijie:9000/checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20/rdd-0/part-00000 HadoopRDD[25] at textFile at <console>:27 []
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 怎么建立checkpoint
首先需要用sparkContext设置hdfs的checkpoint的目录(如果不设置使用checkpoint会抛出异常:throw new SparkException(“Checkpoint directory has not been set in the SparkContext”):
scala> sc.setCheckpointDir("hdfs://lijie:9000/checkpoint0727")
- 1
执行了上面的代码,hdfs里面会创建一个目录:
/checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20
- 1
然后执行checkpoint
scala> val rdd1 = sc.parallelize(1 to 10000)rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:27scala> rdd1.checkpoint
- 1
- 2
- 3
- 4
发现hdfs中还是没有数据,通过collect然后hdfs就有数据了,说明checkpoint也是个transformation的算子
scala> rdd1.sumres2: Double = 5.0005E7 #其中hdfs[root@lijie hadoop]# hadoop dfs -ls /checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20/rdd-0DEPRECATED: Use of this script to execute hdfs command is deprecated.Instead use the hdfs command for it.Found 2 items-rw-r--r-- 3 root supergroup 53404 2017-07-24 14:26 /checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20/rdd-0/part-00000-rw-r--r-- 3 root supergroup 53404 2017-07-24 14:26 /checkpoint0727/c1a51ee9-1daf-4169-991e-b290f88bac20/rdd-0/part-00001
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
但是执行的时候相当于走了两次流程,sum的时候前面计算了一遍,然后checkpoint又会计算一次,所以一般我们先进行cache然后做checkpoint就会只走一次流程,checkpoint的时候就会从刚cache到内存中取数据写入hdfs中,如下:
rdd.cache()rdd.checkpoint()rdd.collect
- 1
- 2
- 3
其中作者也说明了,在checkpoint的时候强烈建议先进行cache,并且当你checkpoint执行成功了,那么前面所有的RDD依赖都会被销毁,如下:
/** * Mark this RDD for checkpointing. It will be saved to a file inside the checkpoint * directory set with `SparkContext#setCheckpointDir` and all references to its parent * RDDs will be removed. This function must be called before any job has been * executed on this RDD. It is strongly recommended that this RDD is persisted in * memory, otherwise saving it on a file will require recomputation. */
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- Spark中的checkpoint作用与用法
- Spark中的checkpoint作用与用法
- spark rdd checkpoint的用法注意点
- spark rdd checkpoint的用法注意点
- 【总结】论spark中的cache/persist/checkpoint
- spark checkpoint
- Spark的cache与checkpoint优化
- spark中的cache() persist() checkpoint()之间的区别
- spark中的cache() persist() checkpoint()之间的区别
- spark cache和checkpoint
- Spark函数讲解:checkpoint
- spark的checkpoint
- Spark中CheckPoint操作
- spark的checkpoint
- Spark cache和checkpoint
- [spark] Checkpoint 源码解析
- spark checkpoint机制简述
- Spark Streaming 之 Checkpoint
- 1125. Chain the Ropes (25) 贪心
- JAVA如何使用Dom4j解析xml的DEMO案例
- jy-大佬作业(3)
- 三个水杯 搜索
- 习题7.1
- Spark中的checkpoint作用与用法
- [HDU
- 周一,关于sql几个join的理解
- java集合类整理
- 网络攻防笔记:写在开头
- 软件工程学习总结
- 文件解码
- Swift4.0 Codable踩坑之派生类数据的保存
- 关于卡特兰数