spark的rdd对应的是一个弹性的分布式的数据集,对应的数据是只读的数据。
在这种情况下,充分的使用缓存是能够很好的提高性能的。那么应该如何操作了?
spark会将代码对应的解析成为多个dag的有向无环图的操作的。下面是解析之后的一个简单的示意图的
从图中可以看到,对应的是存在如下的问题的。每一个DAG对应的都是从数据源读取数据的,这样的操作本身来说是存在问题的。数据本身其实只是需要读取一次就可以了,后续的数据都是需要基于当前的数据来执行操作的,这个读取的数据是可以缓存的。
1.所以,可以在第一步读取数据的数据设置缓存的。spark可以设置缓存级别的。
val wordDataset: Dataset[String] = spark.read.textFile(“spark-test/word.txt”).persist(StorageLevel.MEMORY_AND_DISK_SER_2) 可以使用带有副本的缓存来提高数据的安全性保证的。
2.spark的rdd本身是只读的,非常适合缓存的使用场景的。下面是一个设想的,我们可以充分的发挥出来对应的rdd的特性的,充分的使用缓存来加速相关的操作实现的。
3.选在在合适的时机来释放对应的缓存的。不要一直将整个的缓存保留到从开始到结束的整个的过程中的,动态的管理和释放缓存数据。减少缓存的承受压力的。
4.还存在另外的一个问题,比较简单的spark任务和少量数据的话,spark任务的恢复是简单的,但是大量的数据的话,spark出现了异常的话,需要怎么恢复?借助于上面的缓存是存在很大的局限的,我们必须要使用到一种新的技术来操作实现的,比如spark最新优化的点,checkpoint来完成相关的就近恢复的操作的,而不需要恢复从起点开始的所有的rdd的数据的。这个是一个很好的机制的。从指定时间点来恢复得到rdd数据,然后继续接受后续的新的数据组成的rdd参与计算操作的。