【问题标题】:Spark cache and unpersist orderSpark缓存和非持久化订单
【发布时间】:2018-10-29 06:47:32
【问题描述】:

我找到了类似的话题:Understanding Spark's caching

但这仍然不是我的问题。让我们考虑下面的sn-ps代码: 选项A:

rdd1 = sc.textFile()
rdd1.cache()
rdd2 = rdd1.map().partionBy()
rdd3 = rdd1.reduceBy().map()
rdd2.cache()
rdd1.unpersist()
data = rdd2.collect()

选项B:

rdd1 = sc.textFile()
rdd1.cache()
rdd2 = rdd1.map().partionBy()
rdd3 = rdd1.reduceBy().map()
rdd2.cache()
data = rdd2.collect()
rdd1.unpersist()

我应该选择哪个选项来防止重新计算rdd1?乍一看,optionA 看起来不错,但考虑到 spark 中的操作是懒惰的,我认为在对 rdd2 执行操作之前执行 unpersist 可能会导致需要再次重新计算 rdd1。另一方面,调用unpersist,如在选项B 中可能导致没有可用空间来缓存rdd2。请帮我选择我应该使用哪个选项。

【问题讨论】:

    标签: python apache-spark hadoop pyspark bigdata


    【解决方案1】:

    严格来说,这两个选项都不正确。

    正如您所怀疑的,第一个在实际收集数据之前删除了缓存标志。

    第二个实际上触发了缓存,但是由于您从未评估rdd3,因此缓存的rdd1 只是持久化,然后就被丢弃了。删除 rdd1.cache() 实际上应该会提高性能。此外,rdd2.cache() 似乎已过时,因为结果从未被重用。

    如果textFile 从昂贵的存储中加载数据,您可以像这样构建代码:

    rdd1 = sc.textFile(...)
    rdd1.cache()
    
    rdd2 = rdd1.map(...).partionBy(...)
    rdd3 = rdd1.reduceByKey(...).map(...)
    
    rdd2.someAction()
    rdd3.someAction()
    
    rdd1.unpersist()
    

    其中someAction 是您要对特定RDD 执行的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2016-07-17
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多