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

How to judge if a RDD will load into ram ?

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中?

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

正确的是"how to judge whether to cache RDD or not?"。如果出现以下情况,则应缓存 RDD:

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

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

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