dbt-server 简单说明

发布时间 2023-07-31 17:47:30作者: 荣锋亮

dbt-server 是dbt 团队对于dbt-rpc 调整之后开源的dbt api 服务,内部基于了dbt-core 提供的cli 编程调用能力

使用到的一些框架

  • fastapi 提供api 能力
  • dbt core 进行dbt 任务的执行
  • celery 基于celery 的任务调度(代码中的worker)

dbt core cli 调用

  • 参考代码
from dbt.cli.main import dbtRunner, dbtRunnerResult
 
# initialize
dbt = dbtRunner()
 
# create CLI args as a list of strings
cli_args = ["run", "--select", "tag:my_tag"]
 
# run the command
res: dbtRunnerResult = dbt.invoke(cli_args)
 
# inspect the results
for r in res.result:
    print(f"{r.node.name}: {r.status}")
  • 状态服用
    可以基于Manifest对象
 
from dbt.cli.main import dbtRunner, dbtRunnerResult
from dbt.contracts.graph.manifest import Manifest
 
# use 'parse' command to load a Manifest
res: dbtRunnerResult = dbtRunner().invoke(["parse"])
manifest: Manifest = res.result
 
# introspect manifest
# e.g. assert every public model has a description
for node in manifest.nodes.values():
    if node.resource_type == "model" and node.access == "public":
        assert node.description != "", f"{node.name} is missing a description"
 
# reuse this manifest in subsequent commands to skip parsing
dbt = dbtRunner(manifest=manifest)
cli_args = ["run", "--select", "tag:my_tag"]
res = dbt.invoke(cli_args)

当然dbt-core 还支持了回调,可以进行一些状态的维护处理

dbt cloud 参考架构

如下图,可以看到dbt cloud 的一些设计

 

说明

注意dbt-server license 许可是有一些限制的,但是因为是基于了dbt-core 提供的cli 能力,我们也可以很好的自己开发一个
同时dbt 也提供了自己cloud 的架构设计,可以参考学习,实际上有一篇有点老的完整介绍,也值得学习下

参考资料

https://github.com/dbt-labs/dbt-server/blob/main/CONTRIBUTING.md#developer-setup
https://github.com/dbt-labs/dbt-core
https://docs.getdbt.com/reference/programmatic-invocations
https://docs.getdbt.com/docs/cloud/about-cloud/architecture
https://drive.google.com/uc?export=download&id=1lktNuMZybXfqFtr24J8zAssEfoL9r51S