火花串中的缓存是否会提高性能

时间:2015-05-15 07:27:59

标签: apache-spark spark-streaming

所以我正在kafka流中的同一个rdd上执行多个操作。是否缓存RDD会提高性能?

2 个答案:

答案 0 :(得分:4)

在同一dstream上运行多个操作时,cache将大大提高性能。这可以在Spark UI上观察到:

如果不使用cache,dstream上的每次迭代都会花费相同的时间,因此在每个批处理间隔中处理数据的总时间将与数据上的迭代次数呈线性关系: Spark Streaming no cache

当使用cache时,第一次执行RDD上的转换管道时,RDD将被缓存,并且该RDD上的每个后续迭代将只花费一小部分时间来执行。

(在此屏幕截图中,通过减少分区数量,同一作业的执行时间从3秒进一步减少到0.4秒)  Spark Streaming with cache

我建议您使用dstream.cachedstream.foreachRDD来直接访问基础RDD并应用dstream.transform操作,而不是使用persist。我们在迭代代码周围使用匹配persistunpersist来尽快清理内存:

dstream.foreachRDD{rdd =>
  rdd.cache()
  col.foreach{id => rdd.filter(elem => elem.id == id).map(...).saveAs...}
  rdd.unpersist(true)
}  

否则,需要等待spark.cleaner.ttl上配置的时间来清除内存。

请注意,spark.cleaner.ttl的默认值是无限的,不建议用于生产24x7 Spark Streaming作业。

答案 1 :(得分:1)

  

Spark还支持将数据集提取到群集范围内的内存中   缓存。这在重复访问数据时非常有用,例如   查询小“热”数据集或运行迭代时   像PageRank这样的算法。

https://spark.apache.org/docs/latest/quick-start.html#caching