所以我正在kafka流中的同一个rdd上执行多个操作。是否缓存RDD会提高性能?
答案 0 :(得分:4)
在同一dstream上运行多个操作时,cache
将大大提高性能。这可以在Spark UI上观察到:
如果不使用cache
,dstream上的每次迭代都会花费相同的时间,因此在每个批处理间隔中处理数据的总时间将与数据上的迭代次数呈线性关系:
当使用cache
时,第一次执行RDD上的转换管道时,RDD将被缓存,并且该RDD上的每个后续迭代将只花费一小部分时间来执行。
(在此屏幕截图中,通过减少分区数量,同一作业的执行时间从3秒进一步减少到0.4秒)
我建议您使用dstream.cache
或dstream.foreachRDD
来直接访问基础RDD并应用dstream.transform
操作,而不是使用persist
。我们在迭代代码周围使用匹配persist
和unpersist
来尽快清理内存:
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