出现问题:使用Hive Beeline执行hql语句时,经常报“Too many connections”错误。

经检查,一般会出现该问题的主是3种问题:MySQL配置问题、HiveServer2配置问题、haproxy配置问题。

下面主要介绍下三种问题的解决方案。

MySQL配置问题

可能原因:

  1. 同时执行的hql语句过多,hive使用的元数据库使用的MySQL配置连接数不足
  2. 有大量MySQL连接未释放
  3. 执行的查询语句太复杂,查询元数据超时(可能性最小)

解决

  1. /etc/my.cnf 文件
    /etc/my.cnf
    1
    2
    3
    4
    5
    6
    7
    8
    # 增加以下内容
    [mysqld]
    # 最大连接数
    max_connections=1000
    # 非交互式连接(客户端)最大空闲时长(s)
    interactive_timeout=1800
    # 交互式连接(jdbc)最大空闲时长(s)
    wait_timeout=1800
  2. 重启MySQL服务
    1
    systemctl restart mysqld

mysql连接状态相关查询语句

  1. 查看mysql连接情况
    1
    show processlist;
  2. mysql长连接默认检测时间
    1
    2
    show variables like 'wait_timeout';
    show variables like 'interactive_timeout';

HiveServer2配置问题

可能原因:

  1. hive允许的连接数过少
  2. 在运行的hive连接过多且不释放

解决

  • 如果是hive连接过多且不释放,需要针对单个作业进行分析或直接kill掉占用过多的作业;
  • 如果是hive允许的连接数过少,可以修改HiveServer2的配置,增加连接数,_但该需要根据实际情况去配置,一味增加最大线程数可以会加大服务器压力_,但实际上并没有解决问题。

以下为HS2的修改:

  1. 修改并保存 hive-site.xml,或在CM中找到HS2设置修改
    hive-site.xml
    1
    2
    3
    4
    5
    <property>
    <name>hive.server2.thrift.max.worker.threads</name>
    <value>600</value>
    <description>Maximum number of Thrift worker threads</description>
    </property>
  2. 重启HS2
    1
    2
    3
    4
    5
    6
    7
    8
    # 停止
    hive --service hiveserver2 --stop

    # 验证启停
    jps

    # 启动
    hive --service hiveserver2 --start

haproxy配置问题

可能原因:
使用HA连接hive,HA的配置最大连接数过少、等待时间过短导致

解决

  1. /etc/haproxy/haproxy.cfg 新增或修改(根据实际修改)
    /etc/haproxy/haproxy.cfg
    1
    2
    3
    4
    5
    6
    7
    8
    9
    defaults
    timeout http-request 1m #默认http请求超时时间
    timeout queue 10m #默认队列超时时间
    timeout connect 10m #默认连接超时时间
    timeout client 10m #默认客户端超时时间
    timeout server 10m #默认服务器超时时间
    timeout http-keep-alive 30s #默认持久连接超时时间
    timeout check 1m #设置超时检查超时时间
    maxconn 3000 #设置最大连接数
  2. 重启 haproxy
    1
    systemctl restart haproxy