相同点
这这三个函数是出于不同情况下的容灾和性能考虑而出现的三个函数。他们的主要作用就是将中间结果缓存到存储介质中以便一定程度的对程序进行优化。
但是如果不明白他们的区别与内涵还是很容易会用不好的。
欢迎关注公众号:大数据报文
persist
persist还是它们三个之中变换最多的函数,所以先从persist讲起。
persist提供了很多常量参数作为存储等级: useDisk, useMemory, useOfHeap, deserialized and replication。通过传入不通过的参数,persist会对中间结果做不同的存储操作,下面这张图是persist用到的一些参数。
- useDisk。主要指DISK_ONLY/ MEMORY_AND_DISK等,默认情况下如果持久化到内存存储不下了,就会将其丢掉,如果需要使用就重新计算,如果使用了这个等级,当内存存储不下的时候就会把写不下的数据刷写到磁盘。但是磁盘的I/O是很慢的,因此如果不是计算成本真的非常高,一般不会使用这个等级。
- useMemory。主要指
MEMORY_ONLY
/MEMORY_AND_DISK
等。有些表示直接存储到内存,有些表示可以刷新到磁盘。还是那句话,除非重算成本很高或者网络I/O很慢,否则是不会使用这种方式的 - useOfHeap.主要指
OFF_HEAP
。这个选项可以将数据持久化到JVM以外的系统,像Tachyon,可以提高效率。Tachyon是基于内存的分布式系统,将持久化数据存储到这里可以提高效率。 - deserialized。存储等级有`_SER`
后缀的,像
MEMORY_ONLY_SER`可以将RDD序列化以节省内存空间。 - replication。默认情况下持久化都会存一份数据在内存中,但是上图中,后缀为
_2_
的表示共有两个副本。 - 持久话的对象并不会自动清除,除非内存不够用了。所以当不再使用了的时候需要使用
unpersist
释放
cache
cache()等价于persist()没有参数的情况。即persist可以完全替代cache,但是反之不行。
checkpoint
- checkpoint可以缓存到外部系统中,persist只能在本spark应用中起作用,如果想用到其他Spark应用,需要使用checkpoint
- checkpoint通常是为了容灾,如果为了提升性能的话,基本是不会考虑checkpoint的,因为它涉及磁盘的I/O,磁盘I/O是非常慢的,因此这种情况即使重算可能都会比checkpoint快。
- 设置checkpoint目录,设置以后,运行spark程序会在hdfs上创建目录。
val sc = new SparkContext(conf)
sc.setCheckpointDir("hdfs://master:8020/spark/yl/checkpointDir")
总结
- 如果Job运行很慢的话,选择使用persist,如果Job经常失败的话,选择使用checkpoint。
- persist并没有完全缓存到外部系统的选项,它只有当内存存储不开才可能将剩余的数据缓存到外部系统。
- persist可以完全替代cache。