Partilha de pacotes e arquivos de pacote

As organizações geralmente mantêm muitos pacotes e, nesses cenários de CI/CD mais avançados, esses pacotes compartilham configurações e arquivos comuns. Por exemplo, pacotes podem compartilhar bibliotecas armazenadas em um local compartilhado ou 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 completos de pacotes compartilhados estão no repositório GitHub de exemplos de pacotes.

Para melhores práticas adicionais de CI/CD e programadores, consulte fluxos de trabalho CI/CD em Databricks e melhores práticas para programadores em Databricks.

Estrutura do repositório

Uma prática comum, e recomendação da Databricks, é armazenar o código-fonte de vários bundles num único repositório com uma pasta partilhada.

Um exemplo de estrutura de repositório 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 das pastas de pacote) que contém:

  • Um ficheiro de código shared_library.py com o seguinte conteúdo:

    def multiply(a: int, b: int) -> int:
      return a * b
    
  • a 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 do pacote

É importante sempre validar a configuração do pacote, 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 adequadamente herdados e configurados, e gera informações sobre problemas para que você possa corrigi-los antes de implantá-los. Consulte databricks bundle validate.

Execute o seguinte comando para cada pacote antes de implantar:

databricks bundle validate

Permissões para pacotes compartilhados

Dentro de 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 ser capazes de visualizar os pacotes, alguns precisam ser capazes de implantar alterações de pacote e executar recursos no espaço de trabalho de desenvolvimento de destino, alguns poucos precisam ser capazes de implantar alterações de pacote e executar recursos em produção, e fluxos de trabalho automatizados que usam uma entidade de serviço precisam ser capazes de executar recursos em um pacote. Para garantir que seus pacotes compartilhados possam ser gerenciados de forma eficaz 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 de um pacote, consulte permissões.

Sugestão

Os Pacotes de Automação Declarativa no espaço de trabalho permitem a colaboração fácil em pacotes. Veja Colaborar em pacotes no espaço de trabalho.

Por exemplo, o databricks.yml para um pacote 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