我的印象是RDD的执行和缓存都是惰性的:也就是说,如果缓存了RDD,并且仅使用了一部分,则缓存机制将仅缓存该部分,而另一部分将在-需求。
不幸的是,以下实验似乎表明并非如此:
val acc = new LongAccumulator()
TestSC.register(acc)
val rdd = TestSC.parallelize(1 to 100, 16).map { v =>
acc add 1
v
}
rdd.persist()
val sliced = rdd
.mapPartitions { itr =>
itr.slice(0, 2)
}
sliced.count()
assert(acc.value == 32)
运行它会产生以下异常:
100 did not equal 32
ScalaTestFailureLocation:
Expected :32
Actual :100
结果是整个RDD都是计算出来的,而不是每个分区的前2个项目。在某些情况下(例如,当您需要确定RDD是否快速为空时),这种方法的效率非常低。理想情况下,缓存管理器应允许对缓存缓冲区进行增量写入和随机访问,此功能是否存在?如果没有,我应该怎么做才能实现? (最好使用现有的内存和磁盘缓存机制)
非常感谢您的意见
编号
测试没有任何证明。 count操作导致代码,阶段,任务等融合。
persist
是该RDD的所有分区的RDD,用于从同一公共RDD阶段开始进行多个处理的多个动作或单个动作。它看起来并不像您陈述的那样如何进行优化。
实际上,没有理由在此处保留/缓存,但这是一项测试。