Compartilhamento de pacotes e arquivos de pacote

As organizações geralmente mantêm muitos pacotes e, nesses cenários mais avançados de CI/CD, esses pacotes compartilham arquivos e configurações comuns. Por exemplo, os pacotes podem compartilhar bibliotecas armazenadas em um local compartilhado ou as configurações e variáveis de computação podem ser definidas em um arquivo de configuração em um local compartilhado.

Este artigo fornece informações sobre como configurar dois pacotes para usar a configuração e os arquivos em uma pasta compartilhada. Exemplos de pacote compartilhado completos estão no repositório GitHub de exemplos de pacote.

Para conhecer mais práticas recomendadas para CI/CD e para desenvolvedores, consulte Fluxos de trabalho de CI/CD no Databricks e Práticas recomendadas para desenvolvedores no Databricks.

Estrutura do repositório

Uma prática comum e a recomendação do Databricks é armazenar a origem de muitos pacotes em um repositório com uma pasta compartilhada.

Uma estrutura de repositório de exemplo com mais de um pacote pode ser:

databricks-bundle-repo/
├── shared
│   ├── variables.yml           # has variable definitions like cluster_id
│   └── shared_library.py       # has shared code used in multiple bundles
├── job_bundle
│   ├── databricks.yml          # uses ${var.cluster_id} defined in variables.yml
│   ├── resources/
│   │   └── job_bundle.job.yml
│   ├── src/
│   │   ├── notebook.ipynb
│   │   └── my_python.py        # uses ../shared/shared_library.py
│   └── README.md
├── pipeline_bundle
│   ├── databricks.yml
│   ├── resources/
│   │   ├── pipeline_bundle.job.yml      # uses ${var.cluster_id} defined in variables.yml
│   │   └── pipeline_bundle.pipeline.yml
│   ├── src/
│   │   └── my_pipeline.ipynb
│   └── README.md

Configuração para compartilhamento de arquivos

Para incluir arquivos de código fora de um pacote, especifique-os paths na chave do mapeamento de sincronização.

Por exemplo, dada uma shared pasta em um repositório (no mesmo nível que pastas de pacote) que contém:

  • um shared_library.py arquivo de código com o conteúdo:

    def multiply(a: int, b: int) -> int:
      return a * b
    
  • um variables.yml com o conteúdo:

    variables:
      cluster_id:
        default: 1234-567890-abcde123
    

Em seguida, uma configuração de pacote que usa o arquivo de código compartilhado e a variável de pacote definida na configuração compartilhada seria:

# databricks.yml

bundle:
  name: job_bundle

sync:
  paths:
    - ../shared
    - ./src

include:
  - resources/*.yml
  - ../shared/*.yml

targets:
  dev:
    mode: development
    default: true
    workspace:
      host: https://my-workspace.cloud.databricks.com

  prod:
    mode: production
    workspace:
      host: https://my-workspace.cloud.databricks.com
      root_path: /Workspace/Users/someone@example.com/.bundle/${bundle.name}/${bundle.target}
    permissions:
      - user_name: someone@example.com
        level: CAN_MANAGE
# job_bundle.yml

resources:
  jobs:
    my_python_job:
      name: my_python_job
        tasks:
          - task_key: python_task
            spark_python_task:
              python_file: src/my_python.py   # uses ../shared/shared_library.py
    my_notebook_job:
      name: my_notebook_job
        tasks:
          - task_key: notebook_task
            existing_cluster_id: ${var.cluster_id}   # defined in ../shared/variables.yml
            notebook_task:
              notebook_path: src/notebook.ipynb
# my_python.py

import os
import sys

# Traverse to the sync root path.
# Note: this requires :re[DBR] >= 14 or serverless.
shared_path = os.getcwd() + "/../../shared"

# Add the shared directory to the Python path.
sys.path.append(shared_path)

# Import a function from shared_library.py
from shared_library import multiply

# Use the function.
result = multiply(2, 3)
print(result)

Validação de pacotes

É importante sempre validar a configuração do pacote e, especialmente, se os pacotes compartilharem arquivos e configuração. O databricks bundle validate comando garante que variáveis, arquivos e caminhos especificados em seu pacote existam e sejam herdados e configurados corretamente e gera informações sobre problemas para que você possa corrigi-los antes da implantação. Confira a validação do pacote do Databricks.

Execute o seguinte comando para cada pacote antes de implantar:

databricks bundle validate

Permissões para pacotes compartilhados

Em uma organização, os pacotes geralmente são desenvolvidos, implantados e executados por diferentes indivíduos com diferentes responsabilidades e níveis de permissão. Todos os usuários podem precisar visualizar os pacotes; alguns precisam ser capazes de implantar alterações nos pacotes e executar recursos no espaço de trabalho de desenvolvimento de destino; um grupo seleto precisa ser capaz de implantar alterações nos pacotes e executar recursos em produção; e fluxos de trabalho automatizados que usam uma entidade de segurança de serviço precisam ser capazes de executar recursos em um pacote. Para garantir que seus pacotes compartilhados possam ser gerenciados efetivamente por todos os usuários em sua organização, defina permissões de nível superior, bem como permissões de destino de produção. Para obter informações sobre permissões de nível superior, que aplicam permissões a todos os recursos em um pacote, consulte permissões.

Dica

Os Pacotes de Automação Declarativa no workspace permitem uma colaboração fácil em pacotes. Consulte Colaborar em pacotes no workspace.

Por exemplo, o pacote databricks.yml compartilhado pode ser:

# databricks.yml

bundle:
  name: shared_bundle

include:
  - resources/*.yml

permissions:
  - level: CAN_VIEW
    group_name: all_users
  - level: CAN_MANAGE
    group_name: data_engineering_users
  - level: CAN_RUN
    service_principal_name: 123456-abcdef

targets:
  dev:
    mode: development
    default: true
    workspace:
      host: https://my-workspace.cloud.databricks.com

  prod:
    mode: production
    workspace:
      host: https://my-workspace.cloud.databricks.com
      root_path: /Workspace/Users/someone@example.com/.bundle/${bundle.name}/${bundle.target}
    permissions:
      - user_name: someone@example.com
        level: CAN_MANAGE