Personnaliser des conteneurs avec les services de conteneur Databricks

Les services conteneur Databricks vous permet de spécifier une image Docker lorsque vous créez un calcul. Exemples de cas d’usage :

  • Personnalisation de bibliothèque : vous avez un contrôle total sur les bibliothèques système que vous souhaitez installer.
  • Environnement de conteneurs de référence (golden) : votre image Docker est un environnement verrouillé qui ne changera jamais.
  • Intégration CI/CD avec Docker : vous pouvez intégrer Azure Databricks à vos pipelines CI/CD avec Docker.

Vous pouvez également utiliser des images Docker pour créer des environnements personnalisés d’apprentissage approfondi sur des calculs avec des périphériques GPU. Pour plus d’informations sur l’utilisation du calcul par le GPU avec Databricks Container Services, voir Databricks Container Services sur le calcul par le GPU.

Pour exécuter des tâches à chaque démarrage du conteneur, utilisez un script init.

Spécifications

  • Dans votre espace de travail Azure Databricks, Databricks Container Services doit être activé.
  • Votre machine doit exécuter un démon Docker récent (qui est testé et compatible avec la version client/serveur 18.03.0-ce), et la commande docker doit être disponible sur PATH.

Limites

  • Les services conteneur Databricks ne sont pas pris en charge sur les calculs avec le mode d’accès partagé.
  • Databricks Runtime pour Machine Learning ne prend pas en charge Databricks Container Services.
  • Pour accéder aux volumes sur les services conteneur Databricks, ajoutez la configuration suivante au champ de configuration Spark du calcul : spark.databricks.unityCatalog.volumes.enabled true.

Étape 1 : Générer votre base

Databricks vous recommande de créer votre base Docker à partir d’une base que Databricks a créée et testée. Il est également possible de créer votre base Docker à partir de zéro. Cette section décrit les deux options.

Option 1. Utiliser une base créée par Databricks

Cet exemple utilise l’étiquette 9.x pour une image qui cible un calcul avec le runtime Databricks Runtime 9.1 LTS ou version ultérieure :

FROM databricksruntime/standard:9.x
...

Pour spécifier des bibliothèques Python supplémentaires, telles que la dernière version de pandas et d’urllib, utilisez la version pip spécifique au conteneur. Pour le conteneur databricksruntime/standard:9.x, incluez ce code :

RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3

Pour le conteneur databricksruntime/standard:8.x ou version antérieure, incluez ce code :

RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3

Les images de base sont hébergées sur Docker Hub à l’adresse https://hub.docker.com/u/databricksruntime. Le fichiers Dockerfile utilisés pour générer ces images de base se trouvent à l’adresse https://github.com/databricks/containers.

Notes

Les images hébergées sur Docker Hub qui ont des étiquettes avec le suffixe « -LTS » seront corrigées. Toutes les autres images sont des exemples qui ne font pas l’objet de corrections régulières.

Notes

Les images de base databricksruntime/standard et databricksruntime/minimal ne doivent pas être confondues avec les environnements databricks-standard et databricks-minimal non liés qui étaient inclus dans la bêta Databricks Runtime avec Conda (cette version n’est plus disponible).

Option 2. Créer votre propre base Docker

Vous pouvez également créer votre base Docker à partir de zéro. L’image Docker doit remplir les prérequis suivants :

Pour créer votre propre image à partir de zéro, vous devez créer l’environnement virtuel. Vous devez également inclure les packages intégrés aux calculs Databricks, tels que Python et R. Pour commencer, vous pouvez utiliser l’image de base correspondante :

  • Pour R : databricksruntime/rbase
  • Pour Python : databricksruntime/python
  • Pour l’image minimale créée par Databricks : databricksruntime/minimal

Vous pouvez aussi vous reporter à l’exemple Dockerfiles dans GitHub.

Notes

Databricks recommande l’utilisation d’Ubuntu Linux, mais il est possible d’utiliser Alpine Linux. Pour utiliser Alpine Linux, vous devez inclure les fichiers suivants :

En outre, vous devez configurer Python, comme illustré dans cet exemple de fichier Dockerfile.

Avertissement

Testez minutieusement votre image conteneur personnalisée sur un calcul Azure Databricks. Même si votre conteneur fonctionne sur une machine locale ou de build, il peut arriver que, lorsque ce conteneur est lancé sur Azure Databricks, le lancement du calcul échoue, certaines fonctionnalités soient désactivées ou le conteneur cesse de fonctionner, même en mode silencieux. Dans les scénarios les plus défavorables, l’image peut corrompre vos données ou exposer accidentellement vos données à des tiers externes.

Étape 2 : Envoyer votre image de base

Envoyez votre image de base personnalisée en la poussant vers un registre Docker. Ce processus est pris en charge avec les registres suivants :

D’autres registres Docker qui ne prennent en charge aucune authentification ou que l’authentification de base sont également censés fonctionner.

Remarque

Si vous utilisez Docker Hub pour votre registre Docker, veillez à vérifier que les limites de débit prennent en charge la quantité de calculs que vous prévoyez de lancer pendant six heures. Ces limites de débit sont différentes pour les utilisateurs anonymes, les utilisateurs authentifiés sans abonnement payant et les abonnements payants. Consultez la documentation Docker pour plus d’informations. Si cette limite est dépassée, vous obtiendrez une réponse « 429 Trop de requêtes ».

Étape 3 : exécutez votre calcul

Vous pouvez lancer votre calcul en utilisant l’interface utilisateur ou l’API.

Lancer votre calcul à l’aide de l’interface utilisateur

  1. Dans la page Créer un calcul, spécifiez une version de Databricks Runtime qui prend en charge les services conteneur Databricks.

  2. Sous Options avancées, sélectionnez l’onglet Docker.

  3. Sélectionnez Utiliser votre propre conteneur Docker.

  4. Dans le champ URL de l’image Docker, entrez votre image Docker personnalisée.

    Exemples d’URL d’image Docker :

    Registre Format de l’étiquette
    Hub Docker <organization>/<repository>:<tag> (par exemple : databricksruntime/standard:latest)
    Azure Container Registry <your-registry-name>.azurecr.io/<repository-name>:<tag>
  5. Sélectionnez le type d'authentification.

Lancer votre calcul à l’aide de l’API

  1. Générez un jeton d’API.

  2. Utilisez l’API Clusters pour lancer un calcul avec votre base Docker personnalisée.

    curl -X POST -H "Authorization: Bearer <token>" https://<databricks-instance>/api/2.0/clusters/create -d '{
      "cluster_name": "<cluster-name>",
      "num_workers": 0,
      "node_type_id": "Standard_DS3_v2",
      "docker_image": {
        "url": "databricksruntime/standard:latest",
        "basic_auth": {
          "username": "<docker-registry-username>",
          "password": "<docker-registry-password>"
        }
      },
      "spark_version": "7.3.x-scala2.12",
    }'
    

    Les prérequis basic_auth dépendent du type de votre image Docker :

    • Pour les images Docker publiques, n’incluez pas le champ basic_auth.
    • Pour les images Docker privées, incluez le champ basic_auth, en spécifiant un ID de principal de service comme nom d’utilisateur, ainsi qu’un mot de passe.
    • Pour Azure Container Registry, vous devez définir le champ basic_auth avec l’ID et le mot de passe d’un principal de service. Pour plus d’informations sur la création du principal de service, consultez la documentation Authentification Azure Container Registry avec des principaux de service.

Utiliser un script d’initialisation

Les services conteneur Databricks permettent aux clients d’inclure des scripts init dans le conteneur Docker. Dans la plupart des cas, il vaut mieux ne pas utiliser de scripts init, mais plutôt effectuer des personnalisations directement dans Docker (au moyen du fichier Dockerfile). Toutefois, certaines tâches doivent être exécutées au démarrage du conteneur, et non au moment de la création du conteneur. Pour ces tâches, utilisez un script init.

Supposons, par exemple, que vous souhaitiez exécuter un démon de sécurité dans un conteneur personnalisé. Installez et générez le démon dans l’image Docker via le pipeline de création de l’image. Ensuite, ajoutez un script init qui démarre le démon. Dans cet exemple, le script init inclura une ligne comme systemctl start my-daemon.

Dans l’API, vous pouvez spécifier des scripts init dans le cadre de la spécification de calcul, comme suit. Pour plus d’informations, consultez l’API des Clusters.

"init_scripts": [
    {
        "file": {
            "destination": "file:/my/local/file.sh"
        }
    }
]

Pour les images Databricks Container Services, vous pouvez également stocker des scripts init dans le stockage cloud.

Les étapes suivantes ont lieu lorsque vous lancez un calcul qui utilise les services conteneur Databricks :

  1. Les machines virtuelles sont acquises auprès du fournisseur de cloud.
  2. L’image Docker personnalisée est téléchargée de votre dépôt.
  3. Azure Databricks crée un conteneur Docker à partir de l’image.
  4. Le code Databricks Runtime est copié dans le conteneur Docker.
  5. Les scripts d’initialisation sont exécutés. Voir Que sont les scripts d'initialisation ?.

Azure Databricks ignore les primitives Docker CMD et ENTRYPOINT.

Activer les services de conteneurs

Pour utiliser des conteneurs personnalisés sur vos calculs, un administrateur d’espace de travail doit activer les services conteneur Databricks.

Les administrateurs d’espace de travail peuvent activer le service conteneur Databricks à l’aide de l’API de configuration de l’espace de travail. Dans un corps de requête JSON, spécifiez enableDcs sur true, comme dans l’exemple suivant :

curl -X PATCH -n \
  https://<databricks-instance>/api/2.0/workspace-conf \
  -d '{
    "enableDcs": "true"
    }'