Gérer les stratégies de cluster

Important

Cette fonctionnalité est disponible en préversion publique.

Une stratégie de cluster limite la possibilité de configurer des clusters en fonction d’un ensemble de règles. Les règles de stratégie limitent les attributs ou les valeurs d’attribut disponibles pour la création du cluster. Les stratégies de cluster ont des listes de contrôle d’accès qui limitent leur utilisation à des utilisateurs et des groupes spécifiques.

Les stratégies de cluster vous permettent d' :

  • Limitez les utilisateurs à créer des clusters avec des paramètres prescrits.
  • Simplifier l’interface utilisateur et permettre à davantage d’utilisateurs de créer leurs propres clusters (en corrigeant et en masquant certaines valeurs).
  • Contrôlez les coûts en limitant le coût maximal du cluster (en définissant des limites sur les attributs dont les valeurs contribuent au tarif horaire).

Pour obtenir une présentation des stratégies de cluster et des recommandations de configuration, consultez la vidéo sur les stratégies de cluster Databricks :

Les autorisations de stratégie de cluster limitent les stratégies qu’un utilisateur peut sélectionner dans la liste déroulante des stratégies lorsque l’utilisateur crée un cluster :

  • Un utilisateur disposant de l' autorisation de création de cluster peut sélectionner la stratégie non restreinte et créer des clusters entièrement configurables.
  • Un utilisateur disposant de l’autorisation créer un cluster et d’un accès aux stratégies de cluster peut sélectionner la stratégie et les stratégies non restreintes auxquelles il a accès.
  • Un utilisateur qui a accès uniquement aux stratégies de cluster peut sélectionner les stratégies auxquelles il a accès.

Notes

Si aucune stratégie n’a été créée dans l’espace de travail, la liste déroulante des stratégies ne s’affiche pas.

Seuls les utilisateurs administrateurs peuvent créer, modifier et supprimer des stratégies. Les utilisateurs administrateurs ont également accès à toutes les stratégies.

Cet article se concentre sur la gestion des stratégies à l’aide de l’interface utilisateur. Vous pouvez également utiliser les API de stratégie de Cluster 2,0 pour gérer les stratégies.

Configuration requise

les stratégies de Cluster nécessitent le Plan de Azure Databricks Premium.

Règles de mise en application

Vous pouvez exprimer les types de contraintes suivants dans les règles de stratégie :

  • Valeur fixe avec élément de contrôle désactivé
  • Valeur fixe avec contrôle masqué dans l’interface utilisateur (la valeur est visible dans la vue JSON)
  • Valeur de l’attribut limitée à un ensemble de valeurs (liste verte ou liste rouge)
  • Valeur d’attribut correspondant à une expression régulière donnée
  • Attribut numérique limité à une certaine plage
  • Valeur par défaut utilisée par l’interface utilisateur avec le contrôle activé

Attributs du cluster géré

Les stratégies de cluster prennent en charge tous les attributs de cluster contrôlés avec l' API de clusters 2,0. Le type spécifique de restrictions prises en charge peut varier selon le champ (en fonction de leur type et de la relation avec les éléments de l’interface utilisateur de formulaire du cluster).

En outre, les stratégies de cluster prennent en charge les attributs synthétiquessuivants :

  • Mesure « max DBU-Hour », qui correspond à la capacité maximale de DBUs qu’un cluster peut utiliser sur une base horaire. Cette mesure est un moyen direct de contrôler le coût au niveau du cluster individuel.
  • Limite de la source qui crée le cluster : travaux service (clusters de travail), interface utilisateur de clusters, API REST de clusters (clusters à usage général).

Attributs de cluster non managé

Les attributs de cluster suivants ne peuvent pas être restreints dans une stratégie de cluster :

  • Les bibliothèques, qui sont gérées par les bibliothèques API 2,0. Une solution de contournement consiste à utiliser un conteneur personnalisé ou un script init.
  • Nombre de clusters créés par utilisateur (total ou simultanément). L’étendue d’une stratégie est un cluster unique, il n’y a donc aucune connaissance des clusters créés par un utilisateur.
  • Les autorisations de cluster (ACL), qui sont gérées par une API distincte.

Définir une stratégie de cluster

Vous définissez une stratégie de cluster dans une définition de stratégie JSON, que vous ajoutez quand vous créez la stratégie de cluster.

Créer une stratégie de cluster

Vous créez une stratégie de cluster à l’aide de l’interface utilisateur stratégies de cluster ou des API de stratégie de cluster 2,0. Pour créer une stratégie de cluster à l’aide de l’interface utilisateur :

  1. Cliquez sur calcul icônecalcul dans la barre latérale.

  2. Cliquez sur l’onglet stratégies de cluster .

    Onglet stratégies de cluster

  3. Cliquez sur le bouton créer une stratégie .

    Entrer le nom de la stratégie de cluster

  4. Nommez la stratégie. Les noms de stratégie ne respectent pas la casse.

  5. Dans l’onglet définition , collez une définition de stratégie.

  6. Cliquez sur Créer.

Gérer les autorisations de stratégie de cluster

Par définition, les administrateurs ont l’autorisation d’accès à toutes les stratégies. Vous pouvez gérer les autorisations de stratégie de cluster à l’aide de l’interface utilisateur stratégies de cluster ou de l' API autorisations de stratégie de cluster.

Autorisation ajouter une stratégie de cluster

Pour ajouter une autorisation de stratégie de cluster à l’aide de l’interface utilisateur :

  1. Cliquez sur calcul icônecalcul dans la barre latérale.

  2. Cliquez sur l’onglet stratégies de cluster .

  3. Cliquez sur l'onglet Autorisations.

  4. Dans la colonne nom , sélectionnez un principal.

    Principal d’autorisation de stratégie

  5. Dans la colonne autorisation , sélectionnez une autorisation:

    Autorisation de stratégie

  6. Cliquez sur Add.

Autorisation supprimer une stratégie de cluster

Pour supprimer une autorisation de stratégie de cluster à l’aide de l’interface utilisateur :

  1. Cliquez sur calcul icônecalcul dans la barre latérale.
  2. Cliquez sur l’onglet stratégies de cluster .
  3. Cliquez sur l'onglet Autorisations.
  4. Cliquez sur l’icône de suppression dans la ligne d’autorisation.

Modifier une stratégie de cluster à l’aide de l’interface utilisateur

Vous modifiez une stratégie de cluster à l’aide de l’interface utilisateur stratégies de cluster ou des API de stratégie de cluster 2,0. Pour modifier une stratégie de cluster à l’aide de l’interface utilisateur :

  1. Cliquez sur calcul icônecalcul dans la barre latérale.

  2. Cliquez sur l’onglet stratégies de cluster .

    Image de l’onglet stratégies de cluster

  3. Cliquez sur un nom de stratégie.

  4. Cliquez sur Modifier.

  5. Dans l’onglet définition, modifiez la définition de la stratégie.

  6. Cliquez sur Update.

Supprimer une stratégie de cluster à l’aide de l’interface utilisateur

Vous supprimez une stratégie de cluster à l’aide de l’interface utilisateur stratégies de cluster ou des API de stratégie de cluster 2,0. Pour supprimer une stratégie de cluster à l’aide de l’interface utilisateur :

  1. Cliquez sur calcul icônecalcul dans la barre latérale.

  2. Cliquez sur l’onglet stratégies de cluster .

    Onglet stratégies de cluster sélectionné

  3. Cliquez sur un nom de stratégie.

  4. Cliquez sur Supprimer.

  5. Cliquez sur Delete (Supprimer) pour confirmer.

Définitions de stratégie de cluster

Une définition de stratégie de cluster est une collection de définitions de stratégie individuelles exprimées en JSON.

Dans cette section :

Définitions de stratégies

Une définition de stratégie est un mappage entre une chaîne de chemin d’accès définissant un attribut et un type de limite. Il ne peut y avoir qu’une seule limitation par attribut. Un chemin d’accès est spécifique au type de ressource et reflète le nom de l’attribut de l’API de création de ressources. Si la création de ressources utilise des attributs imbriqués, le chemin d’accès concatène les noms d’attributs imbriqués à l’aide de points. Les attributs qui ne sont pas définis dans la définition de stratégie sont illimités lorsque vous créez un cluster à l’aide de la stratégie.

interface Policy {
  [path: string]: PolicyElement
}

Éléments de stratégie

Un élément de stratégie spécifie l’un des types de limite pris en charge sur un attribut donné et éventuellement une valeur par défaut. Vous pouvez spécifier une valeur par défaut sans définir de limite sur l’attribut dans la stratégie.

type PolicyElement = FixedPolicy | ForbiddenPolicy | (LimitingPolicyBase & LimitingPolicy);
type LimitingPolicy = AllowlistPolicy | BlocklistPolicy | RegexPolicy | RangePolicy | UnlimitedPolicy;

Cette section décrit les types de stratégies :

Stratégie fixe

Limitez la valeur à la valeur spécifiée. Pour les valeurs d’attribut autres que Numeric et Boolean, la valeur de l’attribut doit être représentée par ou convertible en une chaîne. Éventuellement, l’attribut peut être masqué dans l’interface utilisateur lorsque l' hidden indicateur est présent et défini sur true . Une stratégie fixe ne peut pas spécifier une valeur par défaut.

interface FixedPolicy {
    type: "fixed";
    value: string | number | boolean;
    hidden?: boolean;
}
Exemple
{
  "spark_version": { "type": "fixed", "value": "7.3.x-scala2.12", "hidden": true }
}

Stratégie interdite

Pour un attribut facultatif, empêchez l’utilisation de l’attribut.

interface ForbiddenPolicy {
    type: "forbidden";
}
Exemple

Cette stratégie interdit l’attachement de pools au cluster pour les nœuds Worker. les pools sont également interdits pour le nœud de pilote, car driver_instance_pool_id hérite de la stratégie.

{
  "instance_pool_id": { "type": "forbidden" }
}

Limiter les stratégies : champs communs

Dans une stratégie de limitation, vous pouvez spécifier deux champs supplémentaires :

  • defaultValue : valeur qui remplit le formulaire de création de cluster dans l’interface utilisateur.
  • isOptional -une stratégie de limitation sur un attribut le rend obligatoire. Pour rendre l’attribut facultatif, affectez la valeur isOptional true au champ.
interface LimitedPolicyBase {
    defaultValue?: string | number | boolean;
    isOptional?: boolean;
}
Exemple
{
  "instance_pool_id": { "type": "unlimited", "isOptional": true, "defaultValue": "id1" }
}

Cet exemple de stratégie spécifie la valeur par défaut id1 du pool pour les nœuds Worker, mais le rend facultatif. Lorsque vous créez le cluster, vous pouvez sélectionner un autre pool ou choisir de ne pas en utiliser un. Si driver_instance_pool_id n’est pas défini dans la stratégie ou lors de la création du cluster, le même pool est utilisé pour les nœuds Worker et le nœud Driver.

Stratégie de liste verte

Liste de valeurs autorisées.

interface AllowlistPolicy {
  type: "allowlist";
  values: (string | number | boolean)[];
}
Exemple
{
  "spark_version":  { "type": "allowlist", "values": [ "7.2.x-scala2.12", "7.3.x-scala2.12" ] }
}

Stratégie de liste rouge

Liste des valeurs non autorisées. Étant donné que les valeurs doivent être des correspondances exactes, cette stratégie peut ne pas fonctionner comme prévu Lorsque l’attribut est strict dans la manière dont la valeur est représentée (par exemple, en autorisant les espaces de début et de fin).

interface BlocklistPolicy {
  type: "blocklist";
  values: (string | number | boolean)[];
}
Exemple
{
  "spark_version":  { "type": "blocklist", "values": [ "4.0.x-scala2.11" ] }
}

Stratégie Regex

Limite la valeur à celles correspondant à l’expression régulière. Pour la sécurité, lors de la correspondance l’expression régulière est toujours ancrée au début et à la fin de la valeur de chaîne.

interface RegexPolicy {
  type: "regex";
  pattern: string;
}
Exemple
{
  "spark_version":  { "type": "regex", "value": "5\\.[3456].*" }
}

Stratégie de plage

Limite la valeur à la plage spécifiée par les minValuemaxValue attributs et. La valeur doit être un nombre décimal. Les limites numériques doivent être représentées en tant que valeur à virgule flottante double. Pour indiquer l’absence d’une limite spécifique, vous pouvez omettre l’un des minValue , maxValue .

interface RangePolicy {
  type: "range";
  minValue?: number;
  maxValue?: number;
}
Exemple
{
  "num_workers":  { "type": "range", "maxValue": 10 }
}

Stratégie illimitée

Ne définit pas de limites de valeur. Vous pouvez utiliser ce type de stratégie pour rendre les attributs obligatoires ou pour définir la valeur par défaut dans l’interface utilisateur.

interface UnlimitedPolicy {
  type: "unlimited";
}
Exemple

Pour exiger l’ajout de la COST_BUCKET balise :

{
  "custom_tags.COST_BUCKET":  { "type": "unlimited" }
}

Pour définir la valeur par défaut d’une variable de configuration Spark, mais autoriser également l’omission (suppression) de celle-ci :

{
  "spark_conf.spark.my.conf":  { "type": "unlimited", "isOptional": true, "defaultValue": "my_value" }
}

Chemins d’accès des attributs de stratégie de cluster

Le tableau suivant répertorie les chemins d’accès aux attributs de stratégie de cluster pris en charge.

Chemin de l’attribut Type Description
autoscale.max_workers nombre facultatif En cas de masquage, supprime le champ nombre maximal de Worker de l’interface utilisateur.
autoscale.min_workers nombre facultatif En cas de masquage, supprime le champ nombre minimal de travail de l’interface utilisateur.
autotermination_minutes nombre La valeur 0 ne représente aucun arrêt automatique. En cas de masquage, supprime la case à cocher arrêt automatique et l’entrée valeur de l’interface utilisateur.
cluster_log_conf.path string URL de destination des fichiers journaux.
cluster_log_conf.type string DBFS
cluster_name string le nom du cluster ;
custom_tags.* string Contrôlez des valeurs de balise spécifiques en ajoutant le nom de la balise, par exemple : custom_tags.<mytag> .
docker_image.basic_auth.password string Mot de passe pour l’authentification de base de l’image des services de conteneur Databricks.
docker_image.basic_auth.username string Nom d’utilisateur pour l’authentification de base de l’image des services de conteneur Databricks.
docker_image.url string Contrôle l’URL de l’image des services de conteneur Databricks. En cas de masquage, supprime la section des services de conteneur Databricks de l’interface utilisateur.
driver_node_type_id chaîne facultative En cas de masquage, supprime la sélection du type de nœud du pilote de l’interface utilisateur.
enable_local_disk_encryption boolean Affectez la valeur true pour activer ou false désactiver le chiffrement des disques qui sont attachés localement au cluster (comme spécifié par l’API).
init_scripts.*.dbfs.destination, init_scripts.*.file.destination string * fait référence à l’index du script init dans le tableau d’attributs. Consultez attributs de tableau.
instance_pool_id string Contrôle le pool utilisé par les nœuds Worker si driver_instance_pool_id est également défini, ou pour tous les nœuds de cluster dans le cas contraire. Si vous utilisez des pools pour les nœuds Worker, vous devez également utiliser des pools pour le nœud Driver. En cas de masquage, supprime la sélection de pool de l’interface utilisateur.
driver_instance_pool_id string Si ce n’est pas le cas, configure un pool différent pour le nœud de pilote que pour les nœuds Worker. S’il n’est pas spécifié, hérite de instance_pool_id . Si vous utilisez des pools pour les nœuds Worker, vous devez également utiliser des pools pour le nœud Driver. En cas de masquage, supprime la sélection de pool de pilotes de l’interface utilisateur.
node_type_id string En cas de masquage, supprime la sélection du type de nœud Worker de l’interface utilisateur.
num_workers nombre facultatif En cas de masquage, supprime la spécification du numéro de travail de l’interface utilisateur.
single_user_name string Nom d’utilisateur pour l’accès en mode relais de l’utilisateur aux informations d’identification.
spark_conf.* chaîne facultative Contrôle des valeurs de configuration spécifiques en ajoutant le nom de la clé de configuration, par exemple : spark_conf.spark.executor.memory .
spark_env_vars.* chaîne facultative Contrôle des valeurs de variable d’environnement Spark spécifiques en ajoutant la variable d’environnement, par exemple : spark_env_vars.<environment variable name> .
spark_version string Nom de version de l’image Spark (tel que spécifié par l’API).

Chemins d’accès des attributs virtuels de stratégie de cluster

Chemin de l’attribut Type Description
dbus_per_hour nombre Attribut calculé représentant (dans le cas de clusters de mise à l’échelle automatique) le coût du cluster, y compris le nœud du pilote. Pour une utilisation avec limitation de plage.
cluster_type string Représente le type de cluster qui peut être créé :

* all-purpose pour Azure Databricks les clusters à usage général
* job pour les clusters de travail créés par le planificateur de travaux

Autorise ou bloque la création de types de clusters spécifiés à partir de la stratégie. Si la all-purpose valeur n’est pas autorisée, la stratégie n’est pas affichée dans le formulaire de création de cluster à usage général. Si la job valeur n’est pas autorisée, la stratégie n’est pas affichée dans le formulaire de nouveau cluster de travail.

Attributs des tableaux

Vous pouvez spécifier des stratégies pour les attributs de groupe de deux manières :

  • Limitations génériques pour tous les éléments de tableau. Ces limitations utilisent le * symbole générique dans le chemin d’accès de la stratégie.
  • Limitations spécifiques pour un élément de tableau à un index spécifique. Ces limites utilisent un nombre dans le chemin d’accès.

Par exemple, pour l’attribut de tableau init_scripts , les chemins d’accès génériques commencent par init_scripts.* et chemins d’accès spécifiques avec init_scripts.<n> , où <n> est un index d’entiers dans le tableau (à partir de 0). Vous pouvez combiner des limitations génériques et spécifiques, auquel cas la limitation générique s’applique à chaque élément de tableau qui n’a pas de limitation spécifique. Dans chaque cas, une seule restriction de stratégie s’applique.

Les scénarios d’utilisation classiques pour les stratégies de groupe sont les suivants :

  • Exiger des entrées spécifiques à l’inclusion. Par exemple :

    {
      "init_scripts.0.dbfs.destination": {
        "type": "fixed",
        "value": "<required-script-1>"
      },
      "init_scripts.1.dbfs.destination": {
        "type": "fixed",
        "value": "<required-script-2>"
      }
    }
    

    Vous ne pouvez pas exiger des valeurs spécifiques sans spécifier l’ordre.

  • Exiger une valeur fixe de la liste entière. Par exemple :

    {
      "init_scripts.0.dbfs.destination": {
        "type": "fixed",
        "value": "<required-script-1>"
      },
      "init_scripts.*.dbfs.destination": {
        "type": "forbidden"
      }
    }
    
  • Interdire l’utilisation de l’ensemble.

    {
      "init_scripts.*.dbfs.destination": {
        "type": "forbidden"
      }
    }
    
  • Autorisez un nombre quelconque d’entrées, mais uniquement après une restriction spécifique. Par exemple :

    {
       "init_scripts.*.dbfs.destination": {
        "type": "regex",
        "pattern": ".*<required-content>.*"
      }
    }
    

Dans le cas de init_scripts chemins d’accès, le tableau peut contenir l’une des différentes structures pour lesquelles toutes les les variantes possibles peuvent avoir besoin d’être gérées en fonction du cas d’usage. Par exemple, pour exiger un ensemble spécifique de scripts init et n’interdisent aucune variante de l’autre version. vous pouvez utiliser le modèle suivant :

{
  "init_scripts.1.dbfs.destination": {
    "type": "fixed",
    "value": "dbfs://<dbfs-path>"
  },
  "init_scripts.*.dbfs.destination": {
    "type": "forbidden"
  },
  "init_scripts.*.file.destination": {
    "type": "forbidden"
  },
}

Exemples de stratégie de cluster

Dans cette section :

Stratégie de cluster générale

Une stratégie de cluster à usage général est destinée à guider les utilisateurs et à restreindre certaines fonctionnalités, tout en exigeant des balises, en limitant le nombre maximal d’instances et en appliquant le délai d’expiration.

{
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "fixed",
    "value": "serverless",
    "hidden": true
  },
  "instance_pool_id": {
    "type": "forbidden",
    "hidden": true
  },
  "spark_version": {
    "type": "regex",
    "pattern": "7\\.[0-9]+\\.x-scala.*"
  },
  "node_type_id": {
    "type": "allowlist",
    "values": [
      "Standard_L4s",
      "Standard_L8s",
      "Standard_L16s"
    ],
    "defaultValue": "Standard_L16s_v2"
  },
  "driver_node_type_id": {
    "type": "fixed",
    "value": "Standard_L16s_v2",
    "hidden": true
  },
  "autoscale.min_workers": {
    "type": "fixed",
    "value": 1,
    "hidden": true
  },
  "autoscale.max_workers": {
    "type": "range",
    "maxValue": 25,
    "defaultValue": 5
  },
  "autotermination_minutes": {
    "type": "fixed",
    "value": 30,
    "hidden": true
  },
  "custom_tags.team": {
    "type": "fixed",
    "value": "product"
  }
}

Stratégie de taille moyenne simple

Permet aux utilisateurs de créer un cluster de taille moyenne avec une configuration minimale. Le seul champ obligatoire au moment de la création est nom du cluster ; le reste est fixe et masqué.

{
  "instance_pool_id": {
    "type": "forbidden",
    "hidden": true
  },
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "forbidden",
    "hidden": true
  },
  "autoscale.min_workers": {
    "type": "fixed",
    "value": 1,
    "hidden": true
  },
  "autoscale.max_workers": {
    "type": "fixed",
    "value": 10,
    "hidden": true
  },
  "autotermination_minutes": {
    "type": "fixed",
    "value": 60,
    "hidden": true
  },
  "node_type_id": {
    "type": "fixed",
    "value": "Standard_L8s_v2",
    "hidden": true
  },
  "driver_node_type_id": {
    "type": "fixed",
    "value": "Standard_L8s_v2",
    "hidden": true
  },
  "spark_version": {
    "type": "fixed",
    "value": "7.3.x-scala2.12",
    "hidden": true
  },
  "custom_tags.team": {
    "type": "fixed",
    "value": "product"
  }
}

Stratégie de travail uniquement

Permet aux utilisateurs de créer des clusters de travail et d’exécuter des tâches à l’aide du cluster. Les utilisateurs ne peuvent pas créer de cluster à usage général à l’aide de cette stratégie.

{
  "cluster_type": {
    "type": "fixed",
    "value": "job"
  },
  "dbus_per_hour": {
    "type": "range",
    "maxValue": 100
  },
  "instance_pool_id": {
    "type": "forbidden",
    "hidden": true
  },
  "num_workers": {
    "type": "range",
    "minValue": 1
  },
  "node_type_id": {
    "type": "regex",
    "pattern": "Standard_[DLS]*[1-6]{1,2}_v[2,3]"
  },
  "driver_node_type_id": {
    "type": "regex",
    "pattern": "Standard_[DLS]*[1-6]{1,2}_v[2,3]"
  },
  "spark_version": {
    "type": "regex",
    "pattern": "7\\.[0-9]+\\.x-scala.*"
  },
  "custom_tags.team": {
    "type": "fixed",
    "value": "product"
  }
}

Stratégie à nœud unique

Permet aux utilisateurs de créer un cluster à nœud unique sans nœud Worker avec Spark activé en mode local. Pour obtenir des exemples de stratégies, consultez stratégie de cluster à nœud unique.

Stratégie de relais d’accès concurrentiel élevé

Permet aux utilisateurs de créer des clusters en mode d’accès concurrentiel élevé avec l’option passthrough activée par défaut. De cette façon, les utilisateurs n’ont pas besoin de définir manuellement les paramètres Spark appropriés.

{
  "spark_conf.spark.databricks.passthrough.enabled": {
    "type": "fixed",
    "value": "true"
  },
  "spark_conf.spark.databricks.repl.allowedLanguages": {
    "type": "fixed",
    "value": "python,sql"
  },
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "fixed",
    "value": "serverless"
  },
  "spark_conf.spark.databricks.pyspark.enableProcessIsolation": {
    "type": "fixed",
    "value": "true"
  },
  "custom_tags.ResourceClass": {
    "type": "fixed",
    "value": "Serverless"
  }
}

Stratégie de magasin externe

Permet aux utilisateurs de créer un cluster avec une bibliothèque de stockage définie par l’administrateur déjà attachée. Cela est utile pour permettre aux utilisateurs de créer leurs propres clusters sans nécessiter de configuration supplémentaire.

{
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionURL": {
      "type": "fixed",
      "value": "jdbc:sqlserver://<jdbc-url>"
  },
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionDriverName": {
      "type": "fixed",
      "value": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
  },
  "spark_conf.spark.databricks.delta.preview.enabled": {
      "type": "fixed",
      "value": "true"
  },
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionUserName": {
      "type": "fixed",
      "value": "<metastore-user>"
  },
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionPassword": {
      "type": "fixed",
      "value": "<metastore-password>"
  }
}