Udostępnij przez


Konfiguracja pakietu w języku Python

Pakiety zasobów języka Python dla usługi Databricks rozszerzają pakiety zasobów usługi Databricks , dzięki czemu można wykonywać następujące czynności:

Dokumentacja referencyjna dotycząca obsługi Pythona dla pakietu databricks-bundles usługi Databricks jest dostępna pod adresem https://databricks.github.io/cli/python/.

Wymagania

Aby korzystać z obsługi języka Python dla pakietów zasobów usługi Databricks, musisz najpierw:

  1. Zainstaluj interfejs wiersza polecenia usługi Databricks w wersji 0.275.0 lub nowszej. Zobacz Instalowanie lub aktualizowanie interfejsu wiersza poleceń Databricks.

  2. Uwierzytelnij się w obszarze roboczym usługi Databricks, jeśli jeszcze tego nie zrobiono:

    databricks configure
    
  3. Zainstaluj uv. Zobacz Instalowanie uv. Pakiety zasobów Databricks w języku Python wykorzystują uv do tworzenia środowiska wirtualnego i instalowania niezbędnych zależności. Alternatywnie możesz skonfigurować środowisko języka Python przy użyciu innych narzędzi, takich jak venv.

Tworzenie projektu na podstawie szablonu

Aby utworzyć nową obsługę Pythona dla projektu Zestawów Zasobów Databricks, zainicjuj pakiet przy użyciu szablonu pydabs :

databricks bundle init pydabs

Po wyświetleniu monitu nadaj projektowi nazwę, taką jak my_pydabs_project, i zaakceptuj dołączenie notesu i pakietu języka Python.

Teraz utwórz nowe środowisko wirtualne w nowym folderze projektu:

cd my_pydabs_project
uv sync

Domyślnie szablon zawiera przykład zadania zdefiniowanego jako Python w resources/my_pydabs_project_job.py pliku:

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",
                },
            },
        ],
    },
)

Funkcja Job.from_dict akceptuje słownik języka Python przy użyciu tego samego formatu co YAML. Zasoby można również tworzyć przy użyciu składni klasy danych:

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",
            ),
        ),
    ],
)

Pliki języka Python są ładowane za pośrednictwem punktu wejścia określonego w sekcji python w 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'

Domyślnie zawiera funkcję, resources/__init__.py która ładuje wszystkie pliki języka Python w pakiecie zasobów.

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

Wdrażanie i uruchamianie zadań lub potoków

Aby wdrożyć pakiet do środowiska deweloperskiego, użyj polecenia bundle deploy z katalogu głównego projektu pakietu.

databricks bundle deploy --target dev

To polecenie umożliwia wdrożenie wszystkich elementów zdefiniowanych dla projektu pakietu. Na przykład projekt utworzony przy użyciu szablonu domyślnego wdraża zadanie o nazwie [dev yourname] my_pydabs_project_job w obszarze roboczym. Zadanie można znaleźć, przechodząc do Zadania i Potoki w obszarze roboczym Databricks.

Po wdrożeniu pakietu możesz użyć polecenia podsumowania pakietu , aby przejrzeć wszystkie wdrożone elementy:

databricks bundle summary --target dev

Na koniec, aby uruchomić zadanie lub potok, użyj polecenia bundle run:

databricks bundle run my_pydabs_project_job

Aktualizowanie istniejących pakietów

Aby zaktualizować istniejące pakiety, należy modelować strukturę szablonu projektu zgodnie z opisem w temacie Tworzenie projektu na podstawie szablonu. Istniejące pakiety z kodem YAML można zaktualizować w celu uwzględnienia zasobów zdefiniowanych jako kod języka Python, dodając sekcję python w pliku 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'

Określone środowisko wirtualne musi zawierać zainstalowany pakiet PyPi databricks-bundles.

pip install databricks-bundles==0.275.0

Folder resources musi zawierać plik __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()

Konwertowanie istniejących zadań na język Python

Aby przekonwertować istniejące zadania na język Python, możesz użyć funkcji Wyświetl jako kod . Zobacz Wyświetlanie zadań jako kodu.

  1. Otwórz stronę aktualnego zadania w środowisku pracy usługi Databricks.

  2. Kliknij kebab po lewej stronie przycisku Uruchom teraz , a następnie kliknij pozycję Wyświetl jako kod:

    Wyświetl jako element menu kodu

  3. Wybierz Python, a następnie Pakiety zasobów Databricks

    Wyświetl jako kod, Python

  4. Kliknij Kopiuj i zapisz wygenerowany plik Python w folderze resources projektu zbiorczego.

    Wskazówka

    Możesz również wyświetlać i kopiować kod YAML dla istniejących zadań i potoków, które można wkleić bezpośrednio do plików YAML konfiguracji pakietu.

Tworzenie zasobów przy użyciu metadanych

Domyślna implementacja load_resources funkcji ładuje pliki języka Python w pakiecie resources . Język Python umożliwia programowe tworzenie zasobów. Można na przykład załadować pliki konfiguracji i utworzyć zadania w pętli:

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

Zmienne pakietu programu Access

Parametr bundle może być używany do uzyskiwania dostępu do zmiennych pakietu i celu wdrożenia.

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)

    ...

Aby uzyskać więcej informacji, zobacz dokumentację klasy Resources oraz Bundle.

Modyfikowanie zasobów zdefiniowanych w języku YAML lub Python

Można odwoływać się do funkcji mutatora w databricks.yml, podobnie jak do funkcji ładujących zasoby. Ta funkcja może być używana niezależnie od ładowania zasobów zdefiniowanych w języku Python i modyfikowania zasobów definiowanych zarówno w YAML, jak i w Pythonie.

Najpierw utwórz mutators.py w katalogu głównym pakietu z następującą zawartością.

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)

Teraz użyj następującej konfiguracji, aby wykonać add_email_notifications funkcję podczas wdrażania pakietu. Aktualizuje każde zadanie zdefiniowane w pakiecie, dodając powiadomienia e-mail, jeśli ich brakuje. Funkcje mutatora muszą być określone w elemencie databricks.yml i wykonywane są w określonej kolejności. Mutatory zadań są wykonywane dla każdego zadania zdefiniowanego w pakiecie i mogą zwracać zaktualizowaną kopię lub niezmodyfikowane dane wejściowe. Mutatory mogą być również używane w innych polach, takich jak konfigurowanie domyślnych klastrów zadań lub magazynów SQL.

python:
  mutators:
    - 'mutators:add_email_notifications'

Jeśli funkcje zgłaszają wyjątek podczas wykonywania mutatora, wdrożenie pakietu zostanie przerwane.