Erläuterungen zu den Abhängigkeiten von dbt-Projekten auf Snowflake

In dbt Projects on Snowflake sind dbt-Abhängigkeiten die Pakete, die Sie in Ihrer packages.yml-Datei deklarieren (z. B. dbt-labs/dbt_utils aus dem Tutorial „Erste Schritte“). Sie werden in einem dbt_packages-Ordner installiert, wenn Sie dbt deps ausführen, genau wie in dbt Core.

Sie müssen den Befehl dbt deps innerhalb eines Snowflake-Arbeitsbereichs ausführen, um den Ordner dbt_packages für Ihr dbt-Projekt auszufüllen. Alternativ können Sie auch dbt deps auf Ihrem lokalen Computer oder Git-Orchestrator (z. B. GitHub Actions) ausführen und mit snow dbt deploy bereitstellen.

Wenn eine dbt-Projektversion erstellt wird, betrachten Sie sie als schreibgeschützten Code. Sie ändern ihre Dateien nicht mit dbt deps, sondern erstellen eine neue Version, wenn Sie aktualisierte Abhängigkeiten benötigen.

Allgemeine Informationen zur Ausführung des Befehls „dbt deps“

Sie können den Befehl dbt deps auf eine der folgenden Arten ausführen:

  • In einem Snowflake-Arbeitsbereich: (empfohlen für Entwicklungsumgebungen.) Sie können den Befehl dbt deps innerhalb Ihres Arbeitsbereichs in Snowsight ausführen, um dbt_packages zu füllen, bevor Sie Ihr dbt-Projekt als DBT-PROJECT-Objekt bereitstellen.

    Dies erfordert einen externen Netzwerkzugriff, damit Snowflake auf die Repositorys für die Abhängigkeiten zugreifen kann. Weitere Informationen dazu finden Sie unter Erstellen einer Integration für den externen Zugriff für dbt-Abhängigkeiten in Snowflake.

  • Außerhalb von Snowflake: (z. B. im Erstellungsschritt Ihrer Bereitstellungspipeline.) Sie können den Befehl dbt deps auf Ihrem lokalen Computer oder in Ihrer kontinuierlichen Integration (Continuous Integration, CI) ausführen, um Pakete in dbt_packages herunterzuladen, und dann das gesamte Projekt (einschließlich dieses Ordners) in Snowflake bereitstellen.

    Dies erfordert keine Integration für den externen Netzwerkzugriff, da alle Abhängigkeiten bereits im dbt-Projekt enthalten sind.

    Da die Dateien in einer dbt-Projektversion unveränderlich sind, hätte der Versuch, dbt deps gegen ein bereitgestelltes Objekt auszuführen, keine Auswirkungen auf den Ordner dbt_packages innerhalb des Objekts.

dbt-projektübergreifende Abhängigkeiten

Um innerhalb Ihres dbt-Projekts auf ein anderes dbt-Projekt zu verweisen, muss das dbt-Projekt, auf das verwiesen wird, in das Stammverzeichnis Ihres dbt-Projekts kopiert werden.

Obwohl lokale Abhängigkeiten keine Integration für den externen Zugriff erfordern, müssen Sie eine echte Integration für den externen Zugriff konfigurieren, wenn Sie eine Mischung aus lokalen Paketen und Remote-Paketen benötigen (z. B. vom dbt Packages Hub oder Git).

Nehmen wir zum Beispiel die folgenden zwei dbt-Projekte. Sie möchten, das core_project metrics_project lokal einschließt, sodass bei der Bereitstellung in Snowflake alles bereits enthalten ist (kein externer Zugriff erforderlich).

/Projects
├─ core_project/
│   ├─ dbt_project.yml
│   ├─ packages.yml
│   ├─ models/
│   └─ ...
└─ metrics_project/
    ├─ dbt_project.yml
    ├─ models/
    └─ ...
Copy
  • core_project: Dies ist Ihr Hauptprojekt (das Projekt, das Sie bereitstellen werden).

  • metrics_project: Dies ist das Projekt, das Sie als lokale Abhängigkeit verwenden möchten.

Führen Sie zum Verweisen auf metrics_project innerhalb von core_project die folgenden Schritte aus:

  1. Erstellen Sie innerhalb von core_project einen Ordner namens local_packages. Kopieren Sie metrics_project in diesen Ordner.

    Stellen Sie sicher, dass metrics_project einen anderen Namen in seiner dbt_project.yml hat als core_project. Die Namen müssen eindeutig sein.

    cd /Projects/core_project
    mkdir local_packages
    cp -R ../metrics_project ./local_packages/metrics_project
    
    Copy

    Nun sieht Ihr Layout wie folgt aus:

    core_project/
      ├─ dbt_project.yml
      ├─ packages.yml
      ├─ models/
      ├─ local_packages/
      │   └─ metrics_project/
      │       ├─ dbt_project.yml
      │       ├─ models/
      │       └─ ...
    
    Copy
  2. Deklarieren Sie in core_project/packages.yml die lokale Abhängigkeit unter Verwendung des relativen Pfads.

    packages:
      - local: local_packages/metrics_project
    
    Copy
  3. Führen Sie innerhalb von core_project den Befehl dbt deps aus.

    dbt behandelt metrics_project jetzt als Paket, und Makros von metrics_project sind für verfügbar core_project.

„dbt deps“ automatisch bei der Kompilierung ausführen

Wenn Sie ein dbt-Projektobjekt bereitstellen oder aktualisieren und ihm eine Integration für den externen Zugriff geben, kann Snowflake dbt deps während der Kompilierung automatisch ausführen, sodass die Abhängigkeiten als Teil dieses Schritts installiert werden. Das bedeutet, dass Sie bei der Bereitstellung von Projekten mit externen Abhängigkeiten /dbt_packages nicht mehr angeben müssen.

Wenn Sie Ihr dbt-Projektobjekt vom Arbeitsbereich in einer Snowflake-Datenbank und einem Snowflake-Schema bereitstellen, können Sie ein Objekt erstellen oder ein zuvor erstelltes Objekt überschreiben.

  1. Melden Sie sich bei Snowsight an.

  2. Wählen Sie im Navigationsmenü die Option Projects » Workspaces aus.

  3. Wählen Sie im Menü Workspaces den Arbeitsbereich aus, der Ihr dbt-Projekt enthält.

  4. Wählen Sie auf der rechten Seite des Arbeitsbereichseditors Connect » Deploy dbt project aus.

  5. Wählen Sie im Popupfenster Deploy dbt project Folgendes aus:

    • Wählen Sie unter Select location Ihre Datenbank und Ihr Schema aus.

    • Wählen Sie unter Select or Create dbt project die Option Create dbt project aus.

    • Geben Sie einen Namen und eine Beschreibung ein.

    • Optional können Sie ein Standardziel eingeben, um auszuwählen, welches Profil für die Kompilierung und nachfolgende Ausführungen verwendet werden soll (z. B. prod). Das Ziel einer dbt-Projektausführung kann mit --target in ARGS trotzdem überschrieben werden.

    • Optional können Sie Run dbt deps und dann Ihre Integration für den externen Zugriff auswählen, damit dbt deps während der Bereitstellung automatisch ausgeführt wird.

  6. Wählen Sie Deploy aus.

Auf der Registerkarte Output wird der Befehl angezeigt, der in Snowflake ausgeführt wird und dem folgenden Beispiel ähnelt:

CREATE DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
  FROM 'snow://workspace/mydb.my_dbt_projects_schema.sales_model/versions/version$2'
  EXTERNAL_ACCESS_INTEGRATIONS = (my_dbt_ext_access);
Copy
my_dbt_project successfully created.

Das Connect-Menü zeigt jetzt den Namen des von Ihnen erstellten dbt-Projektobjekts mit den folgenden Optionen an:

  • Redeploy dbt project: Aktualisiert das dbt-Projektobjekt mit der aktuellen Arbeitsbereichsversion des Projekts mithilfe von ALTER. Dies erhöht die Version des dbt-Projektobjekts um 1. Weitere Informationen dazu finden Sie unter Versionierung für dbt-Projektobjekte und -Dateien.

  • Disconnect: Trennt den Arbeitsbereich vom dbt-Projektobjekt, löscht aber nicht das dbt-Projektobjekt.

  • Edit project: Aktualisieren Sie den Kommentar, das Standardziel und die Integration für den externen Zugriff für das dbt-Projektobjekt.

  • View project: Öffnet das dbt-Projektobjekt im Objekt-Explorer, wo Sie den Befehl CREATE DBT PROJECT für das dbt-Projektobjekt und den Ausführungsverlauf für das Projekt anzeigen können.

  • Create schedule: Bietet Optionen, um eine Aufgabe zu erstellen, die das dbt-Projektobjekt nach einem Zeitplan ausführt. Weitere Informationen dazu finden Sie unter Erstellen einer Aufgabe, um die Ausführung des dbt-Projekts zu planen.

  • View schedules: Öffnet eine Liste der Zeitpläne (Aufgaben), die das dbt-Projektobjekt ausführen, mit der Option, Aufgabendetails im Objekt-Explorer anzuzeigen.

Erstellen einer Integration für den externen Zugriff für dbt-Abhängigkeiten in Snowflake

Wenn Sie dbt-Befehle in einem Arbeitsbereich ausführen, muss dbt zum Herunterladen von Abhängigkeiten möglicherweise auf die Remote-URLs zugreifen. Beispielsweise muss dbt Pakete aus dem dbt-Paket-Hub oder von GitHub herunterladen.

Die meisten dbt-Projekte geben die Abhängigkeiten in ihrer packages.yml-Datei an. Sie müssen diese Abhängigkeiten im dbt-Projekt-Arbeitsbereich installieren.

Sie können ein bereitgestelltes dbt-Projektobjekt nicht mit Abhängigkeiten aktualisieren. Um ein dbt-Projektobjekt mit neuen Abhängigkeiten zu aktualisieren, müssen Sie dem Objekt eine neue Version hinzufügen. Weitere Informationen dazu finden Sie unter So werden dbt-Projektobjekte aktualisiert.

Um das dbt-Paket von Remote-URLs abzurufen, benötigt Snowflake eine Integration für den externen Zugriff, die auf einer Netzwerkregel beruht, wie im folgenden Beispiel gezeigt:

-- Create NETWORK RULE for external access integration

CREATE OR REPLACE NETWORK RULE my_dbt_network_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  -- Minimal URL allowlist that is required for dbt deps
  VALUE_LIST = (
    'hub.getdbt.com',
    'codeload.github.com'
    );

-- Create EXTERNAL ACCESS INTEGRATION for dbt access to external dbt package locations

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_dbt_ext_access
  ALLOWED_NETWORK_RULES = (my_dbt_network_rule)
  ENABLED = TRUE;
Copy

Weitere Informationen zu Integrationen für den externen Zugriff in Snowflake finden Sie unter Erstellen und Verwenden einer Integration für den externen Zugriff.

Einschränkungen, Anforderungen und Hinweise zu dbt-Abhängigkeiten

Die folgenden Anforderungen, Hinweise und Beschränkungen gelten für dbt-Abhängigkeiten für dbt-Projekte in dbt Projects on Snowflake:

  • Sie müssen den Befehl dbt deps innerhalb eines Snowflake-Arbeitsbereichs ausführen, um den Ordner dbt_packages für Ihr dbt-Projekt auszufüllen. Alternativ können Sie auch dbt deps auf Ihrem lokalen Computer oder Git-Orchestrator ausführen und mit snow dbt deploy bereitstellen.

    Ein dbt-Projektobjekt ist ein versionierter Snapshot, daher ändert die Ausführung von dbt deps mit EXECUTE DBT PROJECT oder snow dbt execute keine Dateien. Es wird hauptsächlich geprüft, ob Ihr externer Zugriff korrekt konfiguriert ist.

  • Sie können öffentliche Git-Pakete in der Datei packages.yml angeben; private Git-Pakete werden jedoch nicht unterstützt.

  • Damit Snowflake auf die Repositorys für die Abhängigkeiten zugreifen kann, sind eine Netzwerkregel und eine Integration für den externen Zugriff erforderlich. Weitere Informationen dazu finden Sie unter Erstellen einer Integration für den externen Zugriff für dbt-Abhängigkeiten in Snowflake.

  • Ein dbt-Projektobjekt ist ein versionierter Snapshot Ihres Projekts. Wenn Sie den Befehl deps darauf ausführen, werden keine Dateien geändert. Dies wird in erster Linie verwendet, um zu überprüfen, ob Ihre Konfiguration des externen Zugriffs korrekt ist. Wenn ein dbt-Projektobjekt mit einer Integration für den externen Zugriff erstellt wird, wird dbt deps vor dbt compile ausgeführt, um alle Abhängigkeiten und Projektdateien zu verpacken.