【问题标题】:How to judge if a RDD will load into ram ?如何判断一个RDD是否会加载到ram中?
【发布时间】:2015-03-06 15:56:11
【问题描述】:

http://www.eecs.berkeley.edu/Pubs/TechRpts/2014/EECS-2014-12.pdf 的示例如下。

lines = spark.textFile("hdfs://...")
errors = lines.filter(_.startsWith("ERROR"))
errors.persist()

论文系统:“请注意,基本 RDD,行,不会加载到 RAM 中。这是可取的,因为 错误消息可能只是数据的一小部分(小到可以放入 记忆)

我的问题是如何判断一个 RDD 是否会加载到 ram 中?

【问题讨论】:

    标签: apache-spark rdd


    【解决方案1】:

    你的问题不正确。如果您告诉引擎这样做,RDD 将被加载到 RAM 中,引擎不会抱怨您的代码。让它只需用cache()persist() 将RDD 标记为要缓存,然后对其调用操作 - 它会被缓存。

    正确的是“如何判断是否缓存RDD?”。如果出现以下情况,则应缓存 RDD:

    1. 您计划在此数据之上运行一系列操作
    2. 重新计算此数据的成本很高。这可能是密集计算、连接等的结果。

    如果重新计算数据真的很昂贵,您可能会考虑不仅将其持久化在内存中,还可以使用 MEMORY_AND_DISK 持久化级别 - 即使您没有足够的 RAM,也可以这样,而不是驱逐 RDD 分区并稍后在引擎中重新计算它们将它们放在硬盘上。在这种情况下,您也可以考虑将数据持久化到存储中,例如 saveAsSequenceFile()

    在这种特定情况下lines RDD 没有被缓存,因为它只使用一次,它很大并且可以很容易地从存储中重新读取。虽然errors RDD 是计算一个且很小的,并且将来他们计划在其上运行一系列操作,所以最好缓存它

    【讨论】:

    • 正如您所说,“在这种特定情况下,RDD 行没有被缓存,因为它只使用一次,它很大并且可以很容易地从存储中重新读取。虽然错误 RDD 是计算一个而且很小,将来他们计划在其上运行一系列动作,所以缓存它是件好事”,spark 的逻辑是什么知道行不缓存而错误应该缓存??
    • Spark 没有这种逻辑。如果添加第二行lines.cache(),那么它将被缓存。如果你不添加这个,它不会被缓存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多