问:
如果我的中间输出RDD 数据大小是2G,但只有1G 的空闲内存,此时会怎么样?
答:
这个问题其实问的 RDD 缓存机制。我们可以调用 persist()
或 cache()
方法来缓存 RDD。Spark 的缓存是具有容错性的,如果 RDD 的任意 partition 丢失,将会自动重算。
依据你设置的 RDD 缓存的 Storage level 的不同,产生的行为也是不同的,如下:
- MEMORY_ONLY: 调用 cache 和 persist 的默认值,会尽量多的将你的中间输出 RDD 的 partitions 放到内存,其余放不下的 partition 会在使用到的时候进行重算
- MEMORY_AND_DISK: 会尽量多的将你的中间输出 RDD 的 partitions 放到内存,其余放不下的 partition 会放到磁盘
- DISK_ONLY: 将所有 partitions 放到磁盘
还有一些 Storage level 无非是序列化或放两份,就不一一展开了。至于缓存 RDD 时需要用哪种 storage level,需要视具体情况而定,有些情况下重算比从磁盘加载还快;有些情况下,为了节省空间可能需要序列化等等
更多不容错过的 Spark Q&A: Spark Q&A 目录