Introduction aux tâches¶
Actuellement, une tâche peut exécuter une seule instruction SQL, dont un appel à une procédure stockée.
Les tâches peuvent être combinées avec des flux de table pour des workflows continus ELT afin de traiter les lignes des tables récemment modifiées. Les flux assurent une sémantique unique pour les données nouvelles ou modifiées dans une table.
Les tâches peuvent également être utilisées indépendamment pour générer des rapports périodiques en insérant ou en fusionnant des lignes dans un tableau de rapports ou en effectuant d’autres travaux périodiques.
Dans ce chapitre :
Planification des tâches¶
Aucune source d’événement ne peut déclencher une tâche. En revanche, une tâche s’exécute selon un planning, qui peut être défini lors de la création d’une tâche (avec CREATE TASK) ou d’une version ultérieure (avec ALTER TASK).
Snowflake garantit qu’une seule instance d’une tâche avec une planification (c’est-à-dire une tâche autonome ou la tâche racine dans une arborescence de tâches) est exécutée à un moment donné. 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.
Choix d’un entrepôt¶
Les meilleures pratiques suggérées lors de la configuration des entrepôts sont décrites dans Remarques sur les entrepôts virtuels . Nous vous recommandons d’analyser le temps d’exécution moyen d’une tâche ou d’une arborescence de tâches donnée à l’aide d’un entrepôt spécifique en fonction de la taille de l’entrepôt et du clustering, ainsi que de savoir si l’entrepôt est partagé par plusieurs processus ou est dédié à l’exécution de cette tâche unique (ou arborescence de tâches).
Interrogez la fonction de table TASK_HISTORY dans le Schéma d’information. La différence moyenne entre les heures planifiées et effectuées pour une tâche est la durée d’exécution moyenne attendue de la tâche, y compris toute période au cours de laquelle la tâche a été mise en file d’attente. Une tâche est mise en file d’attente lorsque d’autres processus utilisent actuellement tous les serveurs de l’entrepôt.
À moins que les instructions SQL définies pour les tâches puissent être optimisées (soit en réécrivant les instructions, soit en utilisant des procédures stockées), cela serait le temps d’exécution moyen attendu pour la tâche (ou l’arborescence des tâches). Choisissez la bonne taille pour l’entrepôt en fonction de votre analyse pour vous assurer que la tâche (ou l’arborescence des tâches) se termine dans cette période.
Le diagramme suivant montre une période de 1 minute au cours de laquelle une seule tâche a été mise en file d’attente pendant 20 secondes, puis exécutée pendant 40 secondes.
Le diagramme suivant montre une arborescence de tâches qui nécessite en moyenne 5 minutes pour chaque exécution. Le diagramme montre la période pour 2 exécutions de l’arborescence des tâches à terminer. Cette fenêtre est calculée à partir du moment où la tâche racine doit démarrer jusqu’à ce que la dernière tâche enfant de l’arborescence soit terminée. Dans cet exemple, l’arborescence des tâches est partagée avec d’autres opérations simultanées qui se mettent en file d’attente pendant l’exécution de chacune des 3 tâches de l’arborescence. Ces opérations simultanées consomment toutes les ressources disponibles lorsque chaque tâche de l’arborescence termine son exécution et avant le démarrage de la tâche suivante. Par conséquent, la période de chaque tâche inclut une certaine quantité de files d’attente pendant qu’elle attend que d’autres opérations se terminent et abandonnent les serveurs.
Notez que même si cette arborescence de tâches s’exécutait sur un entrepôt dédié, un bref décalage serait attendu après la fin d’une tâche parent et l’exécution de toute tâche enfant ; cependant, aucune file d’attente pour les ressources partagées avec d’autres opérations ne se produirait. La taille de l’entrepôt que vous choisissez doit être suffisamment grande pour accueillir plusieurs tâches enfants déclenchées simultanément par les tâches parents.
Planification des tâches et heure d’été¶
L’expression cron dans une définition de tâche prend en charge la spécification d’un fuseau horaire. Une tâche planifiée s’exécute selon l’expression cron spécifiée à l’heure locale pour un fuseau horaire donné. Un soin particulier doit être apporté aux tâches de planification pour les fuseaux horaires qui reconnaissent l’heure d’été. Les tâches planifiées à des heures précises les jours où la transition de l’heure standard à l’heure d’été (ou l’inverse) se produit peuvent avoir des comportements inattendus.
Par exemple :
En automne, de l’heure d’été à l’heure d’hiver, une tâche dont le démarrage est prévu à 1 AM dans le fuseau horaire Amérique/Los Angeles (c.-à-d.
0 1 * * * America/Los_Angeles
) est exécutée deux fois : une fois à 1 AM puis à nouveau lorsque 1:59:59 AM passe à 1:00:00 AM heure locale. C’est-à-dire qu’il y a deux moments où l’heure locale est 1 AM.Au printemps, lorsqu’on passe de l’heure d’hiver à l’heure d’été, une tâche programmée pour commencer à 2 AM dans le fuseau horaire Amérique/Los Angeles (c.-à-d.
0 2 * * * America/Los_Angeles
) ne s’exécute pas du tout, car l’heure locale passe de 1:59:59 AM à 3:00:00 AM. C’est-à-dire qu’il n’y a pas de moment durant ce jour où l’heure locale est 2 AM.
Pour éviter les exécutions de tâches inattendues dues à l’heure d’été, voici deux possibilités :
Ne planifiez pas l’exécution de tâches à une heure précise comprise entre 1 AM et 3 AM (tous les jours ou les jours de la semaine comprenant le dimanche), ou
Ajustez manuellement l’expression cron pour les tâches planifiées à ces heures deux fois par an afin de compenser le changement d’heure dû à l’heure d’été.
Arborescence simple de tâches¶
Les utilisateurs peuvent définir une structure simple en forme d’arborescence de tâches qui commence par une tâche racine et présente des dépendances de tâches. L’implémentation actuelle prend en charge un seul chemin entre deux nœuds quelconques ; c’est-à-dire qu’une tâche individuelle ne peut avoir qu’un seul prédécesseur (une tâche parent). Cela diffère d’une structure de graphe acyclique dirigé (DAG), dans laquelle un seul nœud peut avoir plusieurs parents.

Un prédécesseur peut être défini lors de la création d’une tâche (à l’aide de CREATE TASK … AFTER) ou après (à l’aide de ALTER TASK … ADD AFTER). La tâche racine dans l’arborescence devrait avoir une planification définie, tandis que chacune des autres tâches de l’arborescence a un prédécesseur défini pour les lier ensemble. Lorsqu’une exécution d’un prédécesseur se termine correctement, elle déclenche l’exécution de toutes les tâches enfants qui identifient cette tâche comme prédécesseur dans leur définition.
Une arborescence simple de tâches est limitée à un maximum de 1 000 tâches au total (y compris la tâche racine) dans un état repris. Une tâche individuelle dans l’arborescence est limitée à un seul prédécesseur ; cependant, une tâche peut comporter un maximum de 100 tâches enfants (c’est-à-dire d’autres tâches identifiant la tâche en tant que prédécesseur).
À l’heure actuelle, nous ne pouvons pas garantir qu’une seule instance d’une tâche avec un prédécesseur défini est en cours d’exécution à un moment donné.
Note
Un bref décalage survient après l’exécution d’une tâche parent et l’exécution de toute tâche enfant.
Pour reprendre de manière récursive toutes les tâches dépendantes liées à une tâche racine, interrogez la fonction SYSTEM$TASK_DEPENDENTS_ENABLE plutôt que de reprendre chaque tâche individuellement (à l’aide de ALTER TASK … RESUME).
Arborescence simple des tâches et propriété des tâches¶
Toutes les tâches d’une arborescence simple doivent avoir le même propriétaire (c’est-à-dire qu’un seul rôle doit disposer du privilège OWNERSHIP sur toutes les tâches de l’arborescence) et être stockées dans les mêmes base de données et schéma.
Lorsque la propriété de toutes les tâches dans une arborescence de tâches est transférée en même temps, via l’une des activités suivantes, les liens entre toutes les tâches de l’arborescence sont conservés :
Le propriétaire actuel de toutes les tâches qui composent l’arborescence des tâches est détruit (à l’aide de DROP ROLE). La propriété des objets appartenant au rôle détruit est transférée au rôle qui exécute la commande DROP ROLE.
La propriété de toutes les tâches qui composent l’arborescence des tâches est explicitement transférée vers un autre rôle (par exemple, en exécutant GRANT OWNERSHIP sur toutes les tâches d’un schéma).
Rupture du lien entre les tâches prédécesseur et enfant¶
Si le prédécesseur d’une tâche enfant est supprimé (à l’aide de ALTER TASK … REMOVE AFTER), l’ancienne tâche enfant devient alors une tâche autonome ou une tâche racine, selon que d’autres tâches identifient cette ancienne tâche enfant comme leur prédécesseur.
Si une tâche prédécesseur est détruite (à l’aide de DROP TASK), ou si la propriété d’une tâche prédécesseur est transférée à un autre rôle (à l’aide de GRANT OWNERSHIP), toutes les anciennes tâches enfants qui ont identifié cette tâche comme prédécesseur deviennent des tâches autonomes ou racines selon que d’autres tâches identifient ces anciennes tâches enfants comme leur prédécesseur.
Gestion des versions des exécutions de l’arborescence des tâches¶
Lorsque la tâche racine démarre une exécution planifiée, une version de l’arborescence entière des tâches est établie. Toutes les propriétés de toutes les tâches de l’arborescence sont définies. L’arborescence complète des tâches termine son exécution actuelle en utilisant les propriétés de cette version définie.
Avant qu’une instruction DDL puisse être exécutée sur n’importe quelle tâche dans une arborescence de tâches, la tâche racine doit être suspendue (en utilisant ALTER TASK … SUSPEND). Lorsque la tâche racine est suspendue, toutes les futures exécutions planifiées de la tâche racine sont annulées ; cependant, si des tâches sont en cours d’exécution (c’est-à-dire les tâches dans un état EXECUTING ), ces tâches et toutes les tâches descendantes continuent de s’exécuter.
Une fois les propriétés de la tâche dans l’arborescence modifiées et après la reprise de la tâche racine, ces modifications ne sont appliquées que lors de l’exécution planifiée suivante. À ce moment, une nouvelle version de l’arborescence des tâches est définie.
Note
Si la définition d’une procédure stockée appelée par une tâche change pendant l’exécution de l’arborescence des tâches, la nouvelle programmation peut être exécutée lorsque la procédure stockée est appelée par la tâche lors de l’exécution en cours.
Par exemple, supposons que le propriétaire de l’arborescence de tâches suivante, ou d’un autre rôle doté des privilèges appropriés, ait suspendu la tâche racine (tâche A), mais qu’une exécution planifiée de la tâche ait déjà démarré. Le propriétaire de l’arborescence modifie l’instruction SQL appelée par la tâche B (la tâche enfant) pendant que la tâche racine est toujours en cours d’exécution. Une version de l’arborescence entière est définie lorsque la tâche racine démarre son exécution actuelle. La tâche B exécute l’instruction SQL (ou appelle la procédure stockée) dans sa définition dans la version de l’arborescence des tâches lorsque l’exécution de la tâche racine a commencé.
Lors de la reprise de la tâche racine, une nouvelle version de l’arborescence des tâches est définie lorsque la tâche racine démarre sa prochaine exécution. Cette nouvelle version inclut la modification de la tâche B.
Définition des paramètres de session pour les tâches¶
Vous pouvez définir les paramètres de session pour la session dans laquelle une tâche est exécutée. Pour ce faire, modifiez une tâche existante et définissez les valeurs de paramètres souhaitées (à l’aide de ALTER TASK … SET paramètre_session = valeur[, paramètre_session = valeur ... ]
).
Une tâche prend en charge tous les paramètres de session. Pour obtenir la liste complète, voir Paramètres.
Notez qu’une tâche ne prend pas en charge les paramètres de compte ou d’utilisateur.
Affichage de l’historique des tâches de votre compte¶
Les rôles suivants (ou les rôles avec les privilèges spécifiés) peuvent utiliser SQL pour afficher l’historique des tâches dans une plage de dates spécifiée :
Administrateur de compte (c’est-à-dire les utilisateurs ayant le rôle ACCOUNTADMIN).
Propriétaire de la tâche (c.-à-d. rôle disposant du privilège OWNERSHIP sur une tâche).
Tout rôle disposant du privilège global MONITOR EXECUTION.
Pour afficher l’historique des tâches :
- SQL
Interrogez la fonction de table TASK_HISTORY (dans Schéma d’information).
Compréhension du service système¶
Snowflake exécute des tâches avec les privilèges du propriétaire (c’est-à-dire le rôle disposant du privilège OWNERSHIP sur la tâche), mais les tâches exécutées ne sont pas associées à un utilisateur. Au lieu de cela, chaque exécution est effectuée par un service système. Les tâches sont découplées d’utilisateurs spécifiques pour éviter les complications pouvant survenir lorsque des utilisateurs sont détruits, verrouillés en raison de problèmes d’authentification, ou lorsque des rôles sont supprimés.
Étant donné que les tâches exécutées sont découplées d’un utilisateur, l’historique des requêtes associées à ces tâches est associé au service système. SYSTEM n’est pas un utilisateur du compte ; c’est un service qui fonctionne en arrière-plan. En tant que tel, il n’existe aucune information d’identification d’utilisateur pour ce service, et aucune personne (de Snowflake ou de votre compte) 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.
Tâche DDL¶
Pour faciliter la création et la gestion des tâches, Snowflake fournit l’ensemble suivant de commandes spéciales DDL :
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 :
Fonctions de tâche¶
Pour prendre en charge la récupération d’informations sur les tâches, Snowflake fournit l’ensemble de fonctions SQL suivant :
Sécurité des tâches¶
Privilèges de contrôle d’accès¶
Création de tâches¶
La création, la gestion et l’exécution de tâches nécessitent un rôle avec au minimum les privilèges suivants :
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. |
Base de données |
USAGE |
|
Schéma |
USAGE, CREATE TASK |
|
Entrepôt virtuel |
USAGE |
En outre, le rôle doit disposer des autorisations requises pour exécuter l’instruction SQL exécutée par la tâche.
Possession de tâches¶
Après la création d’une tâche, le propriétaire de la tâche (c’est-à-dire le rôle qui a le privilège OWNERSHIP sur la tâche) doit avoir les privilèges suivants :
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. |
Base de données |
USAGE |
|
Schéma |
USAGE |
|
Tâche |
OWNERSHIP |
|
Entrepôt virtuel |
USAGE |
En outre, le rôle doit disposer des autorisations requises pour exécuter l’instruction SQL exécutée par la tâche.
Reprise ou suspension des 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 Possession de tâches (dans cette rubrique).
Création d’un rôle d’administrateur de tâche¶
Pour faciliter l’utilisation, nous vous recommandons de créer un rôle personnalisé (par exemple, TASKADMIN) et d’attribuer le privilège EXECUTE TASK à ce rôle. Tout rôle pouvant octroyer des privilèges (par exemple, SECURITYADMIN ou n’importe quel rôle disposant du privilège MANAGE GRANTS) peut ensuite attribuer ce rôle personnalisé à tout rôle de propriétaire de tâche afin de permettre la modification de ses propres tâches. Pour supprimer la possibilité pour le rôle de propriétaire de la tâche d’exécuter la tâche, il suffit de révoquer ce rôle personnalisé à partir du rôle de propriétaire de la tâche. Notez que si vous choisissez de ne pas créer ce rôle personnalisé, un administrateur de compte doit révoquer le privilège EXECUTE TASK 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;
-- set the active role to ACCOUNTADMIN before granting the EXECUTE TASK privilege to the new role
USE ROLE accountadmin;
GRANT EXECUTE TASK ON ACCOUNT TO ROLE taskadmin;
-- set the active role to SECURITYADMIN to show that this role can grant a role to another role
USE ROLE securityadmin;
GRANT ROLE taskadmin TO ROLE myrole;
Pour plus d’informations sur la création de rôles personnalisés et de hiérarchies de rôles, voir Configuration du contrôle d’accès.
Destruction d’un rôle de propriétaire de tâche¶
Lorsque le rôle de propriétaire d’une tâche donnée (c’est-à-dire le rôle doté du privilège OWNERSHIP sur la tâche) est supprimé, la tâche est « re-possédée » par le rôle qui a détruit le rôle du propriétaire. Cela garantit que la propriété passe à un rôle plus proche de la racine de la hiérarchie des rôles. Lorsqu’une tâche est ré-possédée, elle est automatiquement suspendue, c’est-à-dire que toutes les exécutions en cours de traitement sont en cours d’achèvement, mais les nouvelles exécutions ne seront pas programmées jusqu’à ce que la tâche soit reprise explicitement par le nouveau propriétaire. La raison est d’empêcher un utilisateur ayant accès à un rôle particulier de laisser des tâches qui s’exécutent soudainement avec des autorisations plus élevées lorsque le rôle est supprimé.
Si le rôle sous lequel une tâche est en cours d’exécution est détruit, alors que la tâche est toujours en cours d’exécution, la tâche termine le traitement sous le rôle détruit.
Workflow¶
Cette section fournit une vue d’ensemble de haut niveau sur le workflow de configuration des tâches.
Suivez les étapes décrites dans Création d’un rôle d’administrateur de tâche (dans cette rubrique) pour créer un rôle pouvant être utilisé pour exécuter les commandes au cours des étapes suivantes.
Créez une tâche en utilisant CREATE TASK. La tâche est suspendue par défaut.
Note
Vérifiez que l’instruction SQL à laquelle vous faites référence dans une tâche s’exécute comme prévu avant de créer la tâche. Les tâches sont destinées à automatiser les instructions SQL ou les procédures stockées qui ont déjà été testées de manière approfondie.
Exécutez ALTER TASK … RESUME pour permettre à la tâche de s’exécuter en fonction des paramètres spécifiés dans la définition de la tâche.