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.

Example task batch window

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.

Example tree of tasks batch window

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.

Tree of tasks

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).

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 TASKSET 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 d’accès requis

La création, la gestion et l’exécution de tâches nécessitent un rôle avec au minimum les autorisations de rôle suivantes :

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.

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.

  1. 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.

  2. 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.

  3. 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.