Introduction aux tâches¶
Les tâches sont un moyen puissant d’automatiser le traitement des données et d’optimiser les procédures commerciales sur votre pipeline de données.
Les tâches peuvent être exécutées à des heures programmées ou peuvent être déclenchées par des événements tels que l’arrivée de nouvelles données dans un flux.
Les tâches peuvent exécuter des commandes SQL et des procédures stockées qui utilisent:ref:des langues et des outils pris en charge <label-stored-procedures-handler-languages>
, dont JavaScript, Python, Java, Scala et l’exécution de scripts Snowflake.
Pour les flux de travail complexes, vous pouvez créer des séquences de tâches appelées graphiques de tâches. Les graphiques de tâches peuvent utiliser la logique pour exécuter un comportement dynamique, en exécutant des tâches en parallèle ou en séries.
Dans ce chapitre :
Limitations¶
Évolution du schéma de table n’est pas prise en charge par les tâches.
Aperçu du flux de travail pour la création de tâches¶
Créez un rôle d’administrateur de tâches qui peut exécuter les commandes des étapes suivantes.
Définissez une nouvelle tâche à l’aide de CREATE TASK.
Testez manuellement les tâches à l’aide de EXECUTE TASK.
Autorisez la tâche à s’exécuter en continu à l’aide de ALTER TASK. .. RESUME.
Affinez la tâche si nécessaire à l’aide de ALTER TASK.
Pour plus d’informations sur l’exécution des tâches, voir :
Définir des ressources de calcul¶
Les tâches nécessitent des ressources de calcul pour exécuter des instructions et des procédures. Vous pouvez choisir entre les deux modèles suivants :
Tâches sans serveur : Snowflake détecte les ressources nécessaires et les affecte automatiquement.
Modèle d’entrepôt virtuel géré par l’utilisateur : Vous gérez les ressources de calcul à l’aide d’un entrepôt virtuel.
Tâches sans serveur¶
Avec ce modèle, vous définissez quand vous voulez que la tâche s’exécute, et Snowflake prédit et attribue les ressources de calcul nécessaires à l’exécution de la tâche dans ce laps de temps. La prédiction est basée sur une analyse dynamique des exécutions les plus récentes de la même tâche.
Limitations¶
La taille maximale de calcul pour une tâche sans serveur est équivalente à un entrepôt virtuel XXLARGE.
Créer une tâche à l’aide du modèle de calcul sans serveur¶
Utilisez CREATE TASK pour définir la tâche. Ne pas inclure le paramètre WAREHOUSE.
Le rôle qui exécute la tâche doit avoir le privilège global EXECUTE MANAGED TASK. Pour plus d’informations, voir Sécurité des tâches.
L’exemple suivant crée une tâche qui s’exécute toutes les heures.
CREATE TASK SCHEDULED_T1
SCHEDULE='60 MINUTES'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T1",
definition="SELECT 1",
schedule=timedelta(minutes=60),
),
)
Coût et performances : tailles d’entrepôt¶
Pour garantir l’exécution efficace des tâches sans serveur, vous pouvez définir des tailles d’entrepôt minimales et maximales en définissant les paramètres suivants :
SERVERLESS_TASK_MIN_STATEMENT_SIZE : la taille minimale de l’entrepôt pour des performances prévisibles (par défaut : XSMALL).
SERVERLESS_TASK_MAX_STATEMENT_SIZE: la taille maximale de l’entrepôt pour éviter les coûts imprévus (par défaut : XXLARGE).
Une fois la tâche terminée, Snowflake examine les performances et ajuste les ressources de calcul pour les exécutions futures dans ces limites.
L’exemple suivant montre une tâche qui s’exécute toutes les 30 secondes, avec une taille minimale de l’entrepôt SMALL et une taille maximale d’entrepôt LARGE.
CREATE TASK SCHEDULED_T2
SCHEDULE='30 SECONDS'
SERVERLESS_TASK_MIN_STATEMENT_SIZE='SMALL'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T2",
definition="SELECT 1",
schedule=timedelta(seconds=30),
serverless_task_min_statement_size="SMALL",
serverless_task_max_statement_size="LARGE",
),
)
Intervalle d’accomplissement de la cible¶
Vous pouvez définir une cible plus précoce pour l’achèvement d’une tâche sans serveur. Un intervalle d’achèvement cible est nécessaire pour les tâches déclenchées sans serveur.
Lorsqu’elles sont définies, Snowflake estime et met à l’échelle les ressources pour qu’elles s’achèvent dans l’intervalle d’achèvement cible. Lorsqu’une tâche est déjà à sa taille maximale d’entrepôt et fonctionne trop longtemps, l’intervalle d’achèvement cible est ignoré.
Dans l’exemple suivant, une tâche s’exécute tous les jours à minuit, avec un objectif d’achèvement fixé à 2 heures du matin. L’heure de début et le fuseau horaire sont définis par USING CRON. Si la tâche atteint la plus grande taille d’entrepôt, elle peut s’exécuter pendant trois heures avant de déclencher un délai d’expiration.
CREATE TASK SCHEDULED_T3
SCHEDULE='USING CRON 0 * * * * America/Los_Angeles'
TARGET_COMPLETION_INTERVAL='120 MINUTE'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
USER_TASK_TIMEOUT_MS = 10800000 -- (3 hours)
SUSPEND_TASK_AFTER_NUM_FAILURES = 3
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T3",
definition="SELECT 1",
schedule=Cron("0 * * * *", "America/Los_Angeles"),
target_completion_interval=timedelta(minutes=120),
serverless_task_max_statement_size="LARGE",
user_task_timeout_ms=10800000, # (3 hours)
suspend_task_after_num_failures=3,
),
)
Modèle d’entrepôt virtuel géré par l’utilisateur¶
Avec ce modèle, vous contrôlez totalement les ressources de calcul utilisées pour chaque charge de travail.
Sélectionner un entrepôt¶
Lorsque vous choisissez un entrepôt, tenez compte des éléments suivants :
Consultez les meilleures pratiques dans Considérations relatives aux entrepôts.
Analysez les temps d’exécution moyens des tâches à l’aide de différents entrepôts en fonction de la taille de l’entrepôt et du clustering. Pour plus d’informations, voir Durée de la tâche.
Si l’entrepôt est partagé par plusieurs processus, tenez compte de l’impact de la tâche sur d’autres charges de travail.
Créer une tâche à l’aide du modèle de calcul géré par l’utilisateur¶
Utilisez CREATE TASK, et intégrez le paramètre WAREHOUSE.
Le rôle qui exécute la tâche doit avoir le privilège global EXECUTE MANAGED TASK. Pour plus d’informations, voir Sécurité des tâches.
L’exemple suivant crée une tâche qui s’exécute toutes les heures.
CREATE TASK SCHEDULED_T1
WAREHOUSE='COMPUTE_WH'
SCHEDULE='60 MINUTES'
AS SELECT 1;
Recommandations pour la sélection d’un modèle de calcul¶
Le tableau suivant décrit divers facteurs qui peuvent vous aider à décider quand utiliser des tâches sans serveur plutôt que des tâches gérées par l’utilisateur :
Catégorie |
Tâches sans serveur |
Tâches gérées par l’utilisateur |
Remarques |
---|---|---|---|
Nombre, durée et prévisibilité des charges de travail des tâches concurrentes |
Recommandé pour les entrepôts sous-utilisés où trop peu de tâches sont exécutées simultanément ou se terminent rapidement. Les tâches dont les exécutions sont relativement stables sont de bons candidats pour les tâches sans serveur. |
Recommandé pour les entrepôts utilisés à pleine capacité avec plusieurs tâches simultanées. Également recommandé pour les charges imprévisibles sur les ressources de calcul. Des entrepôts multi-clusters avec suspension et reprise automatiques activées pourraient aider à modérer votre consommation de crédit. |
Pour les tâches sans serveur, Snowflake facture votre compte en fonction de l’utilisation réelle des ressources de calcul. En revanche, la facturation des entrepôts gérés par les utilisateurs est basée sur la taille de l’entrepôt, avec un minimum de 60 secondes à chaque reprise de l’entrepôt. |
Intervalle d’horaire |
Recommandé lorsque le respect de l’intervalle d’horaire est très important. Si une exécution d’une tâche autonome ou d’un graphique de tâches planifiées dépasse l’intervalle, Snowflake augmente la taille des ressources de calcul. |
Recommandé lorsque le respect de l’intervalle d’horaire est moins important. |
L”intervalle de planification fait référence à l’intervalle de temps entre les exécutions planifiées d’une tâche autonome ou de la tâche racine d’un graphique de tâches. L’augmentation des ressources de calcul peut réduire le temps d’exécution de certains codes SQL, mais pas de tous. Cela ne garantit pas l’achèvement de l’exécution d’une tâche dans le délai de traitement par lots. |
La taille maximale d’une exécution de tâche sans serveur est équivalente à un entrepôt XXLARGE. Si la charge de travail d’une tâche nécessite un entrepôt plus grand, créez une tâche gérée par l’utilisateur avec un entrepôt de la taille requise.
Définir des planifications ou des déclencheurs¶
Une tâche peut être paramétrée pour s’exécuter selon une planification fixe ou être déclenchée par un événement, par exemple lorsqu’un flux contient de nouvelles données.
Lorsqu’une tâche est créée, elle démarre comme étant suspendue. Pour permettre à une tâche de suivre une planification ou de détecter des événements en continu, utilisez ALTER TASK … RESUME. Pour exécuter la tâche une seule fois, utilisez EXECUTE TASK.
Exécuter une tâche selon une planification fixe¶
Pour exécuter des tâches selon une planification fixe, définissez la planification lors de la création ou de la modification de la tâche à l’aide de CREATE TASK ou ALTER TASK, ou en modifiant la tâche dans Snowsight, en utilisant le paramètre SCHEDULE.
Snowflake garantit qu’une seule instance d’une tâche avec une planification est exécutée à un moment. Si une tâche est toujours en cours d’exécution lors de la prochaine heure d’exécution planifiée, cette heure planifiée est ignorée.
L’exemple suivant crée une tâche qui s’exécute toutes les 10 secondes :
CREATE TASK task_runs_every_10_seconds
SCHEDULE='10 SECONDS'
AS SELECT 1;
Pour définir une planification basée sur une heure ou un jour spécifiques, utilisez le paramètre SCHEDULE =”USING CRON. ..”.
L’exemple suivant crée une tâche qui s’exécute chaque dimanche à 3 heures, en utilisant le fuseau horaire Amériques/Los Angeles :
CREATE TASK task_sunday_3_am_pacific_time_zone
SCHEDULE='USING CRON 0 3 * * SUN America/Los_Angeles'
AS SELECT 1;
Pour plus d’informations, voir CREATETASK … SCHEDULE.
Exécutez une tâche chaque fois qu’un flux contient de nouvelles données¶
Pour exécuter des tâches chaque fois qu’un flux défini a de nouvelles données ; utilisez Tâches déclenchées. Cette approche est utile pour Extraire, Charger, Transformer (ELT) des flux de travail, car cela élimine les requêtes fréquentes de la source lorsque l’arrivée de nouvelles informations est imprévisible. Cela réduit également la latence en traitant les données immédiatement. Par exemple :
CREATE TASK triggered_task_stream
WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
AS
INSERT INTO completed_promotions
SELECT order_id, order_total, order_time, promotion_id
FROM orders_stream;
Pour plus d’informations, voir Tâches déclenchées.
Exécution selon une planification, mais uniquement si un flux contient de nouvelles données¶
Vous pouvez combiner une tâche planifiée avec une tâche déclenchée. Par exemple, le code suivant crée une tâche qui vérifie un flux pour de nouvelles données toutes les heures :
CREATE TASK triggered_task_stream
SCHEDULE = '1 HOUR'
WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
AS SELECT 1;
Définir ce qui se passe en cas d’échec d’une tâche¶
Suspension automatique de tâches après des échecs d’exécution¶
Il est possible de suspendre automatiquement des tâches après un nombre spécifié d’exécutions consécutives qui échouent ou dont le délai est dépassé. Cette fonction peut réduire les coûts en suspendant les tâches qui consomment des crédits Snowflake, mais ne s’exécutent pas jusqu’à leur terme.
Définir le paramètre SUSPEND_TASK_AFTER_NUM_FAILURES = num
sur une tâche Lorsque le paramètre est défini sur une valeur supérieure à 0
, les tâches sont automatiquement suspendues après que le nombre spécifié d’exécutions consécutives de la tâche ait échoué ou ait expiré.
Ce paramètre peut être défini lors de la création d’une tâche à l’aide de CREATE TASK ou après à l’aide de ALTER TASK. Vous pouvez également modifier cette valeur dans Snowsight.
Le paramètre SUSPEND_TASK_AFTER_NUM_FAILURES peut également être défini au niveau du compte, de la base de données ou du schéma. Le paramètre s’applique à toutes les tâches contenues dans l’objet modifié. Notez que la définition explicite du paramètre à un niveau inférieur remplace la valeur de paramètre définie à un niveau supérieur.
Réessayer automatiquement les tâches qui ont échoué¶
Si des graphiques de tâches se terminent dans un statut FAILED, Snowflake peut automatiquement réessayer les graphiques de tâches. La répétition automatique de tâches est désactivée par défaut. Pour activer cette fonction, définissez TASK_AUTO_RETRY_ATTEMPTS sur une valeur supérieure à 0.
Les tâches qui utilisent les notifications d’erreur envoient des notifications pour chaque nouvelle tentative échouée. Pour plus d’informations, voir Configuration d’une tâche pour envoyer des notifications d’erreur.
Lorsque vous définissez la valeur du paramètre TASK_AUTO_RETRY_ATTEMPTS au niveau du compte, de la base de données ou du schéma, le changement est appliqué aux tâches contenues dans l’objet modifié lors de leur exécution planifiée suivante.
Définir des paramètres de session supplémentaires¶
Une tâche prend en charge tous les paramètres de session. Pour obtenir la liste complète, voir Paramètres. Les tâches ne prennent pas en charge les paramètres de compte ou d’utilisateur.
Pour définir les paramètres de session d’une tâche, ajoutez le ou les paramètres voulus à la définition de cette tâche à l’aide de CREATE TASK, ou modifiez la tâche à l’aide de ALTER TASK. .. SET. Exemples :
CREATE TASK my_task
SCHEDULE = 'USING CRON 0 * * * * UTC'
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
ALTER TASK my_task
SET USER_TASK_TIMEOUT_MS = 10000 -- Changes maximum runtime to 10 seconds
Tâches en cours d’exécution¶
Cette section décrit les différentes manières dont une tâche peut être planifiée et exécutée, et comment la version d’une tâche est déterminée.
Exécuter une tâche manuellement¶
Après avoir défini une nouvelle tâche et ses paramètres à l’aide de CREATE TASK ou ALTER TASK, vous pouvez lancer une exécution unique de la tâche à l’aide de EXECUTE TASK. Cette commande est utile pour tester des tâches nouvelles ou modifiées.
Note
Vous pouvez appeler cette commande SQL directement dans les scripts ou dans les procédures stockées.
Cette commande prend en charge l’intégration des tâches dans des pipelines de données externes.
Tout service tiers capable de s’authentifier sur votre compte Snowflake et d’autoriser les actions SQL peut exécuter des tâches à l’aide de la commande EXECUTE TASK.
Gestion des versions des exécutions de tâches¶
Lorsqu’une tâche autonome est reprise pour la première fois ou exécutée manuellement, une version initiale de la tâche est définie. La tâche autonome s’exécute en utilisant cette version. Après la suspension et la modification d’une tâche, une nouvelle version est définie lorsque la tâche autonome est reprise ou exécutée manuellement.
Lorsque la tâche est suspendue, toutes les futures exécutions planifiées de la tâche sont annulées ; cependant, les tâches en cours d’exécution continuent de s’exécuter en utilisant la version actuelle.
Par exemple, supposons que la tâche soit suspendue, mais qu’une exécution planifiée de cette tâche ait déjà commencé. Le propriétaire de la tâche modifie le code SQL appelé par la tâche alors que celle-ci est toujours en cours d’exécution. La tâche exécute le code SQL dans sa définition en utilisant la version de la tâche qui existait lorsque la tâche a commencé son exécution. Lorsque la tâche est reprise ou est exécutée manuellement, une nouvelle version de la tâche est définie. Cette nouvelle version inclut les modifications apportées à la tâche.
Pour récupérer l’historique des versions de tâches, interrogez la vue TASK_VERSIONS Account Usage (dans la base de données partagée SNOWFLAKE).
Affichage de l’historique des tâches de votre compte¶
Vous pouvez voir l’historique des tâches de votre compte en utilisant SQL ou Snowsight.
Pour voir l’historique des tâches dans Snowsight, consultez Voir l’historique des tâches.
Pour obtenir des informations sur les privilèges requis, consultez Affichage de l’historique des tâches.
Pour visualiser l’historique d’exécution d’une seule tâche :
- SQL:
Interrogez la fonction de table TASK_HISTORY (dans Schéma d’information de Snowflake).
Pour afficher les détails de l’exécution d’un graphique de tâches qui est actuellement programmée ou en cours :
- SQL:
Interrogez la fonction de table CURRENT_TASK_GRAPHS (dans Schéma d’information de Snowflake).
Pour afficher l’historique des exécutions de graphiques de tâches qui se sont correctement effectuées, qui ont échoué ou qui ont été annulées au cours des 60 dernières minutes :
- SQL:
Interrogez la fonction de table COMPLETE_TASK_GRAPHS (dans Schéma d’information de Snowflake).
Interrogez la vue Vue COMPLETE_TASK_GRAPHS (dans Account Usage).
Coûts des tâches¶
Les coûts associés à l’exécution d’une tâche pour exécuter le code SQL diffèrent selon la source des ressources de calcul pour la tâche :
- Entrepôt géré par les utilisateurs
Snowflake facture votre compte pour l’utilisation du crédit en fonction de l’utilisation de l’entrepôt pendant l’exécution d’une tâche, de la même manière que l’utilisation de l’entrepôt pour l’exécution des mêmes instructions SQL dans l’interface Web d’un client ou de Snowflake. La facturation à la seconde et la suspension automatique du crédit vous permettent de commencer avec des tailles d’entrepôts plus grandes, puis d’ajuster la taille en fonction de vos charges de travail.
- Modèle de calcul sans serveur
Snowflake facture votre compte sur la base de l’utilisation des ressources de calcul. Les frais sont calculés sur la base de votre utilisation totale des ressources, y compris l’utilisation du service Cloud, mesurée en heures de calcul d’utilisation du crédit. Le coût en heures de calcul varie en fonction de la taille de l’entrepôt et de la durée d’exécution de la requête. Pour plus d’informations, voir Utilisation du crédit sans serveur ou Requête : Coût total des tâches sans serveur.
Snowflake analyse les exécutions de tâches dans l’historique des tâches pour déterminer dynamiquement la taille et le nombre corrects des ressources de calcul sans serveur. Au fur et à mesure que Snowflake augmente et diminue automatiquement les ressources pour gérer vos exécutions de tâches, le coût d’exécution des tâches augmente proportionnellement.
Pour savoir combien de crédits sont consommés par des tâches, reportez-vous au « Tableau des crédits de fonctionnalité sans serveur » dans la Table de consommation du service Snowflake.
Tenez compte des meilleures pratiques suivantes pour optimiser les coûts lorsque vous créez des tâches :
Définissez la SCHEDULE pour qu’elle s’exécute moins souvent.
Utilisez les paramètres de suspension et de relance automatiques pour éviter de gaspiller des ressources sur des tâches qui échouent.
Créez des Tâches déclenchées pour les tâches qui ne doivent être exécutées que dans certaines conditions, par exemple lorsqu’un flux de données contient de nouvelles données.
Créez un budget et envoyez des alertes sur les limites de dépenses pour les fonctions sans serveur. Pour plus d’informations, voir Surveillance de l’utilisation du crédit à l’aide de Budgets.
Pour récupérer l’utilisation actuelle du crédit pour une tâche spécifique, interrogez la fonction de la table SERVERLESS_TASK_HISTORY. Exécutez l’instruction suivante en tant que propriétaire de la tâche, où
<database_name>
est la base de données qui contient la tâche et<task_name>
est le nom de la tâche :SET num_credits = (SELECT SUM(credits_used) FROM TABLE(<database_name>.information_schema.serverless_task_history( date_range_start=>dateadd(D, -1, current_timestamp()), date_range_end=>dateadd(D, 1, current_timestamp()), task_name => '<task_name>') ) );
Pour récupérer l’utilisation actuelle du crédit pour toutes les tâches sans serveur, interrogez la vue SERVERLESS_TASK_HISTORY. Exécutez l’instruction suivante en tant qu’administrateur de compte :
SELECT start_time, end_time, task_id, task_name, credits_used, schema_id, schema_name, database_id, database_name FROM snowflake.account_usage.serverless_task_history ORDER BY start_time, task_id;
Surveillance des coûts¶
L’utilisation de tâches sans serveur entraîne des coût de calcul. Vous pouvez utiliser les vues relatives aux coûts des schémas ACCOUNT_USAGE et ORGANIZATION_USAGE pour suivre les coûts associés aux tâches sans serveur. Lorsque vous interrogez ces vues, appliquez un filtre à la colonne service_type
pour trouver les valeurs SERVERLESS_TASK
ou SERVERLESS_TASK_FLEX
.
Vue |
Schéma |
|
Rôles avec privilèges requis |
---|---|---|---|
ACCOUNT_USAGE |
SERVERLESS_TASK |
Rôle ACCOUNTADMIN, rôle de base de données USAGE_VIEWER |
|
ACCOUNT_USAGE |
SERVERLESS_TASK |
Rôle ACCOUNTADMIN, rôle de base de données USAGE_VIEWER |
|
ORGANIZATION_USAGE |
SERVERLESS_TASK |
Rôle ACCOUNTADMIN, rôle de base de données USAGE_VIEWER |
|
ORGANIZATION_USAGE |
SERVERLESS_TASK |
Rôle ORGADMIN, rôle GLOBALORGADMIN, rôle base de données ORGANIZATION_USAGE_VIEWER |
Exemple : Visualiser le coût total lié aux tâches sans serveur par compte à l’échelle de l’organisation.
Exemple : Visualiser le coût total lié aux tâches sans serveur pour le compte du 1er au 31 décembre 2024.
SELECT
name,
SUM(credits_used_compute) AS total_credits
FROM
SNOWFLAKE.ACCOUNT_USAGE.METERING_HISTORY
WHERE
service_type ILIKE '%SERVERLESS_TASK%'
AND start_time >= '2024-12-01'
AND end_time <= '2024-12-31'
GROUP BY
name
ORDER BY
name ASC;
Exemple : Visualiser le coût total lié aux tâches sans serveur par compte à l’échelle de l’organisation.
SELECT
usage_date AS date,
account_name,
SUM(usage) AS credits,
currency,
SUM(usage_in_currency) AS usage_in_currency
FROM
SNOWFLAKE.ORGANIZATION_USAGE.USAGE_IN_CURRENCY_DAILY
WHERE
USAGE_TYPE ILIKE '%SERVERLESS_TASK%'
GROUP BY
usage_date, account_name, currency
ORDER BY
USAGE_DATE DESC;
Pour obtenir des informations sur le nombre de crédits facturés par heure de calcul pour l’opération du Trust Center, reportez-vous à la table 5 de la Snowflake Service Consumption Table.
Durée de la tâche¶
La durée de la tâche comprend le temps entre le moment où une tâche doit démarrer et le moment où elle se termine. Cette durée comprend les deux éléments suivants :
Durée dans la file d’attente : correspond à la durée d’attente d’une tâche jusqu’à ce que les ressources de calcul soient disponibles pour qu’elle puisse commencer. Pour calculer la durée d’attente, interrogez Vue TASK_HISTORY et comparez SCHEDULED_TIME à QUERY_START_TIME.
Temps d’exécution : temps nécessaire à la tâche pour exécuter ses instructions SQL ou autres opérations. Pour calculer le temps d’exécution, interrogez Vue TASK_HISTORY, et comparez QUERY_START_TIME àCOMPLETED_TIME.
Par exemple, le diagramme suivant montre une tâche sans serveur dont l’exécution est planifiée toutes les 15 secondes. La durée totale de l’exécution de cette tâche est de 12 secondes, dont 5 secondes dans la file d’attente et 7 secondes d’exécution.
Délais d’expiration¶
Si l’exécution d’une tâche dépasse la durée planifiée ou l’intervalle d’achèvement cible, la tâche continue par défaut à s’exécuter jusqu’à ce qu’elle soit terminée, qu’elle expire ou qu’elle échoue.
Lorsque les valeurs de:ref:label-statement_timeout_in_seconds
et USER_TASK_TIMEOUT_MS sont définies, le délai d’expiration correspond à la valeur la plus basse autre que zéro d’entre ces deux paramètres.
Lorsque STATEMENT_QUEUED_TIMEOUT_IN_SECONDS et USER_TASK_TIMEOUT_MS sont tous deux définis, la valeur de USER_TASK_TIMEOUT_MS prévaut.
Pour plus d’informations sur les délais d’expiration relatifs aux graphiques de tâches, voir Délais d’expiration du graphique de tâches.
Considérations¶
Pour les tâches sans serveur, Snowflake dimensionne automatiquement les ressources pour s’assurer que les tâches se terminent dans un intervalle d’achèvement cible, y compris le temps de file d’attente.
Pour les tâches gérées par l’utilisateur, des périodes d’attente plus longues sont courantes lorsque les tâches sont planifiées pour être exécutées dans un entrepôt partagé ou occupé.
Sécurité des tâches¶
Pour exécuter des tâches, vous devez disposer des privilèges d’accès adéquats. Cette section décrit comment gérer l’accès aux tâches.
Pour plus d’informations sur la propriété des graphiques de tâches, consultez Gérer la propriété du graphique de tâches.
Privilèges de contrôle d’accès¶
Création de tâches¶
La création de tâches nécessite un rôle avec au minimum les privilèges suivants :
Objet |
Privilège |
Remarques |
---|---|---|
Compte |
EXECUTE MANAGED TASK |
Obligatoire uniquement pour les tâches qui dépendent de ressources de calcul sans serveur. |
Base de données |
USAGE |
|
Schéma |
USAGE, CREATE TASK |
|
Entrepôt |
USAGE |
Requis uniquement pour les tâches qui dépendent des entrepôts gérés par l’utilisateur. |
Tâches en cours d’exécution¶
Après la création d’une tâche, le propriétaire de la tâche doit disposer des privilèges suivants pour que la tâche puisse être exécutée :
Objet |
Privilège |
Remarques |
---|---|---|
Compte |
EXECUTE TASK |
Requis pour exécuter toutes les tâches du rôle. La révocation du privilège EXECUTE TASK sur un rôle empêche toutes les tâches suivantes de démarrer sous ce rôle. |
Compte |
EXECUTE MANAGED TASK |
Obligatoire uniquement pour les tâches qui dépendent de ressources de calcul sans serveur. |
Base de données |
USAGE |
|
Schéma |
USAGE |
|
Tâche |
USAGE |
|
Entrepôt |
USAGE |
Requis uniquement pour les tâches qui dépendent des entrepôts gérés par l’utilisateur. |
En outre, le rôle doit disposer des autorisations requises pour exécuter l’instruction SQL exécutée par la tâche.
Affichage de l’historique des tâches¶
Pour voir les tâches, vous devez disposer d’un ou de plusieurs des privilèges suivants :
Le rôle ACCOUNTADMIN
Le privilège OWNERSHIP sur la tâche
Le privilège MONITOR EXECUTION global
Reprise ou suspension de tâches¶
En plus du propriétaire de la tâche, un rôle qui a le privilège OPERATE sur la tâche peut suspendre ou reprendre la tâche. Ce rôle doit avoir le privilège USAGE sur la base de données et le schéma qui contiennent la tâche. Aucun autre privilège n’est requis.
Lorsqu’une tâche est reprise, Snowflake vérifie que le rôle de propriétaire de la tâche a les privilèges énumérés dans Tâches en cours d’exécution
Créer des rôles personnalisés pour gérer les autorisations de tâches¶
Avec les rôles personnalisés, vous pouvez facilement gérer les autorisations accordées à chaque compte ou rôle dans Snowflake. Pour modifier les autorisations de tous les comptes ou rôles utilisant le rôle personnalisé, mettez ce dernier à jour. Vous pouvez également révoquer les autorisations en supprimant le rôle personnalisé.
Créer un rôle personnalisé pour créer des tâches¶
Snowflake nécessite des autorisations différentes pour créer des tâches sans serveur et des tâches gérées par l’utilisateur.
Par exemple, pour créer des tâches gérées par l’utilisateur, créez un rôle personnalisé nommé warehouse_task_creation
et accordez à ce rôle les privilèges CREATE TASK et USAGE sur l’entrepôt dans lequel le rôle peut créer des tâches.
USE SYSADMIN;
CREATE ROLE warehouse_task_creation
COMMENT = 'This role can create user-managed tasks.';
from snowflake.core.role import Role
root.session.use_role("SYSADMIN")
my_role = Role(
name="warehouse_task_creation",
comment="This role can create user-managed tasks."
)
root.roles.create(my_role)
USE ACCOUNTADMIN;
GRANT CREATE TASK
ON SCHEMA schema1
TO ROLE warehouse_task_creation;
from snowflake.core.role import Securable
root.session.use_role("ACCOUNTADMIN")
root.roles['warehouse_task_creation'].grant_privileges(
privileges=["CREATE TASK"], securable_type="schema", securable=Securable(name='schema1')
)
GRANT USAGE
ON WAREHOUSE warehouse1
TO ROLE warehouse_task_creation;
from snowflake.core.role import Securable
root.roles['warehouse_task_creation'].grant_privileges(
privileges=["USAGE"], securable_type="warehouse", securable=Securable(name='warehouse1')
)
Comme exemple de rôle pouvant créer des tâches sans serveur ; créez un rôle personnalisé nommé serverless_task_creation
et accordez au rôle le privilège CREATE TASK et le privilège EXECUTE MANAGED TASK de niveau compte.
USE SYSADMIN;
CREATE ROLE serverless_task_creation
COMMENT = 'This role can create serverless tasks.';
from snowflake.core.role import Role
root.session.use_role("SYSADMIN")
my_role = Role(
name="serverless_task_creation",
comment="This role can create serverless tasks."
)
root.roles.create(my_role)
USE ACCOUNTADMIN;
GRANT CREATE TASK
ON SCHEMA schema1
TO ROLE serverless_task_creation;
from snowflake.core.role import Securable
root.session.use_role("ACCOUNTADMIN")
root.roles['serverless_task_creation'].grant_privileges(
privileges=["CREATE TASK"], securable_type="schema", securable=Securable(name='schema1')
)
GRANT EXECUTE MANAGED TASK ON ACCOUNT
TO ROLE serverless_task_creation;
root.roles['serverless_task_creation'].grant_privileges(
privileges=["EXECUTE MANAGED TASK"], securable_type="account"
)
Créer un rôle personnalisé pour administrer les tâches¶
Créez un rôle personnalisé disposant du privilège EXECUTE TASK et attribuez ce rôle personnalisé à tout rôle de propriétaire de tâche afin de lui permettre de modifier ses propres tâches. Pour supprimer la possibilité d’exécuter la tâche du rôle de propriétaire de la tâche , révoquez ce rôle personnalisé à partir du rôle de propriétaire de la tâche.
Par exemple, créez un nom de rôle personnalisé taskadmin
et accordez-lui le privilège EXECUTE TASK. Attribuez le rôle taskadmin
à un rôle de propriétaire de tâche nommé myrole
:
USE ROLE securityadmin;
CREATE ROLE taskadmin;
from snowflake.core.role import Role
root.session.use_role("securityadmin")
root.roles.create(Role(name="taskadmin"))
Définissez le rôle actif sur ACCOUNTADMIN avant d’accorder les privilèges au niveau du compte au nouveau rôle
USE ROLE accountadmin;
GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;
root.session.use_role("accountadmin")
root.roles['taskadmin'].grant_privileges(
privileges=["EXECUTE TASK", "EXECUTE MANAGED TASK"], securable_type="account"
)
Définissez le rôle actif sur SECURITYADMIN pour montrer que ce rôle peut accorder un rôle à un autre rôle
USE ROLE securityadmin;
GRANT ROLE taskadmin TO ROLE myrole;
from snowflake.core.role import Securable
root.session.use_role("securityadmin")
root.roles['myrole'].grant_role(role_type="ROLE", role=Securable(name='taskadmin'))
Pour plus d’informations sur la façon de créer des rôles personnalisés et des hiérarchies de rôles, voir Configuration du contrôle d’accès.
Supprimer un rôle de propriétaire de tâche¶
Lorsque vous supprimez le rôle de propriétaire d’une tâche, la tâche transfère la propriété au rôle qui a supprimé le rôle de propriétaire. Lorsqu’une tâche transfère sa propriété, elle est automatiquement mise en pause et les nouvelles exécutions ne sont pas planifiées tant que le nouveau propriétaire n’a pas repris la tâche.
Si vous supprimez le rôle alors que la tâche est en cours d’exécution, le traitement de la tâche s’achève sous le rôle supprimé.
Tâches exécutées par un service système¶
Par défaut, les tâches s’exécutent en tant que service système qui est découplé d’un utilisateur.
Le service système exécute la tâche en utilisant les mêmes privilèges que le propriétaire de la tâche.
Cela évite les complexités associées à la gestion des utilisateurs : par exemple, si un utilisateur est supprimé, bloqué en raison de problèmes d’authentification, ou si des rôles ont été supprimés, la tâche continue de s’exécuter sans interruption.
L’historique des requêtes pour les exécutions de tâches est associé au service système. Il n’existe aucun identifiant de connexion utilisateur pour ce service et aucune personne ne peut assumer son identité. L’activité pour le service système est limitée à votre compte. Les mêmes protections de chiffrement et autres protocoles de sécurité sont intégrés à ce service comme c’est le cas pour d’autres opérations.
Exécuter des tâches avec des privilèges d’utilisateur¶
Les tâches peuvent être configurées pour s’exécuter avec les privilèges d’un utilisateur spécifique, en plus des privilèges du rôle de propriétaire de la tâche. Les tâches spécifiant EXECUTE AS USER s’exécutent pour le compte de l’utilisateur nommé, au lieu du service système.
Gérer les privilèges multi-rôles : Dans les situations où les utilisateurs ont des rôles secondaires, les utilisateurs peuvent exécuter une tâche en utilisant les privilèges combinés de leurs rôles primaires et secondaires. Cette configuration garantit que la tâche dispose des autorisations nécessaires pour accéder à toutes les ressources requises.
Utiliser des politiques de masquage des données et d’accès aux lignes basées sur l’utilisateur : Dans les situations où les politiques de gouvernance des données prennent en compte l’utilisateur formulant la requête, l’exécution d’une tâche en tant qu’utilisateur garantit la compatibilité de la tâche avec les politiques applicables.
Assurer la responsabilité de toutes les opérations : Toutes les instances d’une tâche qui sont exécutées avec EXECUTE AS USER sont attribuées à l’utilisateur configuré au lieu de l’utilisateur du SYSTEM. Cette attribution permet de maintenir une trace d’audit claire pour toutes les opérations.
Contrôle d’accès¶
Le rôle de propriétaire de la tâche doit se voir attribuer le privilège IMPERSONATE sur l’utilisateur spécifié par EXECUTE AS USER, et l’utilisateur spécifié doit se voir attribuer le rôle de propriétaire de la tâche.
Lorsque la tâche s’exécute, le rôle principal de la session de la tâche sera le rôle de propriétaire de la tâche et les rôles secondaires par défaut de l’utilisateur seront activés. Les utilisateurs pourront changer de rôles principaux avec la commande:doc:USE ROLE </sql-reference/sql/use-role>
et ajuster les rôles secondaires dans la session de la tâche avec la commande USE SECONDARY ROLES.
Exemples : Configurer l’utilisateur de service et le rôle d’équipe¶
À l’aide du rôle d’administrateur, définissez un utilisateur de service à utiliser pour la tâche.
L’exemple suivant crée un utilisateur de service nommé
task_user
:USE ROLE ACCOUNTADMIN; CREATE USER task_user;
Créez un rôle de tâche, puis attribuez-le à l’utilisateur de service :
CREATE ROLE task_role; GRANT ROLE task_role to USER task_user;
Autorisez le rôle de tâche à exécuter des requêtes pour le compte du rôle d’utilisateur d’équipe :
GRANT IMPERSONATE ON USER task_user TO ROLE task_role;
Accordez les privilèges appropriés au rôle de tâche.
USE ROLE ACCOUNTADMIN; -- Grant the team role the privileges to create tasks in a specific schema GRANT CREATE TASK ON SCHEMA schema1 TO ROLE task_role; -- Grant the team role the privileges to use a specific warehouse GRANT USAGE ON WAREHOUSE warehouse1 TO ROLE task_role; -- Grant the team role the privileges to run tasks on a serverless compute model GRANT EXECUTE MANAGED TASK ON ACCOUNT TO ROLE task_role;
Exécuter une tâche pour le compte d’un utilisateur de service¶
Une fois que le rôle d’équipe a la propriété de la tâche, les membres de l’équipe peuvent modifier la tâche et l’exécuter pour le compte de l’utilisateur de service.
Exemple :
USE ROLE task_owner;
CREATE TASK team_task
SCHEDULE='12 HOURS'
EXECUTE AS USER task_user
AS SELECT 1;
Dans l’exemple précédent, les journaux créés montreraient que task_user
a modifié la tâche.
(Pour les tests uniquement) Autoriser un utilisateur à se faire passer pour un autre utilisateur directement¶
Lorsque vous testez ou prototypez des modifications, vous, en tant qu’administrateur, pouvez permettre aux utilisateurs de se faire passer directement pour un autre utilisateur. Ce scénario, bien que pris en charge, n’est pas recommandé dans un environnement de production.
Configurez un rôle pour l’usurpation d’identité :
USE ROLE ACCOUNTADMIN; CREATE ROLE janes_role; GRANT ROLE janes_role to USER jane; GRANT IMPERSONATE ON USER jane TO ROLE janes_role;
Créez une tâche en utilisant le nouveau rôle :
USE ROLE janes_role; CREATE TASK janes_task SCHEDULE='60 M' AS SELECT 1;
Attribuez le rôle à un autre utilisateur.
Dans l’exemple suivant, l’utilisateur Jane accorde l’accès à l’utilisateur Billy :
--Logged in as Jane or account admin GRANT ROLE janes_role to USER billy;
L’autre utilisateur modifie la tâche.
Dans l’exemple suivant, l’utilisateur Billy modifie la tâche :
-- Logged in as billy USE ROLE janes_role; ALTER TASK janes_task SET EXECUTE AS USER jane;
Examinez les journaux.
La commande SHOW GRANTS TO ROLE montrerait que Jane a accordé le rôle à Billy. La vue QUERY_HISTORY afficherait alors que Billy a modifié la tâche. Les futures exécutions de tâches apparaîtront toujours comme étant exécutées par Jane.
USE ROLE ACCOUNTADMIN; SHOW GRANTS TO ROLE janes_role; QUERY_HISTORY() WHERE QUERY_TEXT ILIKE '%janes_task%';
Opérations de tâches de Langage de définition des données des tâches (DDL)¶
Pour soutenir la création et la gestion des tâches, Snowflake fournit l’ensemble suivant d’opérations DDL spéciales :
De plus, les fournisseurs peuvent afficher, accorder ou révoquer l’accès aux objets de base de données nécessaires pour ELT en utilisant le DDL de contrôle d’accès standard suivant :
Méthodes DatabaseRoleResource :
grant_future_privileges
grant_privileges
grant_privileges_on_all
grant_role
iter_future_grants_to
iter_grants_to
revoke_future_privileges
revoke_grant_option_for_future_privileges
revoke_grant_option_for_privileges
revoke_grant_option_for_privileges_on_all
revoke_privileges
revoke_privileges_on_all
revoke_role
Méthodes (rôle du compte) RoleResource :
grant_future_privileges
grant_privileges
grant_privileges_on_all
grant_role
iter_future_grants_to
iter_grants_of
iter_grants_on
iter_grants_to
revoke_future_privileges
revoke_grant_option_for_future_privileges
revoke_grant_option_for_privileges
revoke_grant_option_for_privileges_on_all
revoke_privileges
revoke_privileges_on_all
revoke_role
grant_role
iter_grants_to
revoke_role
Fonctions des tâches¶
Pour prendre en charge la récupération d’informations sur les tâches, Snowflake fournit l’ensemble de fonctions suivant :
Plus d’exemples Python¶
Pour plus d’exemples Python, consultez Gestion des tâches et des graphiques de tâches Snowflake avec Python.