Versionning des notebooks sous Azure Databricks

A l’aide de GitHub

Comme pour tout développement, les notebooks méritent d’être archivés et versionnés. Tout notebook sera ainsi automatiquement sauvegardé et versionné dans l’espace de travail Azure Databricks (voir la documentation officielle).

Menu Revision history du notebok

Tant que le menu latéral Revision history est visible, il n’est pas possible de modifier le contenu du notebook.

Azure Databricks permet également d’utiliser un gestionnaire de versions externe parmi les trois solutions suivantes :

  • GitHub
  • Bitbucked Cloud
  • Azure DevOps Service

Dans un même espace de travail, il ne sera possible d’associer qu’un seul des trois gestionnaires (mais il serait sans doute étrange de versionner à différents endroits…). Notons que GitLab ne fait pas partie de cette liste, à ce jour, je n’ai pas réussi à le lier à Azure Databricks. Ce n’est pas le cas non plus de la version Enterprise de GitHub.

Rappel des notions et principes de base de Git

repository : c’est le répertoire de dépôt d’un projet de développement
master : version initiale et de référence du code
branch : lors de la suite des développements, il est important créer une nouvelle branche pour ne pas dégrager le master
commit : envoi de la liste des modifications effectuées
pull request : demande de prise en compte de modifications réalisées par un autre développeur
merge : appliquer les modifications à une autre branche, souvent le master

Nous allons découvrir maintenant comment se fait le lien entre l’espace de travail Azure Databricks et GitHub. Il faut tout d’abord se rendre sur la page dédiée aux paramètres de l’utilisateur (User Settings).

Paramétrage de l’intégration Git

Depuis le site GitHub, une fois identifié, il faut créer un jeton d’accès personnel, en suivant les écrans ci-dessous. Celui-ci devra disposer des droits complets sur le repo.

Génération d’un jeton d’accès personnel dans GitHub
Accorder le contrôle complet des repositories
Association réalisée avec succès

Nous pouvons maintenant quitter la page des paramètres de l’utilisateur pour nous rendre dans le notebook de notre choix. Le menu Revision history laisse apparaître le lien Git: Synced.

Association du notebook avec un repo GitHub
Enregistrement d’une première version
Première synchronisation réussie

Le fichier est maintenant bien créé sur notre compte GitHub dans le repo associé. Chaque nouvelle révision pourra être enregistrée et commitée, en associant un commentaire.

Enregistrement (et commit) d’un révision

Par défaut un notebook python est enregistré au format .py. Les commandes magiques ne sont pas perdues et seront correctement réinterprétées à l’import du fichier sur un autre espace de travail. Afin de converser les propriétés d’affichage du notebook dans GitHub, il suffit de forcer l’extention à .ipynb lors de la première synchronisation.

Ainsi, chaque nouvelle sauvegarde se fait donc sur la branche principale (master) mais il est bien sûr possible de créer de nouvelles branches du développement, en cliquant à nouveau sut Git: synced.

création et sélection d’une nouvelle branche

La création d’une nouvelle branche fait apparaître un hyperlien vers la pull request sur le compte GitHub.


Lien vers la pull request

La comparaison des modifications et l’éventuel merge des versions se fait ensuite sur la page GitHub.

Comparaison des modifications sous GitHub

Rappelons enfin qu’il est possible d’importer un fichier par son URL, et donc par l’URL obtenue depuis GitHub. Cette fonctionnalité, couplée à l’utilisation des paramètres dans un notebook, permet de recopier le notebook d’un environnement de développement à un environnement de production.


Import d’un fichier dans l’espace de travail
Import par URL

Dans un prochain article, nous explorerons les interactions entre Azure Databricks et Azure DevOps.

Piloter l’exécution des notebooks Databricks

Azure Databricks est un service managé de cluster Spark, permettant d’exécuter du code Scala, Python, R ou SQL sur des volumes importants de données, grâce à son approche distribuée et en mémoire.

Si le meilleur scénario de mise en production d’un traitement reste de créer un fichier Jar à partir de code Scala (voir un prochain billet de ce blog), il peut être très utile d’ordonnancer le lancement de notebooks Python car il n’existe pas aujourd’hui d’approche similaire à celle du fichier Jar.

Deux éléments seront importants dans une approche de mise en production :

  • Pouvoir modifier facilement un paramètre d’environnement (dev / qualif / prod par exemple)
  • Réaliser un enchainement conditionnel des traitements, avec un minimum de logs de suivi

Nous allons voir ici plusieurs solutions qui sont disponibles dans un environnement Azure. Nous considérons que nous disposons déjà des ressources suivantes :

  • Un compte de stockage Azure avec deux containers (« citidev » et « citiprod »)
  • Une ressource Azure Databricks avec un cluster déjà créé (« myDBcluster »)
  • Une ressource Azure Data Factory déployée
  • Un notebook Python contenant les transformations à effectuer (chargement des données et création d’une table temporaire)

Créer une tâche planifiée (job)

Le premier réflexe sera d’utiliser l’interface Azure Databricks de création de job.

Job scheduling in Azure Databricks

Nous précisions les éléments suivants :

  • Le notebook voulu
  • Le jour et l’heure d’exécution (syntaxe CRON de type 0 0 * * * ?)
  • Le cluster d’exécution ou bien la configuration d’un nouveau cluster qui sera créé au lancement
  • D’éventuelles dépendances de librairies
  • D’éventuels paramètres pour l’exécution

Nous allons nous servir de cette notion de paramètre pour passer à notre notebook le nom du container qui désigne l’environnement.

Afin de récupérer la valeur de ce paramètre dans le notebook, nous définissons une première cellule à l’aide du code ci-dessous.

Nous exploitons ici la notion de widget qui permet de récupérer une valeur dans un élément visuel comme une zone de texte, une liste déroulante, une combo box… La documentation officielle donne l’ensemble des possibilités.

Lancer un notebook depuis un autre

Nous nous appuyons de nouveau sur cette astuce pour piloter le lancement de notebooks à partir d’un notebook « master ».

La commande magique %run est suivie du chemin du notebook puis de la valeur attendue pour le paramètre d’environnement.

Nous constatons ici que le notebook lancé a renvoyé un message lorsqu’il s’est terminé. Cela est réalisé dans la dernière cellule du notebook par la commande ci-dessous.

Créer un pipeline Azure Data Factory

Azure Data Factory v2 est le parfait ordonnanceur de tâches de copie ou de transformation de données au sein de l’écosystème Azure et en interactions avec des sources extérieures au cloud de Microsoft. Charles-Henri Sauget a publié un ouvrage référence sur le sujet.

Nous devons ici définir un service lié de type Azure Databricks en précisant :

  • La souscription Azure utilisée
  • L’espace de travail Databricks
  • Un jeton d’accès (access token) que l’on obtient depuis l’interface Databricks

Attention à bien noter ce token lors de sa création, il ne sera plus possible de l’afficher par la suite !

Nous créons ensuite un pipeline contenant au moins une activité de type Databricks notebook.

Cette activité est associée au service lié défini préalablement.

Enfin, nous définissons le paramètre d’accès à l’environnement voulu.

Une astuce permet d’obtenir facilement le chemin vers le notebook : il suffit de cliquer dans l’explorateur sur la flèche à droite du notebook, puis cliquer sur “Copy File Path”.

Azure Data Factory met ensuite à disposition son système propre de planification ou de déclenchement sur événement (trigger).

En résumé

Selon la complexité de votre scénario, voici les trois possibilités qui s’offrent à vous :

  1. Planification d’un notebook unique
  2. Utiliser le job scheduler de l’espace de travail Databricks
  3. Enchainement de plusieurs notebooks
  4. Créer un notebook « master » et utiliser la commande magique %run
  5. Enchainement du notebook avec des traitement extérieurs à Databricks
  6. Créer un pipeline Azure Data Factory

Et pour aller encore plus loin dans l’accès aux bons environnements, n’oubliez pas d’utiliser les secret scopes que je présente dans cette vidéo.

Que propose Microsoft pour la Data Science ?

En mars 2019, je publiais sur un blog ami cet état des lieux de l’offre Microsoft pour la Data Science : https://www.stat4decision.com/fr/microsoft-pour-la-data-science/

Depuis, la version Gen2 d’Azure Data Lake Storage est sortie (le logo a évolué). Azure Machine Learning Service est devenu un portail à part entière : ml.azure.com et depuis

Voici un aperçu des fonctionnalités en vidéo de ce qui s’appelle pour l’instant Azure Machine Learning Web Experience.