impala.dbapi产生大量连接导致资源不足问题排查

背景

需要查询hue的某表进行币价表进行币价折合,日志显示新建了大量的会话,当前的网站只有已通过每日写入一次MySQL处理连接impala连接时间长的问题,和反复新建会话现象不一致。

排查原因

1、在settings.py文件夹中可以得知impala每一次新建的是cursor对象。而timeout参数只是用于起始连接,对于连接后查询是不做限制的。

conn_impala = connect(host='xxx',
                      port=xxx,
                      auth_mechanism='noSasl',
                      user='xxx',
                      password='',
                      database='xxx',
                      timeout=60)
cur_impala = conn_impala.cursor(user='xxx')

2、查看cursor的源码,可以得知cursor是默认不关闭的,需要手动调用close()方法否则会一直保持连接。

    def __init__(self):
    self._closed = False

    def __del__(self):
        if self._closed:
            return
        try:
           self.close_operation()
        except Exception:
            pass
        try:
           self.session.close()
        except Exception:
            pass

3、然后是这一个位置
继承关系 Base《= BaseAPI《= BehaviorBase

class Base(SessionMixin, RequestHandler):

    def initialize(self) -> None:
        self.sess = self.settings['sess']
        self.cur_impala = self.settings['cur_impala']

class BehaviorBase(BaseAPI):
    def initialize(self):
        super().initialize()
        self.app_config = {1: 'aaaa', 14: 'bbbb'}
        self.platform_config = {2: 'cc', 3: 'dd', 5: "ee", 6: "ff"}

当每一次调用BehaviorBase的时候就会一直新建cursor,并且一直保持连接但是没有做实质的操作。

总结

  1. 复用的应该是链接不是cursor
  2. 记得用完链接以后一定要close()
  3. 但是不要频繁的新建连接,连接数太多会慢,所以是需要的时候才新建,新建完就close掉。

但是

一个分区为当天count(*)=250的一个SQL语句为什么会有的时候3min?

 SELECT 
     dt,
     f_currency_display,
     f_usdt
 FROM xxx.xxx
 WHERE dt = '{arrow.get(end).format("YYYYMMDD")}'
 AND f_usdt != 'f_usdt'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值