Informations de référence sur les stratégies de calcul
Cet article sert de référence pour les définitions de stratégie de calcul. Les articles incluent une référence relative aux attributs de stratégie disponibles et aux types de limitation. Vous pouvez également référencer des exemples de stratégies pour les cas d’usage courants.
Présentation des définitions de stratégie.
Les définitions de stratégie sont des règles de stratégie individuelles exprimées dans le format JSON. Une définition peut ajouter une règle à l’un des attributs contrôlés avec l’API Clusters. Par exemple, ces définitions définissent une heure d’arrêt automatique par défaut, interdisent aux utilisateurs d’utiliser des pools et appliquent l’utilisation de Photon :
{
"autotermination_minutes" : {
"type" : "unlimited",
"defaultValue" : 4320,
"isOptional" : true
},
"instance_pool_id": {
"type": "forbidden",
"hidden": true
},
"runtime_engine": {
"type": "fixed",
"value": "PHOTON",
"hidden": true
}
}
Il ne peut y avoir qu’une seule limitation par attribut. Le chemin d’accès d’un attribut reflète le nom de l’attribut d’API. Pour les attributs imbriqués, le chemin concatène leurs noms à l’aide de points. Les attributs qui ne sont pas définis dans une définition de stratégie ne sont pas limités.
Attributs pris en charge
Les stratégies prennent en charge tous les attributs contrôlés avec l’API Clusters. Le type de restrictions que vous pouvez apporter aux attributs peut varier selon les paramètres en fonction de leur type et de leur relation avec les éléments de l’interface utilisateur. Vous ne pouvez pas utiliser de stratégies pour définir des autorisations de calcul.
Vous pouvez également utiliser des stratégies pour définir les le nombre maximal d’Unités Databricks (DBU) par heure et le type de cluster. Consultez Chemins d’accès des attributs virtuels.
Le tableau suivant répertorie les chemins des attributs de stratégie pris en charge :
Chemin de l’attribut | Type | Description |
---|---|---|
autoscale.max_workers |
nombre facultatif | En cas de masquage, supprime le champ du nombre maximal de rôles de travail de l’interface utilisateur. |
autoscale.min_workers |
nombre facultatif | En cas de masquage, supprime le champ du nombre minimal de rôles de travail de l’interface utilisateur. |
autotermination_minutes |
nombre | La valeur 0 représente l’absence d’arrêt automatique. En cas de masquage, supprime la case à cocher d’arrêt automatique et l’entrée de valeur de l’interface utilisateur. |
azure_attributes.availability |
string | Contrôle si le calcul utilise des instances à la demande ou des instances spot (ON_DEMAND_AZURE ou SPOT_WITH_FALLBACK_AZURE ). |
azure_attributes.first_on_demand |
number | Contrôle le nombre de nœuds à placer sur des instances à la demande. |
azure_attributes.spot_bid_max_price |
number | Contrôle le prix maximal des instances spot Azure. |
cluster_log_conf.path |
string | URL de destination des fichiers journaux. |
cluster_log_conf.type |
string | Type de destination du journal. La seule valeur acceptable est DBFS . |
cluster_name |
string | le nom du cluster ; |
custom_tags.* |
string | Contrôlez des valeurs d’étiquette spécifiques en ajoutant le nom de l’étiquette, par exemple : custom_tags.<mytag> . |
data_security_mode |
string | Définit le mode d’accès du cluster. Unity Catalog nécessite SINGLE_USER ou USER_ISOLATION (mode d’accès partagé dans l’interface utilisateur). La valeur NONE signifie qu’aucune fonctionnalité de sécurité n’est activée. |
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 de pilote de l’interface utilisateur. |
enable_local_disk_encryption |
boolean | Affectez la valeur true pour activer ou false pour désactiver le chiffrement des disques qui sont attachés localement au cluster (comme spécifié par l’API). |
init_scripts.*.workspace.destination init_scripts.*.volumes.destination init_scripts.*.abfss.destination init_scripts.*.file.destination |
string | * fait référence à l’index du script init dans le tableau d’attributs. Consultez Écriture de stratégies pour les 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 de pilote. En cas de masquage, supprime la sélection de pool de l’interface utilisateur. |
driver_instance_pool_id |
string | Si ce chemin est spécifié, configure un pool pour le nœud de pilote différent de celui 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 de pilote. 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 nombre de rôles de travail de l’interface utilisateur. |
runtime_engine |
string | Détermine si le cluster utilise ou non Photon. Les valeurs possibles sont PHOTON ou STANDARD . |
single_user_name |
string | Nom d’utilisateur pour l’accès mono-utilisateur pour le passage des 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é via l’API (Databricks Runtime). Vous pouvez également utiliser des valeurs de stratégie spéciales qui sélectionnent dynamiquement le Runtime Databricks. Consultez Valeurs de stratégie spéciales pour la sélection Databricks Runtime. |
workload_type.clients.jobs |
booléen | Définit si la ressource de calcul peut être utilisée pour les travaux. Consultez Empêcher l’utilisation du calcul avec des travaux. |
workload_type.clients.notebooks |
boolean | Définit si la ressource de calcul peut être utilisée avec des notebooks. Consultez Empêcher l’utilisation du calcul avec des travaux. |
Chemins d’accès des attributs virtuels
Ce tableau comprend deux attributs synthétiques supplémentaires pris en charge par les stratégies :
Chemin de l’attribut | Type | Description |
---|---|---|
dbus_per_hour |
nombre | Attribut calculé représentant le nombre maximal de DBU qu’une ressource peut utiliser toutes les heures, y compris le nœud du pilote. Cette métrique est un moyen direct de contrôler le coût au niveau du calcul individuel. Utiliser avec une limitation de plage. |
cluster_type |
string | Représente le type de cluster qui peut être créé : - all-purpose pour le calcul universel Azure Databricks- job pour le calcul de travail créé par le planificateur de travaux- dlt pour le calcul créé pour les pipelines Delta Live TablesAutorisez ou bloquez la création de types de calcul spécifiés à partir de la stratégie. Si la valeur all-purpose n’est pas autorisée, la stratégie n’est pas affichée dans l’interface utilisateur de création de calcul universel. Si la valeur job n’est pas autorisée, la stratégie n’est pas affichée dans l’interface utilisateur de création de calcul de travail. |
Valeurs de stratégie spéciales pour la sélection Databricks Runtime
L’attribut spark_version
prend en charge des valeurs spéciales qui mappent dynamiquement à une version Databricks Runtime basée sur l’ensemble actuel de versions de Databricks Runtime prises en charge.
Les valeurs suivantes peuvent être utilisées dans l’attribut spark_version
:
auto:latest
: mappe à la dernière version de Databricks Runtime en disponibilité générale.auto:latest-ml
: mappe à la dernière version ML de Databricks Runtime.auto:latest-lts
: mappe à la dernière version Databricks Runtime à long terme (LTS).auto:latest-lts-ml
: mappe à la dernière version ML de Databricks Runtime LTS.auto:prev-major
: mappe à l’avant-dernière version de Databricks Runtime en disponibilité générale. Par exemple, siauto:latest
est 14.2,auto:prev-major
sera 13.3.auto:prev-major-ml
: mappe à l’avant-dernière version ML de Databricks Runtime. Par exemple, siauto:latest
est 14.2,auto:prev-major
sera 13.3.auto:prev-lts
: mappe à l’avant-dernière version de Databricks Runtime LTS. Par exemple, siauto:latest-lts
est 13.3,auto:prev-lts
sera 12.2.auto:prev-lts-ml
: mappe à l’avant-dernière version ML de Databricks Runtime LTS. Par exemple, siauto:latest-lts
est 13.3,auto:prev-lts
sera 12.2.
Remarque
L’utilisation de ces valeurs n’enclenche pas la mise à jour automatique du calcul lorsqu’une nouvelle version du runtime est publiée. Un utilisateur doit modifier explicitement le calcul de la version Databricks Runtime à modifier.
Types de stratégie pris en charge
Cette section comprend une référence pour chacun des types de stratégie disponibles. Il existe deux catégories de types de stratégie : les stratégies fixes et les stratégies de limitation.
Les stratégies fixes empêchent la configuration utilisateur sur un attribut. Les deux types de stratégies fixes sont les suivants :
Les stratégies de limitation restreignent les options d’un utilisateur pour la configuration d’un attribut. Les stratégies de limitation vous permettent également de définir des valeurs par défaut et de rendre les attributs facultatifs. Consultez Champs de stratégie de limitation supplémentaires.
Vos options de stratégies de limitation sont les suivantes :
- Stratégie de liste d’autorisation
- Stratégie de liste de blocage
- Stratégie d’expression régulière
- Stratégie de plage
- Stratégie illimitée
Stratégie fixe
Les stratégies fixes limitent l’attribut à la valeur spécifiée. Pour les valeurs d’attribut autres que numériques et booléennes, la valeur doit être représentée par une chaîne ou convertible en une chaîne.
Avec les stratégies fixes, vous pouvez également masquer l’attribut de l’interface utilisateur en définissant le champ hidden
sur true
.
interface FixedPolicy {
type: "fixed";
value: string | number | boolean;
hidden?: boolean;
}
Cet exemple de stratégie corrige la version de Databricks Runtime et masque le champ de l’interface utilisateur :
{
"spark_version": { "type": "fixed", "value": "auto:latest-lts", "hidden": true }
}
Stratégie interdite
Une stratégie interdite empêche les utilisateurs de configurer un attribut. Les stratégies interdites sont compatibles uniquement avec les attributs facultatifs.
interface ForbiddenPolicy {
type: "forbidden";
}
Cette stratégie interdit l’attachement de pools au calcul 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" }
}
Stratégie de liste d’autorisation
Une stratégie de liste d’autorisation spécifie une liste de valeurs que l’utilisateur peut choisir lors de la configuration d’un attribut.
interface AllowlistPolicy {
type: "allowlist";
values: (string | number | boolean)[];
defaultValue?: string | number | boolean;
isOptional?: boolean;
}
Cet exemple de liste d’autorisation permet à l’utilisateur de sélectionner entre deux versions de Databricks Runtime :
{
"spark_version": { "type": "allowlist", "values": [ "13.3.x-scala2.12", "12.2.x-scala2.12" ] }
}
Stratégie de liste de blocage
La stratégie de liste de blocage répertorie les 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 modéré 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)[];
defaultValue?: string | number | boolean;
isOptional?: boolean;
}
Cet exemple montre comment empêcher l’utilisateur de sélectionner 7.3.x-scala2.12
en tant que Databricks Runtime.
{
"spark_version": { "type": "blocklist", "values": [ "7.3.x-scala2.12" ] }
}
Stratégie d’expression régulière
Une stratégie d’expression régulière limite les valeurs disponibles à celles qui correspondent à l’expression régulière. Pour des raisons de sécurité, assurez vous que votre expression régulière est ancrée au début et à la fin de la valeur de chaîne.
interface RegexPolicy {
type: "regex";
pattern: string;
defaultValue?: string | number | boolean;
isOptional?: boolean;
}
Cet exemple limite les versions de Databricks Runtime qu’un utilisateur peut sélectionner parmi :
{
"spark_version": { "type": "regex", "pattern": "13\\.[3456].*" }
}
Stratégie de plage
Une stratégie de plage limite la valeur à une plage spécifiée à l’aide des champs minValue
et maxValue
. La valeur doit être un nombre décimal.
Les limites numériques doivent pouvoir être représentées en tant que valeur à virgule flottante double. Pour indiquer l’absence d’une limite spécifique, vous pouvez omettre les valeurs minValue
ou maxValue
.
interface RangePolicy {
type: "range";
minValue?: number;
maxValue?: number;
defaultValue?: string | number | boolean;
isOptional?: boolean;
}
Cet exemple limite la quantité maximale de Workers à 10 :
{
"num_workers": { "type": "range", "maxValue": 10 }
}
Stratégie illimitée
La stratégie illimitée permet de rendre les attributs obligatoires ou de définir la valeur par défaut dans l’interface utilisateur.
interface UnlimitedPolicy {
type: "unlimited";
defaultValue?: string | number | boolean;
isOptional?: boolean;
}
Cet exemple ajoute la balise COST_BUCKET
au calcul :
{
"custom_tags.COST_BUCKET": { "type": "unlimited" }
}
Pour définir une valeur par défaut d’une variable de configuration Spark, mais autoriser également l’omission (la suppression) de celle-ci :
{
"spark_conf.spark.my.conf": { "type": "unlimited", "isOptional": true, "defaultValue": "my_value" }
}
Champs de stratégie de limitation supplémentaires
Pour les types de stratégie de limitation, vous pouvez spécifier deux champs supplémentaires :
defaultValue
: valeur qui remplit automatiquement l’interface utilisateur du calcul de création.isOptional
: une stratégie de limitation sur un attribut le rend automatiquement obligatoire. Pour rendre l’attribut facultatif, définissez le champisOptional
surtrue
.
Remarque
Les valeurs par défaut ne sont pas automatiquement appliquées aux calcul créé avec l’API Clusters. Pour appliquer des valeurs par défaut à l’aide de l’API, ajoutez le paramètre apply_policy_default_values
à la définition de calcul et définissez-le sur true
.
Cet exemple de stratégie spécifie la valeur par défaut id1
pour le pool des nœuds worker, mais le rend facultatif. Lorsque vous créez le calcul, 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 calcul, le même pool est utilisé pour les nœuds Worker et le nœud de pilote.
{
"instance_pool_id": { "type": "unlimited", "isOptional": true, "defaultValue": "id1" }
}
Écriture de stratégies pour les attributs de tableau
Vous pouvez spécifier des stratégies pour les attributs de tableau de deux manières :
- Limitations génériques pour tous les éléments de tableau. Ces limitations utilisent le caractère générique
*
dans le chemin de la stratégie. - Limitations spécifiques pour un élément de tableau au niveau d’un index spécifique. Ces limitations utilisent un nombre dans le chemin.
Par exemple, pour l’attribut de tableau init_scripts
, les chemins génériques commencent par init_scripts.*
et les chemins spécifiques par 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 limitation de stratégie s’applique.
Les sections suivantes présentent des exemples courants qui utilisent des attributs de tableau.
Exiger des entrées spécifiques à l’inclusion
Vous ne pouvez pas exiger des valeurs spécifiques sans spécifier l’ordre. Par exemple :
{
"init_scripts.0.volumes.destination": {
"type": "fixed",
"value": "<required-script-1>"
},
"init_scripts.1.volumes.destination": {
"type": "fixed",
"value": "<required-script-2>"
}
}
Exiger une valeur fixe de la liste entière
{
"init_scripts.0.volumes.destination": {
"type": "fixed",
"value": "<required-script-1>"
},
"init_scripts.*.volumes.destination": {
"type": "forbidden"
}
}
Interdire complètement l’utilisation
{
"init_scripts.*.volumes.destination": {
"type": "forbidden"
}
}
Autoriser les entrées qui suivent une restriction spécifique
{
"init_scripts.*.volumes.destination": {
"type": "regex",
"pattern": ".*<required-content>.*"
}
}
Corriger un ensemble spécifique de scripts d’initialisation
Dans le cas de chemins init_scripts
, le tableau peut contenir l’une des différentes structures pour lesquelles toutes 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 interdire toute variante de l’autre version, vous pouvez utiliser le modèle suivant :
{
"init_scripts.0.volumes.destination": {
"type": "fixed",
"value": "<volume-paths>"
},
"init_scripts.1.volumes.destination": {
"type": "fixed",
"value": "<volume-paths>"
},
"init_scripts.*.workspace.destination": {
"type": "forbidden"
},
"init_scripts.*.abfss.destination": {
"type": "forbidden"
},
"init_scripts.*.file.destination": {
"type": "forbidden"
}
}
Exemples de stratégies
Cette section comprend des exemples de stratégie que vous pouvez utiliser comme références pour créer vos propres stratégies. Vous pouvez également utiliser les familles de stratégies fournies par Azure Databricks comme modèles pour les cas d’usage de stratégie courants.
- Stratégie de calcul générale
- Définir des limites sur le calcul de pipeline Delta Live Tables
- Stratégie de taille moyenne simple
- Stratégie de travail uniquement
- Stratégie de metastore externe
- Empêche l’utilisation du calcul avec les jobs
- Supprimer la stratégie de mise à l’échelle automatique
- Mise en application des balises personnalisées
Stratégie de calcul générale
Stratégie de calcul à usage général 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 un délai d’expiration.
{
"instance_pool_id": {
"type": "forbidden",
"hidden": true
},
"spark_version": {
"type": "regex",
"pattern": "12\\.[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"
}
}
Définir des limites sur le calcul de pipeline Delta Live Tables
Remarque
Lorsque vous utilisez des stratégies pour configurer un calcul Delta Live Tables, Databricks vous recommande d’appliquer une stratégie unique aux calculs default
et maintenance
.
Pour configurer une stratégie pour un calcul de pipeline, créez une stratégie avec le champ cluster_type
défini sur dlt
. L’exemple suivant crée une stratégie minimale pour un calcul Delta Live Tables :
{
"cluster_type": {
"type": "fixed",
"value": "dlt"
},
"num_workers": {
"type": "unlimited",
"defaultValue": 3,
"isOptional": true
},
"node_type_id": {
"type": "unlimited",
"isOptional": true
},
"spark_version": {
"type": "unlimited",
"hidden": true
}
}
Stratégie de taille moyenne simple
Permet aux utilisateurs de créer un calcul de taille moyenne avec une configuration minimale. Le seul champ obligatoire au moment de la création est le nom du calcul ; 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": "auto:latest-ml",
"hidden": true
},
"custom_tags.team": {
"type": "fixed",
"value": "product"
}
}
Stratégie de travail uniquement
Permet aux utilisateurs de créer un calcul de travail pour exécuter des travaux. Les utilisateurs ne peuvent pas créer de calcul universel à 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": "unlimited",
"defaultValue": "auto:latest-lts"
},
"custom_tags.team": {
"type": "fixed",
"value": "product"
}
}
Stratégie de metastore externe
Permet aux utilisateurs de créer un calcul avec un metastore défini par l’administrateur déjà attaché. Cela est utile pour permettre aux utilisateurs de créer leur propre calcul 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>"
}
}
Empêche l’utilisation du calcul avec les jobs
Cette stratégie empêche les utilisateurs d’utiliser le calcul pour exécuter des jobs. Les utilisateurs ne pourront utiliser la ressource de calcul qu'avec des notebooks.
{
"workload_type.clients.notebooks": {
"type": "fixed",
"value": true
},
"workload_type.clients.jobs": {
"type": "fixed",
"value": false
}
}
Supprimer la stratégie de mise à l’échelle automatique
Cette stratégie désactive la mise à l’échelle automatique et permet à l’utilisateur de définir le nombre de Workers dans une plage donnée.
{
"num_workers": {
"type": "range",
"maxValue": 25,
"minValue": 1,
"defaultValue": 5
}
}
Mise en application des balises personnalisées
Pour ajouter une règle de balise de calcul à une stratégie, utilisez l’attribut custom_tags.<tag-name>
.
Par exemple, tout utilisateur qui utilise cette stratégie doit remplir une balise COST_CENTER
avec 9999, 9921 ou 9531 pour le lancement du calcul :
{"custom_tags.COST_CENTER": {"type":"allowlist", "values":["9999", "9921", "9531" ]}}