分享一个 hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题
最近在针对某系统进行性能优化时,发现了一个hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题,该问题具有普适性,故特地拿出来跟大家分享下。
1 问题描述
-
在微服务中,我们普遍会使用各种数据库连接池技术以加快获取数据库连接并执行数据查询的速度,这本质是一种空间换时间的有效的性能优化的思路。
-
推而广之,在大数据场景下通过JDBC访问HiveServer2并提交数据查询SQL语句时,也很容易想到同样使用数据库连接池技术以加快作业速度。
-
但是相比普通的RDBMS,Hive的JDBC连接更重,以HIVE ON SPARK模式运行作业时更是如此,因为当连接底层需要执行SQL时,HS2会向YARN申请CONTAINER资源,然后启动分布式的SPARK ON YARN集群并分布式地执行编译好的SQL,当该SQL执行完毕后并不会立即释放SAPRK ON YANR资源,而是会等待一段时间以复用这些 SPARK ON YARN资源执行客户端通过该连接提交的新的SQL,只有当该JDBC连接关闭时,或者达到了配置的超时时间而客户端仍没有提交新的SQL时,才会彻底释放这些 SPARK ON YARN 资源。
-
当业务代码使用了数据库连接池技术时,由于其关闭JDBC连接时本质上只是将连接归还给了连接池而没有真是关闭底层的JDBC连接,所以连接背后的 SPARK ON YARN资源并不会被及时释放也就是造成了资源泄露,此时其它作业向YARN申请资源时就需要排队等待,从而影响了其它作业的执行。
-
本案列中该系统使用了HikariCP 数据库连接池,且没有配置数据库连接的空闲超时时长(idletimeout),真正生效的空闲超时时长是Hikari源码层面配置的默认值10分钟,所以每个连接底层的SQL作业执行完毕后都需要10分钟才真正释放了背后的SPARK ON YARN资源,从而造成了其它作业对YANR资源的排队和等待。(话说你占着资源却不使用,不就是站着那个啥不干那个啥么_)

2 问题解决方案
针对该问题进行分析,解决方案有多个,如下分别进行描述。
2.1 解决方案1
该方案的思路是彻底摒弃数据库连接池,因为一般而言,大数据作业擅长的是大数据量和复杂逻辑的处理,其作业执行速大都在分钟级别以上,数据库连接池节省的1到2秒钟几乎微不足道,所以考虑到这些使用上的弊端干脆弃之不用。
2.2 解决方案2
- 该方案的思路是配置HS2 背后SPARK ON YARN集群的SESSION超时时间,从而更快地释放 SPARK ON YARN 资源。
- 但是通过测试并查看源码发现该超时时间的最小值是30分钟不能设置更小值,所以起不了效果。
- 相关参数有:
- hive.spark.session.timeout:默认值30m最小值30m;
- hive.spark.session.timeout.period:默认值60s最小值60s;

2.3 解决方案3
- 该方案的思路是配置Spark on yarn的动态资源分配机制,从而使得spark on yarn集群在没有SQL作业需要执行时并不会占用太多YARN资源。
- 但是由于SPARK 集群至少需要1个CONTAINER以执行DRIVER,所以该方案只能缓解问题不能彻底解决问题。
- 相关参数有:
- spark.dynamicAllocation.enabled,需要配置为true;
- spark.dynamicAllocation.minExecutors:默认为1可以进一步调整为0;
2.4 解决方案4
- 该方案的思路是配置客户端和HS2 之间的SESSION超时时间,从而让HS2主动断开客户端的JDBC连接并释放背后的Spark ON YARN资源。
- 经测试该方案可行,但修改相关参数需要重启hs2服务进程且该参数的修改会影响所有用户作业,一般集群管理员可能会有异议;
- 相关参数有:
- hive.server2.session.check.interval:不同版本默认值不同,比如15m/6h;
- hive.server2.idle.session.timeout:不同版本默认值不同,比如4h/12h/7d;
- hive.server2.idle.operation.timeout:不同版本默认值不同,比如2h/6h;
- hive.server2.idle.session.check.operation:true

如下日志可见,session timeout 被关闭后,spark session 也别清理了:

2.5 解决方案5
- 该方案的思路是调整数据库连接池的相关参数尤其是最小连接数和空闲超时时间,从而更快地更积极地主动关闭空闲的数据库连接,比如将IdleTimeout配置为30秒,将最小连接数MinimumIdle配置为0,则SQL作业运行完毕30秒后就会关闭所有连接,也就会释放所有SPARK ON YARN资源,从而解决了资源泄露问题;
- 相关hikariConfig参数有:
- MinimumIdle:最小连接数;
- MaximumPoolSize:最大连接数;
- IdleTimeout:空闲超时时间;
- ConnectionTimeout:获取连接超时时间;
- ValidationTimeout:连接有效行验证超时时间;
- KeepaliveTime:空闲连接保活间隔时间;
- MaxLifetime:连接最大时间;
- 示例代码如下:

3 知识点总结
- 大数据作业擅长的是大数据量和复杂逻辑的处理,其作业执行速大都在分钟级别以上,数据库连接池节省的1到2秒钟几乎微不足道,所以大数据作业一般不使用数据库连接池;
- 当使用数据库连接池时,由于相比普通的RDBMS,Hive的JDBC连接更重,以 HIVE ON SPARK 模式运行作业时更是如此,所以一定要及时释放JDBC连接从而及时释放背后的 YARN资源,从而避免资源泄露问题引起其它作业长时间等待YARN资源;
- 使用数据库连接池时,为及时释放JDBC连接从而及时释放背后的YARN资源,一般可以调整数据库连接池的相关参数,尤其是最小连接数和空闲超时时间,从而更快地更积极地主动关闭空闲的数据库连接,比如将IdleTimeout配置为30秒,将最小连接数MinimumIdle配置为0,则SQL作业运行完毕30秒后就会关闭所有连接,也就会释放所有SPARK ON YARN资源,从而解决了资源泄露问题。
相关文章:
分享一个 hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题
最近在针对某系统进行性能优化时,发现了一个hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题,该问题具有普适性,故特地拿出来跟大家分享下。 1 问题描述 在微服务中,我们普遍会使用各种数据库连接池技术以加快…...
MySQL 行锁
行锁 : 对表中行记录的锁 MySQL 的行锁 : 由各个引擎自己实现MyISAM 不支持行锁InnoDB 支持行锁 两阶段锁协议 : 行锁是在需要时才加上,要等到事务结束才释放 例子 : id 是表 t 的主键的 B 的 update 会阻塞,直到 A 执行 commit 后,B 才能…...
成为AI架构师的三大能力
AI架构师的定义 “AI 架构师”是以深度学习为代表的第三次AI热潮所催生的新型复合型人才,它的产生最本质的驱动因素是AI产业化落地应用的蓬勃发展对人才的需求,深度学习突出的工程属性也特别需要复合型人才来驾驭。 从字面来看,AI架构师的“…...
博客系统 实现 (前端 + 后端 )代码
文章目录博客系统前端代码 :1. add.html2. blog_detail.html3. blog_edit.html4. blog_list.html5. login.htmlcss 文件1. blog_detail.css2. blog_edit.css3. blog_list.css4. common.css5. login.css6. 分页器使用的 css后端代码1.config 包1.1 AppConfig类1.2 Lo…...
C语言:如何在cmd命令窗口上玩贪吃蛇游戏
最近在重新学习C语言知识,还别说,在这个过程中,我还真的学到了过去很多没有学习到C语言知识,于是就做了这个游戏–贪吃蛇. 运行结果如下: C语言:如何在cmd命令窗口上玩贪吃蛇游戏 文章目录 1. 实现原理2. 实现过程3. 参考代码1. 实现原理 其实,就是利用了人的视觉错觉来…...
Flutter-自定义图标
虽然Flutter有许多内置的icon图标,但是有些特殊功能的话,需要自定义图标或者需要在iconfont 阿里巴巴的图标库里找对应合适的图标。 第一步:在iconfont 阿里巴巴里搜索想要的图标并加入到购物车,点击下载代码后,会生成…...
教学场景应用视频试看预览功能
html5播放器视频预览功能效果 - 视频预览代码示例预播放一小段时间的视频内容,比如3分钟,然后引导用户付费观看或注册会员观看完整视频。原理:视频播放结束,执行s2j_onPlayOver()函数,显示提示信息或对话框,…...
关于进程与进程调度
目录什么是进程进程管理进程的结构体(PCB)里的属性并行与并发什么是进程 一个运行起来的程序就是进程. 比如文件名是以 exe 结尾的就是一可执行文件(程序) 双击QQ.exe文件, 这个程序就跑起来了, 它在系统中形成了一个进程, 那我们怎么看到进程呢? 可以打开任务管理器, 点开进…...
Redis常用命令及数据类型参数
1. 针对于string SET key value / GET key SET k1 v1 GET k1 // v1String是二进制安全的,是可变长度的, 底层类似于ArrayList 是可扩容的,最大存储内存为 512MB。 2. 判断key中是否存在某个内容 EXISTS key SET k1 v1 EXISTS k1 // …...
(七十四)大白话深入探索多表关联的SQL语句到底是如何执行的?(2)
今天咱们就以MySQL单表查询来举例,看看执行计划到底包含哪些内容 其实只要大家跟着专栏一步一步的学习下来,会很轻松的看懂执行计划,但是如果你之前对什么数据页,索引,索引使用规则,这些东西学的不扎实&am…...
销售使用CRM系统集成Excel的五个技巧
销售过程中有很多情况会降低团队的效率。通过正确的实施CRM客户管理系统,可以帮助您的企业自动执行手动任务、减少错误并专注于完成交易。这里有5个技巧,可以帮助您的销售人员通过CRM集成Excel为销售流程赋能并提高他们的整体效率。 技巧1:将…...
过来人告诉你:Java学到什么程度可以找工作?
大部分初次学习Java的同学都非常关注自己学到什么程度可以找工作就业,因为学习的目的一方面在于掌握知识、提高技能,另一方面就是就业谋生。今天笔者就来跟大家聊一聊一下Java学习到什么地步可以面试找工作。任何企业,不论大小,对…...
【Linux】目录结构
Linux世界里,一切皆文件。 /bin:是Binary的缩写,这个目录存放着最经常使用的命令。(常用) /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。 /home:存放普…...
37.Java进阶之实现动态编译
文章目录1. 作为程序员的最高追求2.如何实现动态编译2.1 生成源码2.2 调用编译器API对Test源码文件进行编译生成字节码2.3 调用类加载器对字节码进行加载得到Class对象2.4 使用Class对象创建对象进行使用3. Java编译API学习4. 类加载机制4.1 类加载过程4.2 类加载器的层次结构4…...
【Python百日进阶-Web开发-Vue3】Day549 - Vue3 商城后台 09:Veux4-01基本概念
文章目录 一、Vuex是什么?1.1 Vuex官网1.2 Vuex安装1.3 Vuex概述1.4 核心概念二、Vuex的基本使用2.1 简单使用2.1.1 `src/store/index.js`创建store并导出2.1.2 `main.js`中引入并`use(store)`2.1.3 `src/views/index.vue`首页中使用store2.2 使用`mapState`简化 `$store.stat…...
GitLab 解析:为什么市场正在转向一体化 DevSecOps 平台?(附Forrester完整报告下载)
本文来源:about.gitlab.com 译者:极狐(GitLab) 市场部内容团队 如 GitLab 预测:2023 年企业会将更多的时间和资源投入到持续的安全左移上(详情请戳👉:重磅!GitLab 提出五大预测,洞见…...
ThreadLocal的内部结构和源码探究
目录一. ThreadLocal的内部结构1 常见的误解2 现在的设计3 这样设计的好处二. ThreadLocal的核心方法源码1 set方法2 get方法3 remove方法**4 initialValue方法**三. ThreadLocalMap源码分析1 基本结构2 弱引用和内存泄漏3 hash冲突的解决一. ThreadLocal的内部结构 通过之…...
Linux文件系统(下)
逻辑卷管理如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间多少是一种痛苦的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须弄一个更大的硬盘,然后手动将已有的文件系统移动…...
合并链表相关的练习
目录 一、合并两个有序链表 二、两数相加 一、合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2&…...
FFmpeg介绍及入门知识
1、简介 FFmpeg是一套由c语言编写的,可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,自身采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案,包含了非常先进的音频/视频编解码库libavcodec…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
