缓存(persist/cache)
cache和persist其实是RDD的两个API,并且cache调用的就是persist
区别之一就在于cache不能显式指定缓存方式,只能缓存在内存中;但是persist可以通过指定缓存方式,比如显示指定缓存在内存中、磁盘并且序列化等。通过RDD的缓存,重用这些缓存的数据集
如果缓存的数据太多而内存暂时放不下, spark会利用LRU算法,把内存中的历史分区移除出去,保存在磁盘中
检查点(checkpoint)
也是在触发action之后,执行任务。单独再启动一个job,本质上是将RDD写入磁盘做检查点(通常是checkpoint到HDFS上,同时利用了hdfs的高可用、高可靠等特征)。上面提到了Spark lineage,但在实际的生产环境中,一个业务需求可能非常非常复杂,那么就可能会调用很多算子,产生了很多RDD,那么RDD之间的lineage链条就会很长,一旦某个环节出现问题,容错的成本会非常高。此时,checkpoint的作用就体现出来了。使用者可以将重要的RDD checkpoint下来,出错后,只需从最近的checkpoint开始重新运算即可
个人理解:虽然有血缘关系,可以加快重建RDD,但是血缘关系是基于分区的,分区的计算还是需要从头开始计算到当前的节点,所以当RDD的某个分区出现的错误,该分区的重算还是需要从头计算的。
而且checkpoint可以将RDD完整的持久化起来,所以在重算的时候是很方便的!
使用方式也很简单,指定checkpoint的地址,SparkContext.setCheckpointDir("checkpoint的地址"),然后调用RDD的checkpoint的方法即可。但是checkpoint会切断血缘关系,生成新的RDD
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




