HiveServer2中使用jdbc访问hbase时导致ZooKeeper连接持续增加的解决

最近在监控中发现HiveServer2连接到zookeeper里的连接持续上涨,很奇怪,虽然知道HiveServer2支持并发连接,使用ZooKeeper来管理Hive表的读写锁,但我们的环境并不需要这些,我们已经关闭并发功能,以下是线上的配置,甚至把这些值都改成final了。

但是zookeeper连接依然会涨。后来想想,我们要访问的表是hive去映射的hbase,hiveserver2什么时候去连接zookeeper,它连接zookeeper干么,先从日志下手,将线上日志级别改为了debug,然后在hiveserver2.log发现了如下信息:

2016-02-23 14:03:30,271 DEBUG [HiveServer2-Background-Pool: Thread-598-SendThread(hadoop002:2181)]: zookeeper.ClientCnxn (ClientCnxn.java:readResponse(717)) - Got ping response for sessionid: 0x252fd37100600d2 after 0ms
2016-02-23 14:03:30,325 DEBUG [HiveServer2-Background-Pool: Thread-797-SendThread(hadoop003:2181)]: zookeeper.ClientCnxn (ClientCnxn.java:readResponse(717)) - Got ping response for sessionid: 0x352fd3707b600e3 after 0ms
2016-02-23 14:03:30,626 DEBUG [HiveServer2-Background-Pool: Thread-1138-SendThread(hadoop003:2181)]: zookeeper.ClientCnxn (ClientCnxn.java:readResponse(717)) - Got ping response for sessionid: 0x352fd3707b600e8 after 0ms
2016-02-23 14:03:30,768 DEBUG [HiveServer2-Background-Pool: Thread-730-SendThread(hadoop001:2181)]: zookeeper.ClientCnxn (ClientCnxn.java:readResponse(717)) - Got ping response for sessionid: 0x152fd3707c800db after 0ms
2016-02-23 14:03:32,751 DEBUG [HiveServer2-Background-Pool: Thread-461-SendThread(hadoop001:2181)]: zookeeper.ClientCnxn (ClientCnxn.java:readResponse(717)) - Got ping response for sessionid: 0x152fd3707c800d5 after 0ms
2016-02-23 14:03:33,057 DEBUG [HiveServer2-Background-Pool: Thread-1211-SendThread(hadoop002:2181)]: zookeeper.ClientCnxn (ClientCnxn.java:readResponse(717)) - Got ping response for sessionid: 0x252fd37100600dd after 0ms

这是个线程池,由SessionManager创建,但它是在何时创建的,从日志里一时不好看出来,所以在我们测试环境里对HiveServer2搞了个远程调试,启用远程调试步骤:

在/etc/hive/conf/conf.server下hive-env.sh里上方添加:#add by lidong for remote debug
export HADOOP_OPTS="$HADOOP_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 -XX:NewRatio=12 -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-UseGCOverheadLimit"

又经过近2天的折腾,终于搞明白了这个zookeeper连接是在Hive工程里的MapRedTask的execute(DriverContext driverContext) 方法里创建的:

...

if (!runningViaChild) { //这句很重要,解决就靠它了
        // we are not running this mapred task via child jvm
        // so directly invoke ExecDriver
        return super.execute(driverContext);//就是这句,会调用hadoop里的JobClient去submitJob(job);  然后zookeeper连接就产生了
      }

...

后面也再没去清理zookeeper的连接,导致就留下了

原因都清楚了,我选择了更为简单的处理办法,让控制runningViaChild的参数为true,让每个job在hiveserver2里都是子进程去提交,子进程结束,所有的资源都释放了

解决办法就是:

在hive-site.xml里,把

hive.exec.submitviachild 设置为true

调试的堆栈信息留个纪念:

时间: 2024-10-18 14:11:48

HiveServer2中使用jdbc访问hbase时导致ZooKeeper连接持续增加的解决的相关文章

在Eclipse中使用JDBC访问MySQL数据库的配置方法

在Eclipse中使用JDBC访问MySQL数据库的配置方法 分类: DATABASE 数据结构与算法2009-10-10 16:37 5313人阅读 评论(10) 收藏 举报 jdbcmysql数据库eclipsewordpressproperties 这是一篇JDBC的使用入门文章,主要内容是如何在Eclipse中使用MySQL的JDBC驱动程序. 要使用JDBC访问MySQL的数据库,或者是其他类型的数据库,必须要有这种数据库系统的JDBC驱动程序.通常,JDBC驱动程序是由数据库开发商制

启动hbase出现的zookeeper连接问题

今天安装了hbase想做下测试,结果发现在创建表时报错“can't get master address from zookeeper, zookeeper date = null”,大致是这样描述的,之后查看日志,发现hbase在启动zookeeper时确实报错了,查阅了网上的资料,说hbase自带zookeeper,如果想用独立的zookeeper需要把hbase-env.sh中的HBASE_MANAGES_ZK改成false,但自己试了还是没用,错误显示zk端口已经被占用,估计是hbase

使用浏览器的开发者工具与 DIG 命令行工具,来分析访问站点时的网络连接与 HTTP 请求和响应

前言 想必有些朋友和我一样,想要弄清楚当使用浏览器访问一个站点时,究竟向那些站点发起了 HTTP 请求:站点的 HTTP 响应:这些站点的域名是否和 shell 终端输出的 socket 套接字IP地址对应得上:这些站点使用的域名,IP地址,物理地址,域名拥有者和IP地址拥有者之间的联系:系统当前是否存在恶意或非法的网络连接...等等. 本博文就是要以随手取得的开源工具,并且用一种可实际操作的标准化流程,来达到上述种种分析任务的目标. 这套工具集与流程,以及思路,适用于你想分析的任何对象(这里指

Win7x64中使用VS调试WEB项目报“ORA-06413: 连接未打开”错误解决方法

错误描述 普通Web项目,Web项目在32位系统上跑的好好的,一点问题没有. 使用VS内置的开发服务器调试,页面能正常启动,但一连接数据库就报“ORA-06413: 连接未打开”错误. 使用IIS Express或IIS服务器,启动时报错:HTTP 错误 500.21 - Internal Server Error,处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”. 在上述问题解决后,又报一个错误:

在java中使用JDBC访问数据库

配置文件之类的加略过了 1:首先需要创建一个类: //写入以上代码,上面的代码很难记所以手打会很容易出错,我们可以从配置文件中找到字符串,当链接数据库成功之后,就可以进行增删改查了. 其中修改添加,删除都可以使用executeupdate方法,在这里就不一一列举了 这是数据库中的新增结果 下面是查询的代码: 查询使用的是executequery方法 当我们做完这些工作之后要记得关闭连接,那个后开加就先关闭那个 这是查询后的结果

JSP中通过JDBC访问数据库

一.步骤介绍 1.通过Class.forName()加载驱动: 2.通过DriverManager.getConnection()获取Conncetion连接对象: 3.创建Statement对象传递sql语句到数据库执行: 4.接收ResultSet查询结果: 5.释放资源. 二.查询案例 public void getData(){ String URL = "jdbc:sqlserver://127.0.0.1:1433;databaseName=news"; Connectio

同步以太坊测试网络时导致C盘存储空间不足的解决办法

在尝试同步以太坊的的测试网络时可能会遇到一个问题,就是会发现同步下来的区块会默认存储在C盘底下导致磁盘空间不足,具体的路径如下: C:\Users\Administrator\AppData\Roaming\Ethereum 1 注:如果你找不到AppData,你需要打开隐藏文件 这是以太坊区块默认的存储路径,也是以太坊钱包指定查找的路径.因为即使是测试网络的区块数据也是很多的,如下图是我还没完全同步时的区块数据,已经快接近12G了:  若是这么大的文件放在C盘下肯定不合适,最好是放到其他盘符下

JS中小数相加相减时出现很长的小数点的解决方式

1.问题: 平时写的代码中会出现这种情况,parseFloat(11.3-10.1) 运行的结果依然是1.200000000000001 代码示例: var arr = [0.0111,11.002,0.3,1.5,1.61] var total = 0 arr.forEach(item =>{ total += item }) console.log(total) 返回的结果---  14.423100000000002,这种情况就不合常理. 2.解决方案: 这里有一种可行的解决方法,应用到M

向 mysql 数据库中写入datetime 类型数据时 出现全是0的错误解决办法

Date date = new Date();//获得系统时间. SimpleDateFormat sdf = new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " ); String nowTime = sdf.format(date); Date time = sdf.parse( nowTime );