Hive JDBC连接Tez(AM)容器长期不释放问题的解决方法

问题

有这样一个问题是很常见的:如果我们的Hive使用默认使用Tez作为执行引擎,当我们使用IDE通过Hive JDBC连接时,会出现在一个很“有趣”的想象:即如果我们不断开这个JDBC连接,则在Yarn上会持续有有一个Tez的AM容器持续存在,只有当端开JDBC连接时,这个容器才会被释放。关于Tez在Yarn的资源布局,可参考这篇文章:https://zh.hortonworks.com/blog/introducing-tez-sessions/ ,其中一张直观的图如下:

在这里插入图片描述

当团队拥有一个资源较为充裕的集群时,这不会是一个问题,并且维持这样一个Tez的AM容器是有好处的,好处就是:避免每次执行SQL时重新初始化容器。当如果我们的集群资源有限,使用的人又较多时,这个问题就会导致一个很糟糕的状况:那就是每个人连接到Hive时就会有一个Tez的AM容器生成,相应的至少有一个cpu core要分配出去,如果总的核数较小,单JDBC连接就会挤占掉所有的资源。(注:实际上,Yarn并不会等到所有的核都被占用,而是当所有AM容器占用的资源达到一定的比例时,就不会再允许新的应用提交了,这个比例的参数项名为:yarn.scheduler.capacity.maximum-am-resource-percent,默认0.2, 即20%)

解决方案

显然,在资源有限的前提下,我们不能让一个session长期存在,只要存在一个session就会有一个core被占用着无法释放,所以我们要让session存在的时间尽可能的短!而控制一个session生命周期长短的参数其实主要是它的超时时间,这个参数是:tez.session.am.dag.submit.timeout.secs, 在Hive和Tez上都有这个配置,默认值是一个比较大的数值,如果我们想尽可能早的释放掉资源,就把这个值设为0,最为了稳妥,最好是在Tez和Hive上都进行设置!

以HDP为例,Tez设置为:
在这里插入图片描述
Hive设置为:
在这里插入图片描述

bluishglc CSDN认证博客专家 CSDN博客专家
耿立超,架构师,CSDN博客专家,14年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验。对Hadoop/Spark 生态系统有深入和广泛的研究,参与过Hadoop商业发行版的开发,目前负责企业数据中台的架构设计和开发工作,热衷函数式编程,著有《大数据平台架构与原型实现:数据中台建设实战》https://item.jd.com/12677623.html 一书。
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值