Anpassen von Containern mit Databricks-Containerdiensten

Mit Databricks Container Services können Sie ein Docker-Image angeben, wenn Sie Compute erstellen. Im Folgenden finden Sie einige Beispiele für Anwendungsfälle:

  • Bibliotheksanpassung: Sie haben die vollständige Kontrolle über die Systembibliotheken, die Sie installieren möchten.
  • Goldene Containerumgebung: Ihr Docker-Image ist eine gesperrte Umgebung, die sich nie ändert.
  • CI/CD-Integration (Docker): Sie können Azure Databricks mit CI/CD-Pipelines von Docker integrieren.

Sie können Docker-Images auch verwenden, um benutzerdefinierte Deep-Learning-Umgebungen für Berechnungen mit GPU-Geräten zu erstellen. Weitere Informationen zur Verwendung von GPU-Compute mit Databricks-Containerdiensten finden Sie unter Databricks-Containerdienste in GPU-Compute.

Verwenden Sie ein Init-Skript für Aufgaben, die bei jedem Containerstart ausgeführt werden sollen.

Anforderungen

  • Databricks-Containerdienste müssen für Ihren Azure Databricks-Arbeitsbereich aktiviert sein.
  • Auf Ihrem Computer muss ein aktueller Docker-Daemon ausgeführt werden (einer, der getestet wurde und mit der Client- bzw. Serverversion 18.03.0-ce funktioniert). Zudem muss der docker-Befehl in Ihrem PATH verfügbar sein.

Begrenzungen

  • Databricks Container Services wird nicht bei Berechnungen mit gemeinsamem Zugriffsmodus unterstützt.
  • Databricks Runtime für Machine Learning unterstützt keine Databricks-Containerdienste.
  • Um auf Volumes für Databricks-Containerdienste zuzugreifen, fügen Sie die folgende Konfiguration zum Spark config-Feld der Berechnung hinzu: spark.databricks.unityCatalog.volumes.enabled true.

Schritt 1: Erstellen Ihrer Basis

Databricks empfiehlt, dass Sie Ihre Docker-Basis aus einer Basis erstellen, die Databricks erstellt und getestet hat. Es ist auch möglich, Ihre Docker-Basis von Grund auf neu zu erstellen. In diesem Abschnitt werden die beiden Optionen beschrieben.

Option 1. Verwenden einer von Databricks erstellten Basis

In diesem Beispiel wird das Tag 9.x für ein Image verwendet, das auf eine Computeressource mit der Runtimeversion der Databricks Runtime 9.1 LTS und höher abzielt:

FROM databricksruntime/standard:9.x
...

Um zusätzliche Python-Bibliotheken anzugeben (z. B. die neueste Version von pandas und urllib), verwenden Sie die containerspezifische Version von pip. Geben Sie für den Container databricksruntime/standard:9.x Folgendes an:

RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3

Geben Sie für den Container databricksruntime/standard:8.x oder niedriger Folgendes an:

RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3

Basisimages werden auf Docker Hub unter https://hub.docker.com/u/databricksruntime gehostet. Die Dockerfiles, die zum Generieren dieser Basisimages verwendet werden, befinden sich unter https://github.com/databricks/containers.

Hinweis

In Docker Hub gehostete Images mit Tags mit dem Suffix „-LTS“ werden gepatcht. Alle anderen Images sind Beispiele und werden nicht regelmäßig gepatcht.

Hinweis

Die Basisimages databricksruntime/standard und databricksruntime/minimal dürfen nicht mit den nicht in Verbindung stehenden Umgebungen databricks-standard und databricks-minimal verwechselt werden, die in der nicht mehr verfügbaren Databricks Runtime-Version mit Conda (Beta) verfügbar sind.

Option 2. Erstellen einer eigenen Docker-Basis

Sie können Ihre Docker-Basis auch von Grund auf neu erstellen. Das Docker-Image muss die folgenden Anforderungen erfüllen:

Um Ihr eigenes Image von Grund auf neu zu erstellen, müssen Sie die virtuelle Umgebung erstellen. Sie müssen auch Pakete einbinden, die in Databricks Compute integriert sind, wie z. B. Python und R. Für den Anfang können Sie das entsprechende Basis-Image verwenden:

  • Für R: databricksruntime/rbase
  • Für Python: databricksruntime/python
  • Für das minimale Image, das von Databricks erstellt wird: databricksruntime/minimal

Sie können auch auf die Beispiel-Dockerfiles in GitHub verweisen.

Hinweis

Databricks empfiehlt die Verwendung von Ubuntu Linux. Es ist jedoch möglich, Alpine Linux zu verwenden. Um Alpine Linux verwenden zu können, müssen Sie die folgenden Dateien einschließen:

Darüber hinaus müssen Sie Python wie im Beispieldockerfile gezeigt einrichten.

Warnung

Testen Sie Ihr benutzerdefiniertes Container-Image gründlich auf einem Azure Databricks-Compute. Ihr Container kann auf einem lokalen oder Build-Computer funktionieren, aber wenn Ihr Container auf Azure Databricks gestartet wird, kann der Rechenstart fehlschlagen, bestimmte Funktionen können deaktiviert werden, oder Ihr Container kann aufhören zu funktionieren, sogar lautlos. Im schlimmsten Fall können Ihre Daten beschädigt oder versehentlich für externe Parteien freigegeben werden.

Schritt 2: Pushen des Basisimage

Pushen Sie Ihr benutzerdefiniertes Basisimage an eine Docker-Registrierung. Dieser Prozess wird für die folgenden Registrierungen unterstützt:

Andere Docker-Registrierungen, die keine Authentifizierung bzw. die Basisauthentifizierung unterstützen, funktionieren ebenfalls.

Hinweis

Wenn Sie Docker Hub für Ihre Docker-Registry verwenden, stellen Sie sicher, dass die Ratengrenzwerte der Menge an Datenverarbeitung entsprechen, die Sie in einem Zeitraum von sechs Stunden starten möchten. Diese Ratenbeschränkungen unterscheiden sich bei anonymen Benutzer*innen, authentifizierten Benutzer*innen ohne kostenpflichtiges Abonnement und kostenpflichtigen Abonnements. Weitere Informationen finden Sie in der Dokumentation zu Docker. Wenn dieser Grenzwert überschritten wird, erhalten Sie die Antwort „429 – Zu viele Anforderungen“.

Schritt 3: Starten Ihrer Berechnung

Sie können Ihre Berechnung über die Benutzeroberfläche oder die API starten.

Starten der Berechnung mithilfe der Benutzeroberfläche

  1. Geben Sie auf der Berechnung erstellen Seite eine Databricks Runtime Version an, die Databricks Container Services unterstützt.

  2. Wählen Sie unter Erweiterte Optionen die Registerkarte Docker aus.

  3. Klicken Sie auf Use your own Docker container (Eigenen Docker-Container verwenden).

  4. Geben Sie im Feld URL des Docker-Images Ihr benutzerdefiniertes Docker-Image ein.

    Beispiele für die URL des Docker-Images:

    Registrierung Tagformat
    Docker Hub <organization>/<repository>:<tag> (Beispiel: databricksruntime/standard:latest)
    Azure Container Registry <your-registry-name>.azurecr.io/<repository-name>:<tag>
  5. Wählen Sie den Authentifizierungstyp aus.

Starten der Berechnung mithilfe der API

  1. Generieren Sie ein API-Token.

  2. Verwenden Sie die Cluster-API, um eine Berechnung mit Ihrer benutzerdefinierten Docker-Basis zu starten.

    curl -X POST -H "Authorization: Bearer <token>" https://<databricks-instance>/api/2.0/clusters/create -d '{
      "cluster_name": "<cluster-name>",
      "num_workers": 0,
      "node_type_id": "Standard_DS3_v2",
      "docker_image": {
        "url": "databricksruntime/standard:latest",
        "basic_auth": {
          "username": "<docker-registry-username>",
          "password": "<docker-registry-password>"
        }
      },
      "spark_version": "7.3.x-scala2.12",
    }'
    

    Die basic_auth-Anforderungen hängen vom Docker-Imagetyp ab:

    • Schließen Sie bei öffentlichen Docker-Images das -Feld nichtbasic_auth ein.
    • Bei privaten Docker-Images müssen Sie das Feld basic_auth mithilfe einer Dienstprinzipal-ID und einem Kennwort als Benutzername und Kennwort einschließen.
    • Für Azure Container Registry müssen Sie das basic_auth-Feld auf die ID und das Kennwort für einen Dienstprinzipal festlegen. Weitere Informationen zum Erstellen des Dienstprinzipals finden Sie unter Azure Container Registry-Authentifizierung mit Dienstprinzipalen.

Verwenden eines Initialisierungsskripts

Databricks Container Services ermöglichen es Kunden, Init-Skripte in den Docker-Container einzubinden. In den meisten Fällen sollten Sie Init-Skripts vermeiden und stattdessen Anpassungen direkt über Docker vornehmen (mithilfe des Dockerfile). Bestimmte Aufgaben müssen jedoch beim Starten des Containers und nicht beim Erstellen ausgeführt werden. Verwenden Sie ein Init-Skript für diese Aufgaben.

Angenommen, Sie möchten einen Sicherheitsdaemon in einem benutzerdefinierten Container ausführen. Installieren und erstellen Sie den Daemon im Docker-Image über Ihre Imagebuildpipeline. Fügen Sie dann ein Init-Skript hinzu, das den Daemon startet. In diesem Beispiel würde das Init-Skript eine Zeile wie systemctl start my-daemon enthalten.

In der API können Sie Init-Skripte als Teil der Berechnungsspezifikation wie folgt angeben. Weitere Informationen finden Sie in der Cluster-API.

"init_scripts": [
    {
        "file": {
            "destination": "file:/my/local/file.sh"
        }
    }
]

Für Databricks-Containerdienstimages können Sie auch Init-Skripts im Cloudspeicher speichern.

Die folgenden Schritte finden statt, wenn Sie eine Berechnung starten, die Databricks Container Services verwendet:

  1. VMs werden vom Cloudanbieter bezogen.
  2. Das benutzerdefinierte Docker-Image wird aus Ihrem Repository heruntergeladen.
  3. Azure Databricks erstellt einen Docker-Container aus dem Image.
  4. Databricks Runtime-Code wird in den Docker-Container kopiert.
  5. Die Initskripts werden ausgeführt. Weitere Informationen finden Sie unter Was sind Initskripts?.

Azure Databricks ignoriert die Docker-Primitive CMD und ENTRYPOINT.

Aktivieren von Containerdiensten

Um benutzerdefinierte Container bei Ihrer Berechnung zu verwenden, muss ein Workspace-Administrator Databricks Container Services aktivieren.

Arbeitsbereichsadministrator*innen können Databricks-Containerdienste mithilfe der Arbeitsbereichskonfigurations-API aktivieren. Geben Sie für enableDcs in einem JSON-Anforderungstext den Wert true an, wie im folgenden Beispiel angezeigt:

curl -X PATCH -n \
  https://<databricks-instance>/api/2.0/workspace-conf \
  -d '{
    "enableDcs": "true"
    }'