Condividi tramite


Configurazione del bundle in Python

Il supporto python per i bundle di asset di Databricks estende i bundle di asset di Databricks con funzionalità aggiuntive che si applicano durante la distribuzione del bundle in modo che sia possibile:

La documentazione di riferimento per il supporto python per il pacchetto Databricks Asset Bundles databricks-bundles è disponibile all'indirizzo https://databricks.github.io/cli/python/.

Requisiti

Per usare il supporto python per i bundle di asset di Databricks, è prima necessario:

  1. Installare l'interfaccia della riga di comando di Databricks, versione 0.275.0 o successiva. Consulta Installare o aggiornare la CLI di Databricks.

  2. Eseguire l'autenticazione nell'area di lavoro di Databricks se non è già stato fatto:

    databricks configure
    
  3. Installare uv. Vedere Installazione di uv. Python per i bundle di asset di Databricks usa uv per creare un ambiente virtuale e installare le dipendenze necessarie. In alternativa, è possibile configurare l'ambiente Python usando altri strumenti, ad esempio venv.

Creare un progetto dal modello

Per creare un nuovo supporto Python per il progetto Asset Bundles di Databricks, inizializza un bundle usando il pydabs modello.

databricks bundle init pydabs

Quando richiesto, assegnare al progetto un nome, ad esempio my_pydabs_project, e accettare l'inclusione di un notebook e di un pacchetto Python.

Creare ora un nuovo ambiente virtuale nella nuova cartella del progetto:

cd my_pydabs_project
uv sync

Per impostazione predefinita, il modello include un esempio di processo definito come Python nel resources/my_pydabs_project_job.py file:

from databricks.bundles.jobs import Job


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

La Job.from_dict funzione accetta un dizionario Python usando lo stesso formato di YAML. Le risorse possono essere costruite anche usando la sintassi dataclass:

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


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

I file Python vengono caricati tramite un punto di ingresso specificato nella python sezione in databricks.yml:

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'

Per impostazione predefinita, resources/__init__.py contiene una funzione che carica tutti i file Python nel pacchetto resources.

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()

Distribuire ed eseguire processi o pipeline

Per distribuire il bundle nella destinazione di sviluppo, usare il comando bundle deploy dalla radice del progetto bundle:

databricks bundle deploy --target dev

Questo comando distribuisce tutti gli elementi definiti per il progetto bundle. Ad esempio, un progetto creato usando il modello predefinito distribuisce un processo denominato [dev yourname] my_pydabs_project_job nell'area di lavoro. È possibile trovare quel processo navigando verso Processi e Pipeline nell'area di lavoro di Databricks.

Dopo aver distribuito il bundle, è possibile usare il comando di riepilogo del bundle per esaminare tutti gli elementi distribuiti:

databricks bundle summary --target dev

Infine, per eseguire un processo o una pipeline, usare il comando bundle run:

databricks bundle run my_pydabs_project_job

Aggiornare i bundle esistenti

Per aggiornare i bundle esistenti, modellare la struttura del modello di progetto come descritto in Creare un progetto da un modello. È possibile aggiornare i bundle esistenti con YAML per includere le risorse definite come codice Python aggiungendo una python sezione in databricks.yml:

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'

L'ambiente virtuale specificato deve contenere il pacchetto PyPi databricks-bundles installato.

pip install databricks-bundles==0.275.0

La cartella resources deve contenere __init__.py file:

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()

Convertire incarichi esistenti in Python

Per convertire i processi esistenti in Python, è possibile usare la funzionalità Visualizza come codice . Vedi Visualizza le attività come codice.

  1. Apri la pagina del lavoro esistente nell'area di lavoro di Databricks.

  2. Fare clic sull'icona del menu Kebab. kebab a sinistra del pulsante Esegui ora , quindi fare clic su Visualizza come codice:

    Visualizza come voce di menu codice

  3. Selezionare Python e quindi Pacchetti di risorse Databricks

    Visualizzare come codice, Python

  4. Fare clic su Copia e salvare Python generato come file Python nella cartella resources del progetto bundle.

    Suggerimento

    È anche possibile visualizzare e copiare YAML per i processi e le pipeline esistenti che è possibile incollare direttamente nei file YAML di configurazione del bundle.

Creare risorse usando i metadati

L'implementazione predefinita della load_resources funzione carica i file Python nel resources pacchetto. È possibile usare Python per creare risorse a livello di codice. Ad esempio, è possibile caricare i file di configurazione e creare processi in un ciclo:

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

Accedere alle variabili del bundle

Le sostituzioni di bundle e le variabili personalizzate consentono il recupero dinamico dei valori in modo che le impostazioni possano essere determinate al momento della distribuzione e dell'esecuzione di un bundle in una destinazione. Per informazioni sulle variabili di aggregazione, vedere Variabili personalizzate.

In Python definire le variabili e quindi usare il bundle parametro per accedervi. Vedere @variables Decorator, Variable, Bundle e Resources.

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

@variables
class Variables:
    # Define a variable
    warehouse_id: Variable[str]


def load_resources(bundle: Bundle) -> Resources:
    # Resolve the variable
    warehouse_id = bundle.resolve_variable(Variables.warehouse_id)

    ...

È anche possibile accedere alle variabili in Python usando le sostituzioni.

sample_job = Job.from_dict(
    {
        "name": "sample_job",
        "tasks": [
            {
                "task_key": "my_sql_query_task",
                "sql_task": {
                    "warehouse_id": "${var.warehouse_id}",
                    "query": {
                        "query_id": "11111111-1111-1111-1111-111111111111",
                    },
    ...

Usare le sostituzioni di destinazione per impostare i valori delle variabili per destinazioni di distribuzione diverse.

Modificare le risorse definite in YAML o Python

Per modificare le risorse, è possibile fare riferimento a funzioni mutatore in databricks.yml, in modo analogo alle funzioni che caricano le risorse. Questa funzionalità può essere usata indipendentemente dal caricamento delle risorse definite in Python e modifica le risorse definite sia in YAML che in Python.

Prima di tutto, crea mutators.py nella radice del bundle con il seguente contenuto:

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)

Ora utilizzate la seguente configurazione per eseguire la funzione durante la distribuzione del add_email_notifications bundle. Questo aggiorna ogni lavoro definito nel bundle aggiungendo notifiche via email, se mancanti. Le funzioni mutator devono essere specificate in databricks.ymle vengono eseguite nell'ordine specificato. I modificatori di processo vengono eseguiti per ogni processo definito in un bundle e possono restituire una copia aggiornata o un input non modificato. I modificatori possono essere usati anche per altri campi, ad esempio la configurazione di cluster di processi predefiniti o sql warehouse.

python:
  mutators:
    - 'mutators:add_email_notifications'

Se le funzioni generano un'eccezione durante l'esecuzione del mutatore, la distribuzione del bundle viene interrotta.

Suggerimento

Per configurare i set di impostazioni per le destinazioni (ad esempio, per annullare la visualizzazione delle pianificazioni per la prod destinazione), usare le modalità di distribuzione e i set di impostazioni. Vedere impostazioni predefinite personalizzate.

Risorse aggiuntive