Hive Session连接过载问题排查及解决方法
客户端连接到HiveServer时,由于并发连接数超过了服务器所能处理的极限,导致无法建立新的会话。导致Hive Session连接接过载,通常存在以下使用场景:
- HiveServer连接数配置过少
- HiveServer连接数超过单个用户的最大会话连接数
- HiveServer连接数超过时间窗口中最大的连接数
- HiveServer负载不均衡
- 使用完HiveConnection未正常关闭
- HiveServer节点过少
- 限制了用户连接的HiveServer服务
HiveServer连接数配置过少
- 问题现象
客户端连接HiveServer失败,Hive服务端日志报错“over max connections”,详细报错日志如下:
... Caused by: org.apache.hive.service.cli.HiveSQLException: over max connections. at org.apache.hadoop.hive.transporthook.SessionControllerTsaslTransportHook.checkTotalSessionNumber(SessionControllerTsaslTransportHook.java:187) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hadoop.hive.transporthook.SessionControllerTsaslTransportHook.postOpen(SessionControllerTsaslTransportHook.java:145) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hadoop.hive.transporthook.AbstractHiveSessionHook.run(AbstractHiveSessionHook.java:29) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hive.service.cli.session.SessionManager.executeSessionHooks(SessionManager.java:732) ~[hive-service-3.1.0-h0.cbu.mrs.331.r10.jar:3.1.0-h0.cbu.mrs.331.r10] at org.apache.hive.service.cli.session.SessionManager.createSession(SessionManager.java:495) ~[hive-service-3.1.0-h0.cbu.mrs.331.r10.jar:3.1.0-h0.cbu.mrs.331.r10] ... 13 more - 原因分析
- 排查方法
在Manager界面,选择“集群 > 服务 > Hive > 配置”,在Hive配置中搜索“hive.server.session.control.maxconnections”配置项,查看该配置项的值是否设置过小,如果过小,可根据业务量情况适当调大该值。
- 解决方法
根据业务实际使用情况,将“hive.server.session.control.maxconnections”参数值适当调大。
HiveServer连接数超过单个用户的最大会话连接数
- 问题现象
客户端连接HiveServer失败,查看HiveServer日志报错“over max user connections”,详细报错日志信息如下:
... Caused by: org.apache.hive.service.cli.HiveSQLException: over max user connections at org.apache.hadoop.hive.transporthook.SessionControllerTsaslTransportHook.checkUserSessionNumber(SessionControllerTsaslTransportHook.java:202) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hadoop.hive.transporthook.SessionControllerTsaslTransportHook.postOpen(SessionControllerTsaslTransportHook.java:147) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hadoop.hive.transporthook.AbstractHiveSessionHook.run(AbstractHiveSessionHook.java:29) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hive.service.cli.session.SessionManager.executeSessionHooks(SessionManager.java:732) ~[hive-service-3.1.0-h0.cbu.mrs.331.r10.jar:3.1.0-h0.cbu.mrs.331.r10] at org.apache.hive.service.cli.session.SessionManager.createSession(SessionManager.java:495) ~[hive-service-3.1.0-h0.cbu.mrs.331.r10.jar:3.1.0-h0.cbu.mrs.331.r10] ... 13 more - 原因分析
Hive通过“hive.server.session.control.maxconnection.peruser”参数限制每个用户的最大会话连接数,如果一个用户尝试打开的会话数量超过了该参数设置的值,新的会话请求将会被拒绝。
- 排查方法
检查当前用户连接HiveServer的连接数是否超过“hive.server.session.control.maxconnection.peruser”参数的值,如果是,则说明该参数值设置过小。
- 解决方法
如果“hive.server.session.control.maxconnection.peruser”参数的值设置过小,则根据业务使用情况适当调大该参数值;如果分析后觉得该参数值设置合理,则检查是否存在使用完未关闭的连接。
HiveServer连接数超过时间窗口中最大的连接数
- 问题现象
客户端连接HiveServer时报以下错误:
... Caused by: org.apache.hive.service.cli.HiveSQLException: over max connections in timewindow. at org.apache.hadoop.hive.transporthook.TimeWindowsTsaslTransportHook.postOpen(TimeWindowsTsaslTransportHook.java:128) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hadoop.hive.transporthook.AbstractHiveSessionHook.run(AbstractHiveSessionHook.java:29) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hadoop.hive.transporthook.TimeWindowsTsaslTransportHook.run(TimeWindowsTsaslTransportHook.java:106) ~[hive-om-3.1.0-h0.cbu.mrs.331.r10.jar:?] at org.apache.hive.service.cli.session.SessionManager.executeSessionHooks(SessionManager.java:732) ~[hive-service-3.1.0-h0.cbu.mrs.331.r10.jar:3.1.0-h0.cbu.mrs.331.r10] at org.apache.hive.service.cli.session.SessionManager.createSession(SessionManager.java:495) ~[hive-service-3.1.0-h0.cbu.mrs.331.r10.jar:3.1.0-h0.cbu.mrs.331.r10]
- 原因分析
- 排查方法
检查Hive“hive.server.timewindow.delaytime”和“hive.server.timewindow.maxsessions.in.delaytime”参数的值,排查是否存在在“hive.server.timewindow.delaytime”参数设置的时间内,连接HiveServer的连接数超过了“hive.server.timewindow.maxsessions.in.delaytime”配置的值;如果存在,则说明这两个参数的值设置不合理导致连接HiveServer失败。
- 解决方法
将参数“hive.server.timewindow.maxsessions.in.delaytime”的值根据实际情况调大。
HiveServer负载不均衡
- 问题现象
某个HiveServer的连接数过高,远多于其他HiveServer的连接数,各个HiveServer连接数的使用出现了不均衡。
- 原因分析
客户端连接HiveServer时,未通过ZooKeeper负载均衡方式连接,而是直接连接某个指定的HiveServer节点,导致单个HiveServer访问量大、负载高。
- 排查方法
- 方法一:检查URL
检查连接HiveServer的URL中是否包含ZooKeeper信息,URL格式为:
jdbc:hive2://ZooKeeper节点1:ZooKeeper端口号,ZooKeeper节点2:ZooKeeper端口号,ZooKeeper节点3:ZooKeeper端口号/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;sasl.qop=auth-conf;auth=KERBEROS;principal=hive/hadoop.COM
- 方法二:查看监控
在Manager界面,选择“集群 > 服务 > Hive”,在概览页面的图表区域查看“已经连接到HiveServer的session数量-所有实例”监控,查看各HiveServer的连接数是否差距过大,如果差距过大则说明负载不均衡。
图1 HiveServer连接数监控
- 方法一:检查URL
- 解决方法
使用完HiveConnection未正常关闭
- 问题现象
- 原因分析
- 排查方法
- 代码排查
- 日志排查
查看HiveServer审计日志,根据审计日志中打开session和关闭session的日志记录信息排查session是否正常关闭,如果关闭session的日志信息少于打开session的日志,说明存在未关闭的session,在HiveServer所在节点可通过以下命令统计session打开和关闭的次数:
grep 'OpenSession' /var/log/Bigdata/audit/hive/hiveserver/hive-audit.log | awk '{print $9}' | sort | uniq -c | sort
grep 'CloseSession' /var/log/Bigdata/audit/hive/hiveserver/hive-audit.log | awk '{print $9}' | sort | uniq -c | sort
- 解决方法
- 确保在代码中使用try-with-resources或在finally块中关闭连接:
try (Connection con = DriverManager.getConnection(url, username, password); Statement stmt = con.createStatement()) { // 执行操作 } catch (SQLException e) { e.printStackTrace(); } // 在这个块结束时,连接会自动关闭 - 如果使用的是旧版本Java,可以使用try-finally结构手动关闭连接:
Connection con = null; try { con = DriverManager.getConnection(url, username, password); // 执行操作 } catch (SQLException e) { e.printStackTrace(); } finally { if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } }
- 确保在代码中使用try-with-resources或在finally块中关闭连接: