ContextCleaner是一个Spark服务,负责在应用程序范围内清除 shufflesRDDsbroadcastsaccumulatorscheckpointed RDDs,目的是减少长时间运行的数据密集型Spark应用程序的内存需求。

ContextCleaner在驱动程序上运行。 它会在SparkContext启动时被创建并立即启动(并且默认情况下spark.cleaner.referenceTracking Spark属性已启用),生命周期:当SparkContext停止时,它停止。

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-service-contextcleaner.html

创建ContextCleaner实例

ContextCleaner需要一个SparkContext

开始ContextCleaner —  start方法

start(): Unit

start开始清洁线程,并执行一个操作,以System.gc()每个spark.cleaner.periodicGC.interval间隔请求JVM垃圾收集器(使用)。

注意
请求JVM GC的操作是在periodicGCService执行程序服务上安排的。

periodicGCService 单线程执行器服务

periodicGCService是一个内部单线程执行程序服务,名称为context-cleaner-periodic-gc以请求JVM垃圾收集器。

注意

在每个spark.cleaner.periodicGC.interval间隔内调度对JVM GC的请求。

定期运行在启动时ContextCleaner开始,在停止时ContextCleaner停止

注册ShuffleDependency清理—  registerShuffleForCleanup方法

registerShuffleForCleanup(shuffleDependency: ShuffleDependency[_, _, _]): Unit

registerShuffleForCleanup注册ShuffleDependency进行清理。

在内部,registerShuffleForCleanup只需为input 执行registerForCleanupShuffleDependency

注意
registerShuffleForCleanupShuffleDependency创建时专门使用。

注册对象参考以进行清理—  registerForCleanup内部方法

registerForCleanup(objectForCleanup: AnyRef, task: CleanupTask): Unit

在内部,registerForCleanup将输入添加objectForCleanupreferenceBuffer内部队列

注意
尽管AnyRef输入objectForCleanup的类型最广泛,但该类型实际上CleanupTaskWeakReference是自定义Java的java.lang.ref.WeakReference

MapOutputTrackerMaster和中删除随机播放块BlockManagerMaster —  doCleanupShuffle方法

doCleanupShuffle(shuffleId: Int, blocking: Boolean): Unit

doCleanupShuffle执行洗牌清除,这是从当前MapOutputTrackerMasterBlockManagerMaster中删除洗牌。doCleanupShuffle还通知CleanerListeners

在内部,当执行时,您应该在日志中看到以下DEBUG消息:

DEBUG Cleaning shuffle [id]
注意
doCleanupShuffle用于SparkEnv访问当前MapOutputTracker
注意
doCleanupShuffle用于SparkEnv访问当前BlockManagerMaster

doCleanupShuffle通知所有注册的CleanerListener侦听器(来自listeners内部队列输入shuffleId已清除

最后,您应该在日志中看到以下调试消息:

DEBUG Cleaned shuffle [id]

如果发生任何异常,您应该在日志和异常本身中看到以下错误消息。

ERROR Error cleaning shuffle [id]
注意
doCleanupShuffleContextCleaner清理随机引用和(而有趣的)同时拟合ALSModel(在Spark MLlib中)时执行。

设定值

表2. Spark属性
Spark Property 默认值 描述

spark.cleaner.periodicGC.interval

30min

控制触发垃圾回收的频率。

spark.cleaner.referenceTracking

true

控制是否在初始化 a 时ContextCleaner创建 a 。SparkContext

spark.cleaner.referenceTracking.blocking

true

控制清洗线程是否应阻止执行清除任务(除了shuffle以外,后者由spark.cleaner.referenceTracking.blocking.shuffle Spark属性控制)。

这是SPARK-3015true的解决方法,连续快速删除广播会导致Akka超时

spark.cleaner.referenceTracking.blocking.shuffle

false

控制清洗线程是否应在随机清洗任务上阻塞。

清理混洗时,这是ContextCleaner的SPARK-3139 Akka超时的false一种解决方法。

spark.cleaner.referenceTracking.cleanCheckpoints

false

控制如果引用超出范围,是否清理检查点文件。

ContextCleaner ——Spark 应用程序的垃圾回收器的更多相关文章

  1. [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

    目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...

  2. JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接

    原文 https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ 再插一个关于线程和进程上下文,待判断 http://b ...

  3. C#.Net GC(garbage Collector) 垃圾回收器

    以前一直以为gc的原理很简单,也就是分代处理堆数据,直到我的膝盖中了一箭(好吧 直到有天汪涛和我说他面试携程的面试题 关于服务器和 工作站gc 的区别)其实我当时尚不知道 工作站和服务器有什么区别更不 ...

  4. Java垃圾回收算法和垃圾回收器

    基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记- ...

  5. Java GC系列(3):垃圾回收器种类

    本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在 ...

  6. JVM学习总结三——垃圾回收器

    整两天再看调优分析的部分,发现实际运行环境下,还是要考虑配置垃圾回收器,所以这里就加一小章介绍一下. 首先来看一下HotSpot所支持回收期的关系图: 图中可以看到一共有7中垃圾回收器,以中间绿线为界 ...

  7. 面试之C#--垃圾回收器什么时候回收?

    每个对象只有在该对象不存在任何引用才会被垃圾回收起回收. 可以调用静态方法System.GC.Collect()垃圾回收器,但是不建议这么做: 用using语句可以有效的自动释放掉资源. 实在没有办法 ...

  8. 垃圾回收器 Dispose 和 Finalize 的互补作用

    假如我们程序有两个窗口 Form1.Form2; 当我们关闭一个窗口的时候,会发出一个 终止响应,并将该窗口对象送入终止队列,公共语言运行库的垃圾回收器跟踪着这个对象的生存期,此时就会调用此对象的基类 ...

  9. [译]Java垃圾回收器的类型

    说明:这篇文章来翻译来自于Javapapers 的Types of Java Garbage Collectors 在这部分的教程中我们将讲到可使用的四种不同类型的Java垃圾回收器.垃圾回收是Jav ...

随机推荐

  1. Android加载大图到内存如何避免内存溢出?

    加载大图怎么避免溢出实际做法就是对图像进行压缩,也是比较老的话题了,在最初做android时是经常会遇到的问题,而如今对于图片加载这一块都已经有很成熟稳定的三方库来弄它了,所以图片加载过大内存溢出的比 ...

  2. MySQL进阶12-- 数据类型介绍: 数值型/字符型/日期型-- 正负溢出保护/枚举型/set型/时间戳

    /*进阶12 SQL 数据类型介绍 数值型: 整数: Tinyint(1b) < mediumint(3b)<smallint(2b) <int(4b) <bigint(8b) ...

  3. 一、冒泡排序Bubble sort

    https://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html#3824357 #include<iostream> #inclu ...

  4. Python 高级(二)

    多继承以及MRO顺序 1. 单独调用父类的方法 # coding=utf-8 print("******多继承使用类名.__init__ 发生的状态******") class P ...

  5. 2019牛客多校B Beauty Values——思维题

    题目 求所有子区间中不同元素之和. 分析 枚举相邻的相同数字形成的区间,计算它是哪些区间的子区间,每次有-1的贡献,将其从总贡献中减去. #include<bits/stdc++.h> u ...

  6. 洛谷P2396 yyy loves Maths VII【状压dp】

    题目:https://www.luogu.org/problemnew/show/P2396 题意:有n个数,每次选择一个表示走$a[i]$步,每个数只能选一次. 最多有两个厄运数字,如果走到了厄运数 ...

  7. 61、springmvc-异步请求-返回DeferredResult

    61.springmvc-异步请求-返回DeferredResult 61.1 DeferredResult 官方文案 61.2 使用 /** * 创建订单加入 订单处理队列 * * @return ...

  8. MongoDB journal 与 oplog,究竟谁先写入?

    MongoDB journal 与 oplog,谁先写入?最近经常被人问到,本文主要科普一下 MongoDB 里 oplog 以及 journal 这两个概念. journal journal 是 M ...

  9. OSS的简单使用

    OSS简介 Object Storage Service,简称 OSS,是阿里云提供的海量.安全.低成本.高可靠的云存储服务. 它具有与平台无关的RESTful API接口,能够提供99.999999 ...

  10. 【算法】变邻域搜索算法(Variable Neighborhood Search,VNS)超详细一看就懂的解析

    更多精彩尽在微信公众号[程序猿声] 变邻域搜索算法(Variable Neighborhood Search,VNS)一看就懂的解析 00 目录 局部搜索再次科普 变邻域搜索 造轮子写代码 01 局部 ...