Provider di risorse Pulumi Databricks
Nota
Questo articolo illustra Pulumi, che non è fornito né supportato da Databricks. Per contattare il provider, vedere Supporto di Pulumi.
Questo articolo illustra come usare Python e Pulumi, una piattaforma IaC (Infrastructure as Code) di terze parti che consente di creare, distribuire e gestire risorse di Azure Databricks usando linguaggi di programmazione, strumenti e procedure di progettazione familiari. Anche se questo articolo illustra come usare Python e il provider di risorse Pulumi Databricks, Pulumi supporta altri linguaggi oltre a Python per Azure Databricks, tra cui TypeScript, JavaScript, Go e C#.
Il provider di risorse Pulumi Databricks si basa sul provider Databricks Terraform. Per altre informazioni, vedere Terraform Cloud.
Requisiti
Un account Pulumi. Iscriversi a Pulumi, se non si ha già un account Pulumi. Pulumi è gratuito per i singoli utenti e offre un livello gratuito per i team.
Python 3.6 o versione successiva. Per verificare se Python è installato, eseguire il comando
python --version
dal terminale o con PowerShell. Installare Python, se non è già installato.Nota
Alcune installazioni di Python possono richiedere l'uso
python3
invece dipython
. In tal caso, sostituirepython
perpython3
tutto questo articolo.URL di Azure Databricks per area di lavoro, ad esempio
https://adb-1234567890123456.7.azuredatabricks.net
.Credenziali di accesso di Azure Databricks. I progetti Pulumi Databricks supportano i tipi di autenticazione di Azure Databricks seguenti:
- Autenticazione del token di accesso personale di Azure Databricks (
databricks:authType pat
) - Autenticazione delle identità gestite di Azure (
databricks:authType azure-msi
) - Autenticazione dell'entità servizio MS Entra (
databricks:authType azure-client-secret
) - Autenticazione dell'interfaccia della riga di comando di Azure (
databricks:authType azure-cli
)
- Autenticazione del token di accesso personale di Azure Databricks (
I passaggi seguenti illustrano come creare un progetto Pulumi Databricks con Python. Per un'esercitazione dal punto di vista puramente del provider di servizi cloud, vedere Introduzione ad Azure nella documentazione di Pulumi. Per un'esercitazione dal punto di vista del linguaggio di programmazione, vedere invece Python, Node.js (JavaScript, TypeScript), Go e .NET (C#, VB, F#) nella documentazione di Pulumi.
Passaggio 1: Creare un progetto Pulumi
In questo passaggio, nel computer di sviluppo locale si configura la struttura di directory necessaria per un progetto Pulumi. Creare quindi il progetto Pulumi all'interno di questa struttura di directory.
Dal terminale o con PowerShell creare una directory vuota e quindi passare ad essa, ad esempio:
Unix, Linux e macOS
mkdir pulumi-demo cd pulumi-demo
Finestre
md pulumi-demo cd pulumi-demo
Installare Pulumi eseguendo il comando seguente, a seconda del sistema operativo:
Unix, Linux
Installare Pulumi in Unix o Linux usando curl:
curl -fsSL https://get.pulumi.com | sh
MacOS
Installare Pulumi in macOS usando Homebrew:
brew install pulumi/tap/pulumi
Finestre
Installare Pulumi in Windows usando PowerShell con autorizzazioni elevate tramite gestione pacchetti Chocolatey:
choco install pulumi
Per le opzioni di installazione alternative di Pulumi, vedere Scaricare e installare nella documentazione di Pulumi.
Creare un progetto Python Pulumi di base eseguendo il comando seguente:
pulumi new python
Suggerimento
È anche possibile creare un progetto Pulumi dall'account Pulumi online (Progetti > crea progetto). Non esiste tuttavia alcun modello di progetto per Azure Databricks.
Se richiesto, premere INVIO e quindi usare il Web browser per accedere all'account Pulumi online, se non si è già connessi. Dopo l'accesso, tornare al terminale o a PowerShell.
Quando viene richiesto un nome di progetto, accettare il nome predefinito del
pulumi-demo
progetto premendo INVIO.Quando viene richiesta una descrizione del progetto, immettere
A demo Python Pulumi Databricks project
e premere INVIO.quando viene richiesto un nome dello stack, accettare il nome dello stack predefinito di
dev
premendo INVIO. Pulumi crea i file e la sottodirectory seguenti nellapulumi-demo
directory:Pulumi.yaml
, che è un elenco di impostazioni per il progetto Pulumi.__main__.py
, che contiene il codice Python scritto per il progetto Pulumi.requirements.txt
, che è un elenco di pacchetti di codice Python di supporto installati da Pulumi per il progetto..gitignore
, che è un elenco di file e directory che Git ignora se si vuole eseguire il push di questo progetto in un repository Git remoto.- La
venv
sottodirectory contiene il codice dell'ambiente virtuale Python di supporto usato da Pulumi per il progetto.
Eseguire una distribuzione iniziale dello stack del
dev
progetto eseguendo il comando seguente:pulumi up
Quando viene richiesto di eseguire questo aggiornamento, premere il tasto freccia su per passare a sì e quindi premere INVIO.
Copiare il collegamento Visualizza live visualizzato e incollarlo nella barra degli indirizzi del Web browser, che consente di accedere all'account Pulumi online. Vengono
dev
visualizzati i dettagli dell'attività dello stack per ilpulumi-demo
progetto. Non c'è molto da vedere in questo momento, perché non ci sono ancora risorse nello stack. Queste risorse vengono create nel passaggio successivo.
Passaggio 2: Creare risorse di Databricks
In questo passaggio si usa il provider di risorse Pulumi Databricks per creare, nell'area di lavoro di Azure Databricks esistente, un notebook e un processo per eseguire tale notebook.
__main.py__
Nel file generato da Pulumi usare l'editor di testo preferito o l'ambiente di sviluppo integrato (IDE) per immettere il codice seguente. Questo codice dichiara le risorse Notebook e job pulumi Databricks e le relative impostazioni:"""A Python Pulumi program""" import pulumi from pulumi_databricks import * from base64 import b64encode # Get the authenticated user's workspace home directory path and email address. # See https://www.pulumi.com/registry/packages/databricks/api-docs/getcurrentuser user_home_path = get_current_user().home user_email_address = get_current_user().user_name # Define the name prefix to prepend to the resource names that are created # for the Notebook and Job resources. To do this, you can use a Pulumi # configuration value instead of hard-coding the name prefix in this file. # # To set a Pulumi configuration value, run the following command, which sets # a "resource-prefix" configuration value to "pulumi-demo" in the # associated "Pulumi.<stack-name>.yaml" configuration file: # # pulumi config set resource-prefix "pulumi-demo" # # For more information about defining and retrieving hard-coded values, see # https://www.pulumi.com/docs/intro/concepts/config config = pulumi.config.Config() resource_prefix = config.require('resource-prefix') # Define cluster resource settings. node_type = config.require('node-type') # Create a Notebook resource. # See https://www.pulumi.com/registry/packages/databricks/api-docs/notebook # This example adds a single cell to the notebook, which is constructed from # a single base64-encoded string. In practice, you would replace this: # # language = "PYTHON", # content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8") # # With this: # # source = "path/to/local/my-notebook.py" # # To provide more notebook content easier and faster. Also, the notebook's language # is automatically detected. If you specify a notebook path, be sure that it does # not end in .ipynb, as Pulumi relies on the workspace import API, which doesn't # rely on any specific extensions such as .ipynb in the notebook path. notebook = Notebook( resource_name = f"{resource_prefix}-notebook", path = f"{user_home_path}/Pulumi/{resource_prefix}-notebook.py", language = 'PYTHON', content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8") ) # Export the URL of the Notebook, so that you can easily browse to it later. # See https://www.pulumi.com/docs/intro/concepts/stack/#outputs pulumi.export('Notebook URL', notebook.url) # Create a Job resource. # See https://www.pulumi.com/registry/packages/databricks/api-docs/job # This job uses the most recent Databricks Runtime long-term support (LTS) # runtime programmatic version ID at the time this article was first published, # which is 14.3.x-scala2.12. You can replace this with a later version. job = Job( resource_name = f"{resource_prefix}-job", name = f"{resource_prefix}-job", tasks = [ JobTaskArgs( task_key = f"{resource_prefix}-task", new_cluster = JobNewClusterArgs( num_workers = 1, spark_version = "14.3.x-scala2.12", node_type_id = node_type ), notebook_task = JobNotebookTaskArgs( notebook_path = f"{user_home_path}/Pulumi/{resource_prefix}-notebook.py" ) ) ], email_notifications = JobEmailNotificationsArgs( on_successes = [ user_email_address ], on_failures = [ user_email_address ] ) ) # Export the URL of the Job, so that you can easily browse to it later. # See https://www.pulumi.com/docs/intro/concepts/stack/#outputs pulumi.export('Job URL', job.url)
Definire un valore di configurazione denominato
resource-prefix
e impostarlo sul valore hardcoded dipulumi-demo
, eseguendo il comando seguente. Pulumi usa questo valore di configurazione per denominare il notebook e il processo:pulumi config set resource-prefix "pulumi-demo"
Pulumi crea un file denominato
Pulumi.dev.yaml
nella stessa directory del__main__.py
file e aggiunge il codice seguente a questo file YAML:config: pulumi-demo:resource_prefix: pulumi-demo
L'uso dei valori di configurazione consente al codice di essere più modulare e riutilizzabile. Ora un altro utente può riutilizzare il
__main__.py
file e definire un valore diverso per laresource_prefix
variabile senza modificare il contenuto del__main__.py
file.Definire un valore di configurazione denominato
node-type
e impostarlo sul valore hardcoded seguente eseguendo il comando seguente. Pulumi usa questo valore di configurazione per determinare il tipo di cluster in cui viene eseguito il processo.pulumi config set node-type "Standard_D3_v2"
Il contenuto del
Pulumi.dev.yaml
file è ora simile al seguente:config: pulumi-demo:node-type: Standard_D3_v2 pulumi-demo:resource-prefix: pulumi-demo
Per consentire a Pulumi di eseguire l'autenticazione con l'area di lavoro di Azure Databricks, definire valori di configurazione specifici di Azure Databricks eseguendo i comandi correlati. Ad esempio, per l'autenticazione del token di accesso personale di Azure Databricks, eseguire i comandi seguenti. In questi comandi:
Sostituire
<workspace-instance-url>
con l'URL per area di lavoro, ad esempiohttps://adb-1234567890123456.7.azuredatabricks.net
.Sostituire
<access-token>
con il valore del token di accesso. Assicurarsi di specificare l'opzione--secret
. Ciò indica a Pulumi di crittografare il token di accesso come procedura consigliata per la sicurezza.Nota
Per impostazione predefinita, Pulumi usa una chiave di crittografia per stack gestita dal servizio Pulumi e un salt per valore per crittografare i valori. Per usare un provider di crittografia alternativo, vedere Configurazione della crittografia dei segreti nella documentazione di Pulumi.
pulumi config set databricks:host "<workspace-instance-url>" pulumi config set databricks:token "<access-token>" --secret
Il contenuto del
Pulumi.dev.yaml
file è ora simile al seguente:config: databricks:host: <your-workspace-instance-url> databricks:token: secure: <an-encrypted-version-of-your-access-token> pulumi-demo:node-type: Standard_D3_v2 pulumi-demo:resource_prefix: pulumi-demo
Per usare un tipo di autenticazione di Azure Databricks diverso, vedere Requisiti. Vedere anche Configurazione nel repository Pulumi Databricks in GitHub.
Passaggio 3: Distribuire le risorse
In questo passaggio si attiva un ambiente virtuale Python fornito da Pulumi per il progetto come parte dell'esecuzione del modello di progetto Python Pulumi. Questo ambiente virtuale consente di assicurarsi di usare insieme la versione corretta di Python, Pulumi e il provider di risorse Pulumi Databricks. Sono disponibili diversi framework di ambiente virtuale Python, ad esempio venv, virtualenv e pipenv. Questo articolo e il modello di progetto Python Pulumi usano venv
. venv
è già incluso in Python. Per altre informazioni, consultare Creare ambienti virtuali.
Attivare l'ambiente virtuale Python eseguendo il comando seguente dalla
pulumi-demo
directory, a seconda del sistema operativo e del tipo di shell:Piattaforma Shell Comando per attivare l'ambiente virtuale Unix, Linux, macOS bash/zsh source venv/bin/activate
fish source venv/bin/activate.fish
csh/tcsh source venv/bin/activate.csh
PowerShell Core venv/bin/Activate.ps1
Finestre cmd.exe venv\Scripts\activate.bat
PowerShell venv\Scripts\Activate.ps1
Installare il provider di risorse Pulumi Databricks da Python Package Index (PyPI) nell'ambiente virtuale eseguendo il comando seguente:
pip install pulumi-databricks
Nota
Alcune installazioni di
pip
potrebbero richiedere l'usopip3
invece dipip
. In tal caso, sostituirepip
perpip3
tutto questo articolo.Visualizzare in anteprima le risorse create da Pulumi eseguendo il comando seguente:
pulumi preview
Se sono presenti errori segnalati, correggerli e quindi eseguire di nuovo il comando.
Per visualizzare un report dettagliato nell'account Pulumi online di ciò che Pulumi farà, copiare il collegamento Visualizza live visualizzato e incollarlo nella barra degli indirizzi del Web browser.
Creare e distribuire le risorse nell'area di lavoro di Azure Databricks eseguendo il comando seguente:
pulumi up
Quando viene richiesto di eseguire questo aggiornamento, premere il tasto freccia su per passare a sì e quindi premere INVIO. Se sono presenti errori segnalati, correggerli e quindi eseguire di nuovo il comando.
Per visualizzare un report dettagliato nell'account Pulumi online di ciò che ha fatto Pulumi, copiare il collegamento Visualizza live visualizzato e incollarlo nella barra degli indirizzi del Web browser.
Passaggio 4: Interagire con le risorse
In questo passaggio si esegue il processo nell'area di lavoro di Azure Databricks, che esegue il notebook specificato.
- Per visualizzare il notebook che il processo verrà eseguito nell'area di lavoro, copiare il collegamento URL del notebook visualizzato e incollarlo nella barra degli indirizzi del Web browser.
- Per visualizzare il processo che esegue il notebook nell'area di lavoro, copiare il collegamento URL processo visualizzato e incollarlo nella barra degli indirizzi del Web browser.
- Per eseguire il processo, fare clic sul pulsante Esegui ora nella pagina del processo.
- Al termine dell'esecuzione del processo, per visualizzare i risultati dell'esecuzione del processo, nell'elenco Esecuzioni completate (ultimi 60 giorni) della pagina del processo, fare clic sulla voce relativa all’ora più recente nella colonna Ora di inizio. Il riquadro Output mostra il risultato dell'esecuzione del codice del notebook, che stampa i numeri da 1 a 10.
(Facoltativo) Passaggio 5: Apportare modifiche a una risorsa
In questo passaggio facoltativo si modifica il codice del notebook, si ridistribuisce il notebook modificato e quindi si usa il processo per eseguire nuovamente il notebook modificato.
Se non si desidera apportare modifiche al notebook, passare al passaggio 6: Pulire.
Tornare al
__main.py__
file e modificare questa riga di codice:content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
A questo scopo, quindi salvare il file:
content_base64 = b64encode(b''' data = [ { "Category": 'A', "ID": 1, "Value": 121.44 }, { "Category": 'B', "ID": 2, "Value": 300.01 }, { "Category": 'C', "ID": 3, "Value": 10.99 }, { "Category": 'E', "ID": 4, "Value": 33.87} ] df = spark.createDataFrame(data) display(df) ''').decode("UTF-8")
Questa modifica indica al notebook di stampare il contenuto del dataframe specificato anziché i numeri da 1 a 10.
Nota
Assicurarsi che le righe di codice che iniziano con
data
e che terminano con''').decode("UTF-8")
siano allineate al bordo dell'editor di codice. In caso contrario, Pulumi inserisce spazi vuoti aggiuntivi nel notebook che potrebbe causare l'esito negativo dell'esecuzione del nuovo codice Python.Facoltativamente, visualizzare in anteprima la risorsa che Pulumi modificherà eseguendo il comando seguente:
pulumi preview
Se sono presenti errori segnalati, correggerli e quindi eseguire di nuovo il comando.
Per visualizzare un report dettagliato nell'account Pulumi online di ciò che Pulumi farà, copiare il collegamento Visualizza live visualizzato e incollarlo nella barra degli indirizzi del Web browser.
Distribuire la modifica della risorsa nell'area di lavoro di Azure Databricks eseguendo il comando seguente:
pulumi up
Quando viene richiesto di eseguire questo aggiornamento, premere il tasto freccia su per passare a sì e quindi premere INVIO. Se sono presenti errori segnalati, correggerli e quindi eseguire di nuovo il comando.
Per visualizzare un report dettagliato nell'account Pulumi online di ciò che ha fatto Pulumi, copiare il collegamento Visualizza live visualizzato e incollarlo nella barra degli indirizzi del Web browser.
Per visualizzare il notebook modificato nell'area di lavoro, copiare il collegamento URL del notebook visualizzato e incollarlo nella barra degli indirizzi del Web browser.
Per rieseguire il processo con il notebook modificato, copiare il collegamento URL processo visualizzato e incollarlo nella barra degli indirizzi del Web browser. Fare quindi clic sul pulsante Esegui ora nella pagina del processo.
Al termine dell'esecuzione del processo, per visualizzare i risultati dell'esecuzione del processo, nell'elenco Esecuzioni completate (ultimi 60 giorni) della pagina del processo, fare clic sulla voce relativa all’ora più recente nella colonna Ora di inizio. Il riquadro Output mostra il risultato dell'esecuzione del codice del notebook, che stampa il contenuto del dataframe specificato.
Passaggio 6: Pulire
In questo passaggio si indica a Pulumi di rimuovere il notebook e il processo dall'area di lavoro di Azure Databricks, nonché rimuovere il pulumi-demo
progetto e il relativo dev
stack dall'account Pulumi online.
Rimuovere le risorse dall'area di lavoro di Azure Databricks eseguendo il comando seguente:
pulumi destroy
Quando viene richiesto di eseguire questa rimozione, premere il tasto freccia su per passare a sì e quindi premere INVIO.
Rimuovere il progetto Pulumi e il relativo
dev
stack dall'account Pulumipulumi-demo
online eseguendo il comando seguente:pulumi stack rm dev
Quando viene richiesto di eseguire questa rimozione, digitare
dev
e quindi premere INVIO.Per disattivare l'ambiente
venv
virtuale Python, eseguire il comando seguente:deactivate
Test
È possibile testare il progetto Pulumi prima di distribuirlo. Vedere Test dei programmi Pulumi nella documentazione di Pulumi.
Per gli unit test dei progetti Pulumi basati su Python, è possibile scrivere ed eseguire unit test usando lo unittest del framework di test Python insieme allo spazio dei nomi pulumi.runtime del pacchetto Pulumi. Per eseguire test sulle risorse simulate, sostituire le chiamate a Pulumi (e ad Azure Databricks) con simulazioni. Vedere Unit testing programmi Pulumi nella documentazione di Pulumi.
Il file di esempio seguente denominato infra.py
simula un'implementazione del notebook e del processo dichiarato nel file di main.py
questo articolo. Gli unit test in questo esempio controllano se il contenuto con codifica Base64 del notebook, il nome del processo e il destinatario del messaggio di posta elettronica per il corretto processo esegue tutti i valori previsti restituiti. Di conseguenza, solo le proprietà correlate vengono fittizie qui con valori di esempio. Inoltre, è necessario specificare sempre i valori delle proprietà delle risorse necessarie, anche se non si prevede di usarli negli unit test. In questo esempio questi valori obbligatori vengono impostati su valori casuali my-mock-
e tali valori non vengono testati.
# infra.py
from pulumi_databricks import (
Notebook,
Job,
JobEmailNotificationsArgs
)
notebook = Notebook(
resource_name = 'my-mock-notebook-resource-name',
path = 'my-mock-notebook-path',
content_base64 = 'ZGlzcGxheShzcGFyay5yYW5nZSgxMCkp'
)
job = Job(
resource_name = 'my-mock-job-resource-name',
name = 'pulumi-demo-job',
email_notifications = JobEmailNotificationsArgs(
on_successes = [ 'someone@example.com' ]
)
)
Il file di test_main.py
esempio seguente verifica se le proprietà correlate restituiscono i valori previsti.
# test_main.py
import pulumi
from pulumi_databricks import *
import unittest
import infra
# Set up mocking.
class MyMocks(pulumi.runtime.Mocks):
def new_resource(self, type_, name, inputs, provider, id_):
return [name + '_id', inputs]
def call(self, token, args, provider):
return {}
pulumi.runtime.set_mocks(MyMocks())
class TestNotebookAndJob(unittest.TestCase):
@pulumi.runtime.test
def test_notebook(self):
def check_notebook_content_base64(args):
content_base64 = args
# Does the notebook's Base64-encoded content match the expected value?
self.assertIn('ZGlzcGxheShzcGFyay5yYW5nZSgxMCkp', content_base64)
# Pass the mocked notebook's content_base64 property value to the test.
return pulumi.Output.all(infra.notebook.content_base64).apply(check_notebook_content_base64)
@pulumi.runtime.test
def test_job(self):
def check_job_name_and_email_onsuccesses(args):
name, email_notifications = args
# Does the job's name match the expected value?
self.assertIn('pulumi-demo-job', name)
# Does the email address for successful job runs match the expected value?
self.assertIn('someone@example.com', email_notifications['on_successes'])
# Pass into the test the mocked job's property values for the job's name
# and the job's email address for successful runs.
return pulumi.Output.all(
infra.job.name,
infra.job.email_notifications
).apply(check_job_name_and_email_onsuccesses)
Per eseguire questi test e visualizzare i risultati del test, eseguire il comando seguente dalla directory radice del progetto Pulumi:
python -m unittest
Per informazioni su altri tipi di test che è possibile eseguire, vedere gli articoli seguenti nella documentazione di Pulumi: