Bundels en bundelbestanden delen

Organisaties onderhouden vaak veel bundels en in deze meer geavanceerde CI/CD-scenario's delen deze bundels algemene configuratie en bestanden. Bundels kunnen bijvoorbeeld bibliotheken delen die zijn opgeslagen op een gedeelde locatie, of rekeninstellingen en variabelen kunnen worden gedefinieerd in een configuratiebestand op een gedeelde locatie.

Dit artikel bevat informatie over het configureren van twee bundels voor het gebruik van configuratie en bestanden in een gedeelde map. Volledige voorbeelden van gedeelde bundels bevinden zich in de GitHub-opslagplaats met bundelvoorbeelden.

Raadpleeg voor aanvullende best practices voor CI/CD en ontwikkelaars CI/CD-workflows op Databricks en Best practices voor ontwikkelaars op Databricks.

Structuur van opslagplaats

Een veelvoorkomende procedure en de aanbeveling van Databricks is het opslaan van bron voor veel bundels in één opslagplaats met een gedeelde map.

Een voorbeeld van een opslagplaatsstructuur met meer dan één bundel kan zijn:

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

Configuratie voor het delen van bestanden

Als u codebestanden buiten een bundel wilt opnemen, geeft u deze op in de paths sleutel van de synchronisatietoewijzing.

Als u bijvoorbeeld een shared map in een opslagplaats (op hetzelfde niveau als bundelmappen) hebt die het volgende bevat:

  • een shared_library.py codebestand met de inhoud:

    def multiply(a: int, b: int) -> int:
      return a * b
    
  • a variables.yml met de inhoud:

    variables:
      cluster_id:
        default: 1234-567890-abcde123
    

Vervolgens is een bundelconfiguratie die gebruikmaakt van het gedeelde codebestand en de bundelvariabele die is gedefinieerd in de gedeelde configuratie:

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

Bundelvalidatie

Het is belangrijk om altijd uw bundelconfiguratie te valideren, en vooral als uw bundels bestanden en configuratie delen. De databricks bundle validate opdracht zorgt ervoor dat variabelen, bestanden en paden die in uw bundel zijn opgegeven, bestaan en correct worden overgenomen en geconfigureerd, en voert informatie uit over problemen, zodat u deze kunt corrigeren voordat u implementeert. Zie databricks-bundel valideren.

Voer de volgende opdracht uit voor elke bundel voordat u implementeert:

databricks bundle validate

Machtigingen voor gedeelde bundels

Binnen een organisatie worden bundels vaak ontwikkeld, geïmplementeerd en uitgevoerd door verschillende personen met verschillende verantwoordelijkheden en machtigingsniveaus. Mogelijk moeten alle gebruikers de bundels kunnen bekijken, sommigen moeten bundelwijzigingen kunnen implementeren en resources kunnen uitvoeren in de doelwerkruimte voor ontwikkeling, een selectie moet bundelwijzigingen kunnen implementeren en resources kunnen uitvoeren in productie, en geautomatiseerde werkstromen die gebruikmaken van een service-principal, resources in een bundel kunnen uitvoeren. Om ervoor te zorgen dat uw gedeelde bundels effectief kunnen worden beheerd door alle gebruikers in uw organisatie, stelt u machtigingen op het hoogste niveau en machtigingen voor productiedoel in. Zie machtigingen voor meer informatie over machtigingen op het hoogste niveau, die machtigingen toepassen op alle resources in een bundel.

Aanbeveling

Met declaratieve Automation-bundels in de werkruimte kunt u eenvoudig samenwerken aan bundels. Zie Samenwerken aan bundels in de werkruimte.

Het databricks.yml voor een gedeelde bundel kan bijvoorbeeld het volgende zijn:

# 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