如何严格限制dbt与目标数据库的并行连接数量?
我们测试过不同版本的dbt-bigquery和dbt-postgres适配器,发现即便设置threads=1,dbt仍会创建一个master连接,再为dbt_project.yaml里定义的每个schema额外建立连接。我们项目要求同时连接目标数据库的数量不能超过2个,有没有能严格控制数据库连接数的配置方式?
日志中的连接初始化信息如下:
[0m16:42:27.610328 [debug] [MainThread]: Acquiring new bigquery connection 'master' [0m16:42:27.671724 [debug] [ThreadPool]: Acquiring new bigquery connection 'list_gdp-project-id' [0m16:42:27.674011 [debug] [ThreadPool]: Opening a new connection, currently in state init [0m16:42:32.247486 [debug] [ThreadPool]: Acquiring new bigquery connection 'list_project-id_staging' [0m16:42:32.249455 [debug] [ThreadPool]: Opening a new connection, currently in state init [0m16:42:32.250455 [debug] [ThreadPool]: Acquiring new bigquery connection 'list_project-id_pre_consumption' [0m16:42:32.252455 [debug] [ThreadPool]: Acquiring new bigquery connection 'list_project-id_consumption'
以下是几种严格控制dbt数据库连接数的可行方式:
配置统一连接池限制
针对dbt-bigquery,在profiles.yml中添加connection_pool: { max_connections: 2 },强制连接池总容量不超过2;针对dbt-postgres,配置pool_size: 2和max_overflow: 0,限制连接池的最大活跃连接数,避免为每个schema新建独立连接。合并schema定义
若业务逻辑允许,减少dbt_project.yaml中顶层定义的schema数量,将多个逻辑schema合并为一个,仅在模型层面通过schema配置区分数据归属。这样dbt只会为合并后的schema建立1个业务连接,加上master连接,总连接数可控制在2个以内。分批次运行模型
使用dbt run --select指定仅运行特定schema下的模型,避免dbt为未用到的schema初始化连接。分批次处理不同schema的模型,每次运行时仅初始化必要的连接,确保总连接数不超过限制。自定义适配器连接逻辑(进阶)
若上述配置无法满足需求,可基于现有适配器二次开发,重写acquire_connection方法,强制所有schema操作复用同一个连接实例,而非为每个schema创建新连接。
内容的提问来源于Stack Exchange,提问作者Despicable me

