有时您需要多次处理RDD,而不是一次操作。这带来了一个主要问题...... Spark 确实总是会在磁盘上找到数据。但是你需要处理性能问题。
RDD带有cache()和persist()方法,其中
cache() = persist(StorageLevel.MEMORY_ONLY).将帮助我们将RDD保存到内存中,详细了解其他选项。
让我们用简单的例子来测试它:
import org.apache.spark.storage.StorageLevel._; |
(download the yahoo_stocks.csv from https://github.com/dmatrix/examples/blob/master/spark/hdp/data/yahoo_stocks.csv)
现在让我告诉你发生了什么:
如果没有持久化(MEMORY_ONLY)调用,首先调用fileRDD.count()将触发从磁盘获取数据和计数行。fileRDD.count()的第二次命中意味着同样的事情。
通过持久(MEMORY_ONLY)调用,我们告诉Spark:
做懒加载:
- 读取文件
- 将RDD缓存到内存中
现在第二次调用fileRDD.count()应该比第一次调用快得多,因为它不会使用磁盘作为计算内容的源(当然,如果RDD适合内存)
让我们证明一下(运行):
park-shell -i test14.scala |
第一次 |
18/02/17 22:21:10 INFO DAGScheduler: Job 0 finished: count at <console>:33, |
第二次 fileRDD.count() 运行输出
18/02/17 22:21:11 INFO DAGScheduler: Job 1 finished: count at <console>:33, |
看看第二个RDD动作的巨大加速。