在Apache Spark中,我可以增量缓存RDD分区

问题描述 投票:0回答:1

我的印象是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是否快速为空时),这种方法的效率非常低。理想情况下,缓存管理器应允许对缓存缓冲区进行增量写入和随机访问,此功能是否存在?如果没有,我应该怎么做才能实现? (最好使用现有的内存和磁盘缓存机制)

非常感谢您的意见

apache-spark rdd persistent-storage
1个回答
0
投票

编号

测试没有任何证明。 count操作导致代码,阶段,任务等融合。

persist是该RDD的所有分区的RDD,用于从同一公共RDD阶段开始进行多个处理的多个动作或单个动作。它看起来并不像您陈述的那样如何进行优化。

实际上,没有理由在此处保留/缓存,但这是一项测试。

© www.soinside.com 2019 - 2024. All rights reserved.