
# 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
  ```
  
- 原因分析 HiveServer允许的最大连接数设置过小。
  
 
- 排查方法 在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]
  ```
  

- 原因分析 HiveServer连接数超过了一个时间窗内最多能允许的连接数。
  
- 排查方法 检查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的连接数是否差距过大，如果差距过大则说明负载不均衡。
    图1HiveServer连接数监控   
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002669485009.png "点击放大") 
   
- 解决方法 客户端连接HiveServer时，将直连方式改为使用ZooKeeper负载均衡的方式进行连接。
  
 
 #### 使用完HiveConnection未正常关闭
- 问题现象 上报"Hive connection未正常关闭"相关的错误信息。
  
- 原因分析 通常为在使用Hive JDBC连接时，操作完成后未能正常关闭连接，导致资源未释放。
  
- 排查方法
  - 代码排查 检查应用程序代码，确保在使用完毕后正确关闭Hive会话，避免不必要的资源占用。
    
  
  - 日志排查 查看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();
            }
        }
    }
    ```
    
   
 
 #### HiveServer节点过少
- 问题现象 HiveServer的连接数使用比较均衡、最大连接数已经调到最大支持的上限，但是依然无法满足业务运行Hive任务的需求。
  
- 原因分析 如果经常出现连接过载的情况，可能需要考虑增加Hive服务器的硬件资源，或者在分布式环境中增加更多的Hive服务器实例以分散负载。
  
- 排查方法 通过相关监控信息排查后确认每个HiveServer资源都合理利用，但是依然经常出现连接过载问题。
  
- 解决方法 增加HiveServer实例。
  
 
 #### 限制了用户连接的HiveServer服务
- 问题现象 使用Spark连接Hive时，出现某个HiveServer节点连接占满，导致无法运行新的任务。
  
- 原因分析 Spark通过JDBC连接HiveServer时，设置了"spark.proxyserver.hash.enabled"参数为"true"，导致一个用户总是连接到一个节点，当该用户提交的任务很多时，会导致该节点连接数被用完，无法提交新任务。
  
- 排查方法 检查Spark的"spark.proxyserver.hash.enabled"参数值是否设置为"true"。
  
- 解决方法 将Spark的"spark.proxyserver.hash.enabled"参数值设置为"false"，关闭该功能。
  
 
