spark:清空程序运行时的所有(cache)缓存块

spark:清空程序运行时的所有(cache)缓存块

为啥要用到缓存

  在我们编写spark程序的时候,经常会用到action算子,当程序执行到action操作的代码时,开始真正地执行计算,这个时候耗时比较长。然而,当我们程序里面的action算子计算出来的需要被多次使用的时候,为了不在让程序重复再次计算。将这个action算子计算的结果进行persist或者cache(缓存)的操作,可以节省程序的运行时间。

出现的问题

  如果当程序里面做了很多缓存(persist 或者cache)的操作。整个集群的可用内存将会减少,可能会影响后续的代码执行(可能会因为内存不足,而报错)。

如何清除缓存
  1. 如果编写代码思路比较清晰的话,可以很清楚地记得哪个rdd或者dataSet进行了缓存的操作。可以直接调用 unpersist操作
    一个简单的例子如下:
//  假设注册了一张teacher表,dataFrame读取了 这张表
val data:DataFrame = spark.sql("SELECT * FROM teacher")
// 程序开始进行缓存cache(默认存储到内存当中),然后调用action算子触发程序执行
data.cache.show()
// 调用下方代码,可以清除掉刚才得到的缓存
data.unpersist()
  1. 如果思路不够清晰,或者程序比较长,写着写着就忘记了哪些数据进行缓存过了,这里提供一个清除所有缓存在spark环境里面的数据的操作:
    如下所示:(写这篇水文的目的
    val ds: collection.Map[Int, RDD[_]] = spark.sparkContext.getPersistentRDDs
    ds.foreach(x => {
      x._2.unpersist()
    })

执行的原理大致如下:
spark.sparkContext的下文中通过调用getPersistentRDDs的方法,可以得到缓存区域里面所有的数据缓存信息。然后返回一个集合,通过循环遍历这个集合,调用unpersist的方法,便可以将这个缓冲区域里面的所有数据清空!

总结

&emsp&ems;如果上述的内容有什么错误,或者是建议,又或者有什么更好的操作,请大爷们辛苦辛苦,评论区里帮我指正一下。谢谢~ mua~

发布了56 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/OldDirverHelpMe/article/details/104636204
今日推荐