Aller au contenu principal

Fournisseur Databricks Terraform

HashiCorp Terraform est un outil open source populaire qui permet de créer une infrastructure cloud sûre et prévisible englobant plusieurs fournisseurs de services cloud. Vous pouvez utiliser le fournisseur Databricks Terraform pour gérer vos Workspaces Databricks et l'infrastructure cloud associée à l'aide d'un outil flexible et puissant. L'objectif du fournisseur Databricks Terraform est de prendre en charge toutes les APIs REST de Databricks, en permettant l'automatisation des aspects les plus compliqués du déploiement et de la gestion de vos plateformes de données. Les clients Databricks utilisent le fournisseur Databricks Terraform pour déployer et gérer des clusters et des Jobs, et pour configurer l'accès aux données. Vous utilisez le fournisseur Terraform Databricks pour le provisionnement des Workspaces Databricks ainsi que le fournisseur AWS pour le provisionnement des Ressources AWS requises pour ces Workspaces.

Démarrer

Dans cette section, vous installez et configurez les prérequis pour utiliser Terraform et le fournisseur Databricks Terraform sur votre machine de développement locale. Vous configurez ensuite l'authentification Terraform. Suite à cette section, cet article fournit un exemple de configuration que vous pouvez expérimenter pour provisionner un Notebook Databricks, un cluster et une Job pour exécuter le Notebook sur le cluster dans un Workspace Databricks existant.

Exigences

  1. Vous devez disposer du Terraform CLI. Consultez download Terraform sur le site web de Terraform.

  2. Vous devez avoir un projet Terraform. Dans votre terminal, créez un répertoire vide, puis accédez-y. (Chaque ensemble distinct de fichiers de configuration Terraform doit se trouver dans son propre répertoire, appelé projet Terraform.) Par exemple : mkdir terraform_demo && cd terraform_demo.

    Bash
    mkdir terraform_demo && cd terraform_demo

    Incluez les configurations Terraform pour votre projet dans un ou plusieurs fichiers de configuration de votre projet Terraform. Pour des informations sur la syntaxe du fichier de configuration, voir la documentation du langage Terraform sur le site web de Terraform.

  3. Vous devez ajouter à votre projet Terraform une dépendance pour le fournisseur Terraform Databricks. Ajoutez ce qui suit à l'un des fichiers de configuration de votre projet Terraform :

    terraform {
    required_providers {
    databricks = {
    source = "databricks/databricks"
    }
    }
    }
  4. Vous devez configurer l'authentification pour votre projet Terraform. Consultez Authentification dans la documentation du fournisseur Databricks Terraform.

Exemple de configuration

Cette section fournit une configuration d’exemple que vous pouvez expérimenter pour provisionner un Notebook Databricks, un cluster et un Job pour exécuter le Notebook sur le cluster, dans un workspace Databricks existant. Il est supposé que vous avez déjà configuré les exigences, et créé un projet Terraform et configuré le projet avec l’authentification Terraform comme décrit dans la section précédente.

  1. Créez un fichier nommé me.tf dans votre projet Terraform, et ajoutez le code suivant. Ce fichier obtient des informations sur l'utilisateur actuel (vous) :
# Retrieve information about the current user.
data "databricks_current_user" "me" {}
  1. Créez un autre fichier nommé notebook.tf, et ajoutez le code suivant. Ce fichier représente le Notebook.
variable "notebook_subdirectory" {
description = "A name for the subdirectory to store the notebook."
type = string
default = "Terraform"
}

variable "notebook_filename" {
description = "The notebook's filename."
type = string
}

variable "notebook_language" {
description = "The language of the notebook."
type = string
}

resource "databricks_notebook" "this" {
path = "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
language = var.notebook_language
source = "./${var.notebook_filename}"
}

output "notebook_url" {
value = databricks_notebook.this.url
}
  1. Créez un autre fichier nommé notebook.auto.tfvars, et ajoutez le code suivant. Ce fichier spécifie les propriétés du Notebook.
notebook_subdirectory = "Terraform"
notebook_filename = "notebook-getting-started.py"
notebook_language = "PYTHON"
  1. Créez un autre fichier nommé notebook-getting-started.py, et ajoutez le code suivant. Ce fichier représente le contenu du Notebook.
display(spark.range(10))
  1. Créez un autre fichier nommé cluster.tf, et ajoutez le code suivant. Ce fichier représente le cluster.
variable "cluster_name" {
description = "A name for the cluster."
type = string
default = "My Cluster"
}

variable "cluster_autotermination_minutes" {
description = "How many minutes before automatically terminating due to inactivity."
type = number
default = 60
}

variable "cluster_num_workers" {
description = "The number of workers."
type = number
default = 1
}

# Create the cluster with the "smallest" amount
# of resources allowed.
data "databricks_node_type" "smallest" {
local_disk = true
}

# Use the latest Databricks Runtime
# Long Term Support (LTS) version.
data "databricks_spark_version" "latest_lts" {
long_term_support = true
}

resource "databricks_cluster" "this" {
cluster_name = var.cluster_name
node_type_id = data.databricks_node_type.smallest.id
spark_version = data.databricks_spark_version.latest_lts.id
autotermination_minutes = var.cluster_autotermination_minutes
num_workers = var.cluster_num_workers
}

output "cluster_url" {
value = databricks_cluster.this.url
}
  1. Créez un autre fichier nommé cluster.auto.tfvars, et ajoutez le code suivant. Ce fichier spécifie les propriétés du cluster.
cluster_name                    = "My Cluster"
cluster_autotermination_minutes = 60
cluster_num_workers = 1
  1. Créez un autre fichier nommé job.tf, et ajoutez le code suivant. Ce fichier représente le Job qui exécute le notebook sur le cluster.
variable "job_name" {
description = "A name for the job."
type = string
default = "My Job"
}

variable "task_key" {
description = "A name for the task."
type = string
default = "my_task"
}

resource "databricks_job" "this" {
name = var.job_name
task {
task_key = var.task_key
existing_cluster_id = databricks_cluster.this.cluster_id
notebook_task {
notebook_path = databricks_notebook.this.path
}
}
email_notifications {
on_success = [ data.databricks_current_user.me.user_name ]
on_failure = [ data.databricks_current_user.me.user_name ]
}
}

output "job_url" {
value = databricks_job.this.url
}
  1. Créez un autre fichier nommé job.auto.tfvars, et ajoutez le code suivant. Ce fichier spécifie les propriétés du Job.
job_name = "My Job"
task_key = "my_task"
  1. Exécutez terraform plan. S'il y a des erreurs, corrigez-les, puis exécutez à nouveau la commande.

  2. Exécuter terraform apply.

  3. Vérifiez que le Notebook, le cluster et le Job ont été créés : dans la sortie de la commande terraform apply, trouvez les URL de notebook_url, cluster_url et job_url, puis accédez-y.

  4. Exécutez le Job : sur la page Jobs , cliquez sur Exécuter maintenant . Une fois le Job terminé, consultez votre boîte de réception e-mail.

  5. Lorsque vous avez terminé cet exemple, supprimez le notebook, le cluster et le job du Workspace Databricks en exécutant terraform destroy.

remarque

Pour plus d’informations sur les commandes terraform plan, terraform apply et terraform destroy, consultez la Documentation Terraform CLI dans la documentation Terraform.

  1. Vérifiez que le Notebook, le cluster et le Job ont été supprimés : refresh les pages Notebook, cluster et Jobs pour que chacune affiche un message indiquant que la Ressource est introuvable.

Test

Testez vos configurations Terraform avant ou après leur déploiement. Vous pouvez exécuter des tests analogues aux tests unitaires avant de déployer les ressources. Vous pouvez également exécuter des tests analogues aux tests d'intégration une fois les Ressources déployées. Consultez les Tests dans la documentation Terraform.

Exécutez des tests analogues aux tests d’intégration par rapport à l’exemple de configuration de cet article en suivant ce processus :

  1. Créez un fichier nommé cluster.tftest.hcl, et ajoutez le code suivant. Ce fichier vérifie si le cluster déployé a le nom de cluster attendu.
# Filename: cluster.tftest.hcl

run "cluster_name_test" {
command = apply

assert {
condition = databricks_cluster.this.cluster_name == var.cluster_name
error_message = "Cluster name did not match expected name"
}
}
  1. Créez un fichier nommé job.tftest.hcl, et ajoutez le code suivant. Ce fichier vérifie si le job déployé a le nom de job attendu.
run "job_name_test" {
command = apply

assert {
condition = databricks_job.this.name == var.job_name
error_message = "Job name did not match expected name"
}
}
  1. Créez un fichier nommé notebook.tftest.hcl, et ajoutez le code suivant. Ce fichier vérifie si le Notebook déployé a le chemin de Workspace attendu.
run "notebook_path_test" {
command = apply

assert {
condition = databricks_notebook.this.path == "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
error_message = "Notebook path did not match expected path"
}
}
  1. Exécutez terraform test. Terraform déploie chaque Ressource vers le Workspace Databricks, exécute chaque test connexe et rapporte son résultat de test, puis démantèle la Ressource déployée.

Exécutez des tests analogues aux tests unitaires par rapport à la configuration d'exemple de cet article avec le processus suivant :

  • Modifiez la ligne command = apply dans chacun des tests précédents en command = plan, puis exécutez terraform test. Terraform exécute chaque test associé et rapporte son résultat de test, mais ne déploie aucune Ressource.
  • Simulez le fournisseur Databricks Terraform, ce qui vous permet d'exécuter terraform test sans déployer de ressources et sans exiger d'identifiants d'authentification. Voir Simulacres dans la documentation Terraform. Pour exécuter des tests simulés, une approche consiste à ajouter la ligne mock_provider "databricks" {} à vos tests et à supprimer la ligne command = apply ou command = plan, par exemple :
# Filename: cluster.tftest.hcl

mock_provider "databricks" {}

run "cluster_mock_name_test" {
assert {
condition = databricks_cluster.this.cluster_name == var.cluster_name
error_message = "Cluster name did not match expected name"
}
}
# Filename: job.tftest.hcl

mock_provider "databricks" {}

run "job_mock_name_test" {
assert {
condition = databricks_job.this.name == var.job_name
error_message = "Job name did not match expected name"
}
}
# Filename: notebook.tftest.hcl

mock_provider "databricks" {}

run "notebook_mock_path_test" {
assert {
condition = databricks_notebook.this.path == "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
error_message = "Notebook path did not match expected path"
}
}

Ressources supplémentaires