文档首页/ MapReduce服务 MRS/ 组件操作指南(LTS版)/ 使用Hive/ Hive常见问题/ Hive Session连接过载问题排查及解决方法
更新时间:2025-12-10 GMT+08:00
分享

Hive Session连接过载问题排查及解决方法

客户端连接到HiveServer时,由于并发连接数超过了服务器所能处理的极限,导致无法建立新的会话。导致Hive Session连接接过载,通常存在以下使用场景:

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的连接数是否差距过大,如果差距过大则说明负载不均衡。

      图1 HiveServer连接数监控
  • 解决方法

    客户端连接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”,关闭该功能。

相关文档