Freigeben über


Konfiguration in Python

Wichtig

Python-Unterstützung für Databricks Asset Bundles befindet sich in der öffentlichen Vorschau.

Python für Databricks Asset Bundles erweitert Databricks Asset Bundles so, dass Sie:

Referenzdokumentation für die Python-Unterstützung für Databricks Asset Bundles databricks-bundles package ist unter https://databricks.github.io/cli/experimental/python/.

Anforderungen

Um python-Unterstützung für Databricks Asset Bundles zu verwenden, müssen Sie zuerst:

  1. Installieren Sie databricks CLI, Version 0.248.0 oder höher. Weitere Informationen finden Sie unter Installieren oder Aktualisieren der Databricks CLI.

  2. Authentifizieren Sie sich bei Ihrem Databricks-Arbeitsbereich, wenn Sie dies noch nicht getan haben:

    databricks configure
    
  3. Installieren Sie uv. Siehe Installieren von UV. Python für Databricks Asset Bundles verwendet uv, um eine virtuelle Umgebung zu erstellen und die erforderlichen Abhängigkeiten zu installieren. Alternativ können Sie Ihre Python-Umgebung mit anderen Tools wie venv konfigurieren.

Erstellen eines Projekts aus der Vorlage

Um eine neue Python-Unterstützung für das Projekt "Databricks Asset Bundles" zu erstellen, initialisieren Sie ein Bündel mithilfe der experimental-jobs-as-code Vorlage:

databricks bundle init experimental-jobs-as-code

Wenn Sie dazu aufgefordert werden, geben Sie Ihrem Projekt einen Namen, wie my_jobs_as_code_project, und akzeptieren Sie die Aufnahme eines Notebooks und eines Python-Pakets.

Erstellen Sie nun eine neue virtuelle Umgebung in Ihrem neuen Projektordner:

cd my_jobs_as_code_project
uv sync

Standardmäßig enthält die Vorlage ein Beispiel für einen Auftrag, der in der resources/my_jobs_as_code_project_job.py Datei als Python definiert ist:

from databricks.bundles.jobs import Job


my_jobs_as_code_project_job = Job.from_dict(
    {
        "name": "my_jobs_as_code_project_job",
        "tasks": [
            {
                "task_key": "notebook_task",
                "notebook_task": {
                    "notebook_path": "src/notebook.ipynb",
                },
            },
        ],
    },
)

Die Job.from_dict Funktion akzeptiert ein Python-Wörterbuch mit demselben Format wie YAML. Aufträge können auch mithilfe der Datenklassensyntax erstellt werden:

from databricks.bundles.jobs import Job, Task, NotebookTask


my_jobs_as_code_project_job = Job(
    name="my_jobs_as_code_project_job",
    tasks=[
        Task(
            task_key="notebook_task",
            notebook_task=NotebookTask(
                notebook_path="src/notebook.ipynb",
            ),
        ),
    ],
)

Python-Dateien werden durch einen Einstiegspunkt geladen, der im experimental-Abschnitt in databricks.yml angegeben ist.

experimental:
  python:
    # Activate the virtual environment before loading resources defined in
    # Python. If disabled, it defaults to using the Python interpreter
    # available in the current shell.
    venv_path: .venv
    # Functions called to load resources defined in Python.
    # See resources/__init__.py
    resources:
      - 'resources:load_resources'

Enthält standardmäßig eine Funktion, resources/__init__.py die alle Python-Dateien im Ressourcenpaket lädt.

from databricks.bundles.core import (
    Bundle,
    Resources,
    load_resources_from_current_package_module,
)


def load_resources(bundle: Bundle) -> Resources:
    """
    'load_resources' function is referenced in databricks.yml and is responsible for loading
    bundle resources defined in Python code. This function is called by Databricks CLI during
    bundle deployment. After deployment, this function is not used.
    """

    # the default implementation loads all Python files in 'resources' directory
    return load_resources_from_current_package_module()

Bereitstellen und Ausführen von Aufträgen oder Pipelines

Um das Bundle im Entwicklungsziel bereitzustellen, verwenden Sie den Befehl "Bundle bereitstellen " aus dem Stammverzeichnis des Bundleprojekts:

databricks bundle deploy --target dev

Mit diesem Befehl werden alle für das Bundleprojekt definierten Elemente bereitgestellt. Beispielsweise wird bei einem Projekt, das mit der Standardvorlage erstellt wird, ein Auftrag namens [dev yourname] my_jobs_as_code_project_job in Ihrem Arbeitsbereich bereitgestellt. Sie finden diesen Auftrag, indem Sie in Ihrem Databricks-Arbeitsbereich zu Aufträgen und Pipelines navigieren.

Nachdem das Bundle bereitgestellt wurde, können Sie den Zusammenfassungsbefehl des Bundles verwenden, um alles zu überprüfen, was bereitgestellt wird:

databricks bundle summary --target dev

Um einen Auftrag oder eine Pipeline auszuführen, verwenden Sie schließlich den Befehl zum Ausführen des Bundles:

databricks bundle run my_jobs_as_code_project_job

Aktualisieren vorhandener Bundles

Um vorhandene Bündel zu aktualisieren, modellieren Sie die Projektvorlagenstruktur wie unter Erstellen eines Projekts aus einer Vorlage beschrieben. Vorhandene Bündel mit YAML können aktualisiert werden, um Aufträge oder Pipelines einzuschließen, die als Python-Code definiert sind, indem sie einen experimental.python Abschnitt hinzufügen in databricks.yml:

experimental:
  python:
    # Activate the virtual environment before loading resources defined in
    # Python. If disabled, it defaults to using the Python interpreter
    # available in the current shell.
    venv_path: .venv
    # Functions called to load resources defined in Python.
    # See resources/__init__.py
    resources:
      - 'resources:load_resources'

Die angegebene virtuelle Umgebung muss das installierte "databricks-bundles PyPi"-Paket enthalten.

pip install databricks-bundles==0.248.0

Der Ressourcenordner muss eine Datei enthalten __init__.py :

from databricks.bundles.core import (
    Bundle,
    Resources,
    load_resources_from_current_package_module,
)


def load_resources(bundle: Bundle) -> Resources:
    """
    'load_resources' function is referenced in databricks.yml and
    is responsible for loading bundle resources defined in Python code.
    This function is called by Databricks CLI during bundle deployment.
    After deployment, this function is not used.
    """

    # default implementation loads all Python files in 'resources' folder
    return load_resources_from_current_package_module()

Konvertieren vorhandener Aufträge in Python

Um vorhandene Aufträge in Python zu konvertieren, können Sie das Feature "Als Code anzeigen" verwenden. Siehe Anzeigen von Aufträgen als Code.

  1. Öffnen Sie eine Auftragsseite in Databricks-Workflows.
  2. Klicken Sie links neben der Schaltfläche " Jetzt ausführen " auf den Kebab, und klicken Sie dann auf "Als Code anzeigen":

Als Codemenüelement anzeigen

  1. Wählen Sie Python und dann Databricks Asset Bundles aus.

Als Code anzeigen, Python

  1. Klicken Sie auf "Kopieren ", und speichern Sie die generierte Python-Datei als Python-Datei im Ressourcenordner des Bundleprojekts.

Tipp

Sie können YAML auch für vorhandene Aufträge und Pipelines anzeigen und kopieren, die Sie direkt in Ihre Bündelkonfigurations-YAML-Dateien einfügen können.

Erstellen von Ressourcen mithilfe von Metadaten

Die Standardimplementierung der load_resources Funktion lädt Python-Dateien im resources Paket. Sie können Python verwenden, um Ressourcen programmgesteuert zu erstellen. Sie können beispielsweise Konfigurationsdateien laden und Aufträge in einer Schleife erstellen:

from databricks.bundles.core import (
    Bundle,
    Resources,
    load_resources_from_current_package_module,
)


from databricks.bundles.jobs import Job


def create_job(country: str):
    my_notebook = {
        "task_key": "my_notebook",
        "notebook_task": {
            "notebook_path": "files/my_notebook.py",
        },
    }


    return Job.from_dict(
        {
            "name": f"my_job_{country}",
            "tasks": [my_notebook],
        }
    )


def load_resources(bundle: Bundle) -> Resources:
    resources = load_resources_from_current_package_module()


    for country in ["US", "NL"]:
        resources.add_resource(f"my_job_{country}", create_job(country))


    return resources

Zugriff auf Bündelvariablen

Der bundle Parameter kann für den Zugriff auf Bundlevariablen und das Bereitstellungsziel verwendet werden:

from databricks.bundles.core import Bundle, Resources, Variable, variables

@variables
class Variables:
    warehouse_id: Variable[str]


def load_resources(bundle: Bundle) -> Resources:
    warehouse_id = bundle.resolve_variable(Variables.warehouse_id)

    ...

Weitere Informationen finden Sie in der Ressourcen - und Bundle-Klassenreferenz .

Ändern von Aufträgen, die in YAML oder Python definiert sind

Sie können auf Auftragsmutatorfunktionen in databricks.yml verweisen, ähnlich wie bei Funktionen, die Ressourcen laden. Dieses Feature kann unabhängig von in Python definierten Ladeaufträgen verwendet werden und verändert Ressourcen, die sowohl in YAML als auch in Python definiert sind.

Erstellen Sie zunächst mutators.py im Stammverzeichnis des Bundle mit dem folgenden Inhalt:

from dataclasses import replace


from databricks.bundles.core import Bundle, job_mutator
from databricks.bundles.jobs import Job, JobEmailNotifications


@job_mutator
def add_email_notifications(bundle: Bundle, job: Job) -> Job:
    if job.email_notifications:
        return job


    email_notifications = JobEmailNotifications.from_dict(
        {
            "on_failure": ["${workspace.current_user.userName}"],
        }
    )


    return replace(job, email_notifications=email_notifications)

Verwenden Sie nun die folgende Konfiguration, um die add_email_notifications Funktion während der Bundlebereitstellung auszuführen. Dadurch wird jeder im Bundle definierte Auftrag mit E-Mail-Benachrichtigungen aktualisiert, wenn sie fehlen. Mutatorfunktionen müssen in databricks.yml angegeben und in der angegebenen Reihenfolge ausgeführt werden. Job-Mutatoren werden für jeden in einem Paket definierten Auftrag ausgeführt und können entweder eine aktualisierte Kopie oder den unveränderten Eingang zurückgeben. Mutatoren können auch für andere Felder verwendet werden, z. B. das Konfigurieren von Standardauftragsclustern oder SQL-Lagerhäusern.

experimental:
  python:
    mutators:
      - 'mutators:add_email_notifications'

Wenn Funktionen während der Mutatorausführung eine Ausnahme auslösen, wird die Bundlebereitstellung abgebrochen.