首页 > 其他分享 >Spark缓存优化:清除全部缓存

Spark缓存优化:清除全部缓存

时间:2024-07-17 10:56:51浏览次数:5  
标签:缓存 val 清除 算子 RDD sparkSession Spark

Spark算子是分为行动子算子和转换算子的,只有遇到行动算子,计算任务才会生成一个Job任务,当算子行动算子多起来,并且交织复杂的时候,Spark去追溯数据血缘就会比较耗时了,通常我们都会直接通过persist算子存储中间的计算结果,减少数据的重复计算。

// 存储中间计算结果,避免Spark重复计算
val frame_model_transformation: DataFrame = model_transformation(spark, jdbcDF, tmp_table, connection)
frame_model_transformation.persist(StorageLevel.MEMORY_AND_DISK)

// 想释放这些缓存时可以通过unpersist算计进行释放
frame_model_transformation.unpersist()
当我们persist算子用多了,或者需要循环处理一些数据时,单个调用unpersist又不太现实(麻烦)

方式一:通过SparkContext
Spark官方是有提供getPersistentRDDs算子去追踪每一个缓存到内存中的RDD的

  • 看看源码
/**
* Returns an immutable map of RDDs that have marked themselves as persistent via cache() call.
*
* @note This does not necessarily mean the caching or computation was successful.
*/
def getPersistentRDDs: Map[Int, RDD[_]] = persistentRdds.toMap




// Keeps track of all persisted RDDs
private[spark] val persistentRdds = {
  val map: ConcurrentMap[Int, RDD[_]] = new MapMaker().weakValues().makeMap[Int, RDD[_]]()
  map.asScala
}

可以看到,返回的是一个Map集合,我们只要循环调用unpersist算子就能实现清除当前状态下的全部缓存了。

val allPersistent: collection.Map[Int, RDD[_]] = spark.sparkContext.getPersistentRDDs
allPersistent.foreach((map: (Int, RDD[_])) => {
  map._2.unpersist()
})

方式二:通过SparkSession

//构建sparkSession环境
var builder: SparkSession.Builder = SparkSession.builder()
if (isWindow) builder = builder.master("local[8]")

val sparkSession = builder
  .appName("ProcessDataDetail")
  .getOrCreate()

sparkSession.sparkContext.setLogLevel("WARN")

//参数格式: 07 2022-04-01 2022-04-05
val Array(flagCode, startTime, endTime) = args

//获取日期列表
val dateArr = getDayList(startTime, endTime, Calendar.DAY_OF_YEAR)

dateArr.foreach(dateStr => {

  loadBaseData(sparkSession, flagCode, dateStr)

  sparkSession.catalog.clearCache()

})

sparkSession.stop()

标签:缓存,val,清除,算子,RDD,sparkSession,Spark
From: https://www.cnblogs.com/Mr-Sponge/p/18306860

相关文章

  • spark sql的知识碎片
    sparksqlApacheSparkSQL是ApacheSpark中用于结构化数据处理的模块。它允许在大规模数据集上运行SQL查询,提供数据查询、分析和转换的能力。SparkSQL与Spark核心集成,允许你将SQL查询与其他Spark函数结合使用。主要特点:DataFrame和Dataset:DataFrame是一......
  • 详解Spring循环依赖,以及spring如何通过三级缓存解决循环依赖问题
     首先为了方便理解后面的图解,首先要了解spring的bean的生命周期,下图是sping的bean的生命周期流程图。图解:就是在初始化实例化A时,发现A里面依赖了B,所有看B是否在容器中存在,结果B不存在又去实例化B,B中又依赖与A,但是也不存在,就这样陷入一个死循环就是循环依赖。图解:实......
  • 快速上手 Caffeine:Java 缓存库初学者指南
    一、背景简介:Caffeine是一个高性能的Java缓存库,旨在为现代应用程序提供快速、高效的缓存解决方案。它由GoogleGuavaCache的创始人之一开发,具备基于时间的过期、基于大小的回收、异步加载、统计信息等多种特性。Caffeine的性能有多么强大呢?以下是官方给出的基准测试......
  • 使用Java和Redis构建高性能的缓存系统
    使用Java和Redis构建高性能的缓存系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代应用程序中,高性能的缓存系统对于提升系统性能和响应速度至关重要。本文将详细介绍如何利用Java和Redis构建一个高效的缓存系统,以及实现过程中的关键技术和注意事......
  • Spark _Exam_ 20240715
    SparkExam20240715ConclusionSB出题人出DP场,T1靠小常数通过不给提示干死选手,T2出题人认为思维难度低代码5KB,NOIP场的T3放黑题,T4又是区间DP\(\mathcalO(n^6)=117649000000\)竟然能够通过?你代码常数真的小!好的喷完了。这种场的后果就是,平均分50,最高90,最低0实际上如......
  • 常见的缓存问题
    常见缓存问题:1.缓存穿透2.缓存击穿3.缓存雪崩缓存穿透缓存穿透:是指客户端请求的数据在缓存中都不存在,这样缓存永远也不会生效,这些请求都会打到数据库。缓存穿透常见的解决方案有两种:缓存空对象优点:实现简单,维护方便缺点:额外的内存消耗,可能造成短期不一致。缓存穿透的......
  • MySql 创建完表后,进行主键自增的设置、文件上传之后,保存到数据库里(拿到文件名,文件大小
    20240715一、MySql创建完表后,进行主键自增的设置二、文件上传之后,保存到数据库里(拿到文件名,文件大小等文件信息)三、redis缓存更新的模式四、mybatisPlus一、MySql创建完表后,进行主键自增的设置第一种方式:altertable表名changeididintauto_increment;......
  • Memcached:高性能内存缓存系统详解及实战
    引言在高并发的Web应用中,数据库往往成为性能瓶颈。为了提高数据读取速度和减少数据库负载,引入缓存机制变得至关重要。Memcached正是这样一款高性能、分布式内存对象缓存系统,它通过在内存中缓存数据来加速动态Web应用,从而极大地改善用户体验。本文将深入探讨Memcached的工作原......
  • Spark Core的知识碎片
    spark初识什么是spark?ApacheSpark是一个开源集群计算系统,旨在快速进行数据分析。既好写运行时的也快BDASBDAS是由加利福尼亚大学伯克利分校的AMPLab开发的一套开源大数据分析工具集。其目的是为数据分析和机器学习提供高效、易用的工具。SparkSpark是BDAS的核心......
  • 一个pyspark 开发练习实例
    实例功能说明:1,使用pyspark开发了一个数据ETL,分析的练习项目。2,实例功能为,从mysql读取表数据,按照一定规则进行ETL。以csv格式保存到hadoop.并特别的使用了Spark提供的3种API进行统计分析,分别是RDD算子,Dataframe算子,SQL编程算子,进行了数量统计,3,组件版本:pyspark:3.3.1......