【问题标题】:Working with multiple data warehouses in dbt在 dbt 中使用多个数据仓库
【发布时间】:2022-12-03 04:57:21
【问题描述】:

我正在构建一个应用程序,我们的每个客户都需要自己的数据仓库(出于安全性、合规性和可维护性原因)。对于每个客户,我们从多个第三方集成中提取数据,然后将它们合并到一个统一的视图中,我们使用该视图对这些集成中的数据执行分析和报告指标。这些转换和所有相关模式对于所有客户端都是相同的。我们需要它来扩展到 1000 个客户。

据我所知,dbt 的设计使每个项目对应一个仓库。我看到两个选项:

  1. 使用一个项目并为每个客户端创建一个单独的环境目标(可能还有一个开发环境)。鉴于环境不是为此而设计的,这有什么问题吗?由于某种原因,安排、编排或查询输出会很痛苦或无法扩展吗?

    配置文件.yml:

    example_project:
      target: dev
      outputs:
        dev:
          type: redshift
          ...
        client_1:
          type: redshift
          ...
        client_2:
          type: redshift
          ...
        ...
    
    1. 创建多个项目,并创建一个包含大部分逻辑的共享 dbt 包。这似乎非常笨重,需要为每个客户维护一个单独的回购协议,而且对开发人员的友好性较低。

    配置文件.yml:

    client_1_project:
      target: dev
      outputs:
        client_1:
          type: redshift
          ...
    client_2_project:
      target: dev
      outputs:
        client_2:
          type: redshift
          ...
    
    

    想法?

【问题讨论】:

    标签: amazon-redshift data-warehouse dbt


    【解决方案1】:

    我想你抓住了这两个选项。

    如果您只有一个数据库连接,并且您的客户端数据在该连接中逻辑上是分开的,那么我肯定会选择#2(一个包,许多客户端项目)而不是#1。一些原因:

    1. 根据目标从不同来源(在单个连接内)选择数据有点hacky,并且无法很好地扩展到 1000 个客户端。
    2. 包的开发人员体验还不错。您将需要一个开发人员数据源,但根据您的业务,您可能会使用一个客户的数据(或该数据的匿名版本)。保持此开发人员环境在逻辑上与任何单个客户端的实现分开是很好的,而包允许您这样做。
    3. 我会考虑以编程方式生成客户端项目,可能使用 Python CLI 来设置,dbt run,并拆除每个客户端项目所需的文件(我假设您不打算使用 dbt Cloud 和有另一个你控制的编排器或计算环境)。使用 pyyaml 从 Python 编写 YAML 很容易(每个文件只是一个字典),您的个人项目可能只需要单独的 profiles.ymlsources.yml 和(可能)dbt_project.yml 文件。我不会将这些为每个客户端生成的文件检查到源代码管理中——只需检查脚本并在每次调用 dbt 时生成您需要的文件。

      另一方面,如果您的每个客户都有自己的物理数据库,具有单独的连接和凭据,并且这些数据库完全相同,那么您可以摆脱#1(一个项目,许多配置文件)。该方法的“最难”部分可能是管理秘密和生成/维护您可以迭代的目标列表(最好以并行方式)。

    【讨论】:

    • 感谢您的输入!我可以看到在 schema.yml 或 dbt_project.yml 中指定动态数据源/模式会很麻烦,但是如果我只需要获取信息以作为单独的环境存在于 profiles.yml 中,我认为我不需要任何那种特殊的逻辑。每个客户端的模式配置都是相同的。您能否详细说明选项 1 中哪些方面无法很好地扩展?以编程方式生成 .yml 不会有问题,但它会感觉像是一种反模式,源代码控制每个客户端的不同文件,并且拥有动态变量会让人觉得很麻烦。
    • 哦,我明白了,您的客户端数据库有自己的连接信息?那么在物理上分离数据库?
    • 是的,每个人都有自己的 Redshift 集群
    • 知道了。这确实让#1 更具吸引力。在那种情况下,我很想走那条路。您需要一个秘密管理器和一种方法来生成您可以迭代(最好是并行化)的所有目标的列表,但这似乎还不错?不过,为了澄清我的第 3 点,我可能不会将每个客户端的代码都签入到源代码管理中,我只会签入生成脚本。当您想要运行客户的项目时,您可以即时生成所需的文件。
    • 我明白了 - 这是有道理的,谢谢。如果您想更新您的答案,我会将其标记为已接受:)
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2022-11-02
    • 2014-07-04
    • 2022-01-19
    相关资源
    最近更新 更多