Snowpark Container Services : utilisation des tâches

Important

La fonction de tâches Snowpark Container Services est actuellement disponible en avant-première privée et est soumise aux conditions d’utilisation de l’avant-première disponibles à https://snowflake.com/legal. Contactez votre représentant Snowflake pour plus d’informations.

Snowpark Container Services vous permet de déployer, de gérer et d’adapter facilement votre application conteneurisée en tant que service ou tâche. Cette rubrique explique comment utiliser des tâches. Une tâche a une durée de vie limitée, comme une procédure stockée. Lorsque tous les conteneurs d’application de tâche sont sortis, le travail est considéré comme terminé.

Exécution des tâches

Pour vous aider à déployer votre application en tant que tâche, Snowpark Container Services fournit la commande EXECUTE SERVICE. La tâche s’exécute de manière synchrone ; elle s’achève après que tous ses conteneurs se sont éteints. Vous devez fournir les informations suivantes :

  • Une spécification de tâche : cette spécification fournit à Snowflake les informations nécessaires à l’exécution de votre tâche. La spécification est un fichier YAML que vous chargez sur votre zone de préparation Snowflake.

  • Un pool de calcul : Snowflake exécute votre tâche dans le pool de calcul spécifié.

Exemple

EXECUTE SERVICE
  IN COMPUTE POOL tutorial_compute_pool
  FROM @tutorial_stage
  SPECIFICATION_FILE='my_job_spec.yaml';
Copy

La sortie comprend l’ID de requête de la tâche (UUID attribué par Snowflake) :

+------------------------------------------------------------------------------------+
|                      status                                                        |
-------------------------------------------------------------------------------------+
| Job 01af7ee6-0001-cb52-0020-c5870077223a completed successfully with status: DONE. |
+------------------------------------------------------------------------------------+

Vous utilisez cet ID de tâche de requête avec SYSTEM$GET_JOB_STATUS pour obtenir le statut de la tâche, et avec SYSTEM$GET_JOB_LOGS pour obtenir les journaux des conteneurs de la tâche.

L’utilisation de la commande EXECUTE SERVICE est similaire à l’exécution de toute autre instruction SQL. Vous pouvez utiliser l’interface Web de Snowsight ou SQL pour obtenir une liste de tâches à partir de l’historique des requêtes.

Obtention de l’UUID d’une tâche

Pour déboguer l’exécution de votre tâche, vous pouvez utiliser les fonctions système fournies par Snowflake. Par exemple, vous pouvez surveiller une tâche en utilisant SYSTEM$GET_JOB_STATUS et accéder au journal du conteneur de tâche en utilisant SYSTEM$GET_JOB_LOGS. Ces deux fonctions du système nécessitent l’UUID de la tâche (ID de la requête de la tâche), que vous pouvez obtenir comme suit :

  • Après la fin de la tâche : pour les tâches de courte durée, EXECUTE SERVICE est terminé rapidement et vous obtenez l’UUID de la tâche en sortie. Vous pouvez également appeler LAST_QUERY_ID immédiatement après EXECUTE SERVICE pour capturer l’UUID de la tâche.

    EXECUTE SERVICE
    IN COMPUTE POOL tutorial_compute_pool
    FROM @tutorial_stage
    SPECIFICATION_FILE='my_job_spec.yaml';
    
    SET job_id = LAST_QUERY_ID();
    
    Copy

    Il est à noter que LAST_QUERY_ID ne peut fournir un UUID de tâche qu’une fois celui-ci terminé, ce qui le rend principalement adapté aux tâches de courte durée.

  • Pendant l’exécution de la tâche : pour les tâches de longue durée, si vous souhaitez obtenir des informations en temps réel sur le statut de la tâche pendant qu’elle est encore en cours d’exécution, vous pouvez obtenir l’UUID de la tâche de la manière suivante :

    • Dans l’interface Web de Snowsight : lorsque vous appelez EXECUTE SERVICE, l’interface Web de Snowsight renvoie immédiatement l’UUID de la tâche dans la fenêtre Résultats, alors que la tâche est toujours en cours d’exécution.

    • Avec la CLI SnowSQL :

      1. Ouvrez une nouvelle fenêtre de terminal et lancez une nouvelle instance de la CLI SnowSQL.

      2. Utilisez la famille QUERY HISTORY de fonctions de table pour obtenir l’ID de requête de la tâche. Dans votre nouvelle session, appelez QUERY_HISTORY_BY_USER pour obtenir l’ID de requête de la tâche en cours :

        SET job_id = (SELECT QUERY_ID FROM TABLE(information_schema. query_history_by_user())
          WHERE QUERY_TYPE='EXECUTE_SERVICE'
          ORDER BY start_time DESC
          LIMIT 1);
        
        Copy

Annulation d’une tâche

Vous pouvez utiliser les fonctions système SYSTEM$CANCEL_JOB pour annuler une tâche en cours. Si vous appelez SYSTEM$CANCEL_QUERY pour annuler une requête qui a déclenché une tâche, la requête et la tâche sont toutes deux annulées.

Lorsqu’une tâche est annulée, tous les conteneurs de la tâche cessent de fonctionner et quittent le système.

Suivi d’une tâche

Vous pouvez utiliser la famille de fonctions de table QUERY_HISTORY pour interroger l’historique des requêtes de Snowflake. Par exemple, utilisez QUERY_HISTORY_BY_USER pour trouver les tâches en cours. Dans la requête, indiquez EXECUTE_SERVICE comme type de requête.

SELECT QUERY_ID FROM TABLE(information_schema. query_history_by_user())
  WHERE QUERY_TYPE='EXECUTE_SERVICE'
    AND EXECUTION_STATUS='RUNNING'
  ORDER BY start_time DESC
Copy

Utilisez SYSTEM$GET_JOB_STATUS pour obtenir le statut détaillé de l’exécution d’une tâche. Le statut d’une tâche peut indiquer si la tâche est toujours en cours d’exécution ou si elle n’a pas démarré, et si elle a échoué, pourquoi. Étant donné qu’une tâche n’a pas de nom, utilisez l’ID de tâche de requête attribué par Snowflake (UUID de la tâche) lorsque vous appelez cette fonction système.

CALL SYSTEM$GET_JOB_STATUS('01ab9c76-0000-3c97-0000-0e9900000000');
Copy

L’exemple suivant de sortie concerne une tâche avec un seul conteneur.

  • Cette sortie indique que la tâche a été effectuée avec succès :

    [
       {
             "status":"DONE",
             "message":"Completed successfully",
             "containerName":"main",
             "instanceId":"0",
             "serviceName":"01af7ee6-0001-cb52-0020-c5870077223a",
             "image":"orgname-acctname.registry.snowflakecomputing.com/tutorial_db/data_schema/tutorial_repository/my_job_image:tutorial",
             "restartCount":0,
             "startTime":""
       }
    ]
    
    Copy
  • Ce fragment de sortie montre que la tâche a échoué :

    [
       {
          "status":"FAILED",
          "message":"Encountered fatal error while running, check container logs",
          "containerName":"main",
          "instanceId":"0",
          ...
       }
    ]
    
    Copy

Vous pouvez également utiliser SYSTEM$GET_JOB_LOGS pour accéder aux journaux du conteneur. Si votre code produit des journaux utiles sur la sortie standard ou l’erreur standard, le journal peut vous aider à identifier les problèmes.

Le instanceId sera toujours 0. Vous pouvez exécuter plusieurs instances d’un service, mais une seule instance de tâche peut être en cours d’exécution à la fois.

SYSTEM$GET_JOB_STATUS prend un paramètre facultatif timeout_secs.

  • Si timeout_secs n’est pas spécifié ou est spécifié avec la valeur 0, la fonction renvoie immédiatement le statut actuel.

  • Si timeout_secs est spécifié, Snowflake attend que la tâche atteigne un état final (DONE ou FAILED) dans le délai spécifié avant de renvoyer le statut de la tâche. Si la tâche n’atteint pas l’état final dans le délai spécifié, Snowflake retourne à l’état actuel à la fin de l’intervalle de temps spécifié.

Exemple

CALL SYSTEM$GET_JOB_STATUS('01ab9c76-0000-3c97-0000-0e9900000000', 10);
Copy

Votre tâche peut être exécutée dans plusieurs conteneurs (définis dans le fichier de spécification de la tâche). En conséquence, le résultat get_job_status comprend une liste d’objets et fournit le statut de chaque conteneur.

Accès aux journaux des conteneurs

Snowflake collecte tout ce que votre code dans un conteneur envoie à la sortie standard ou à l’erreur standard. Vous devez vous assurer que votre code fournit des informations utiles pour déboguer une tâche.

Snowflake propose deux façons d’accéder à ces journaux de conteneurs :

  • Utilisation de la fonction système SYSTEM$GET_JOB_LOGS : cette fonction permet d’accéder aux journaux d’un conteneur spécifique. Après la sortie d’un conteneur, vous pouvez continuer à accéder aux journaux à l’aide de la fonction système pendant une courte période. Les fonctions du système sont les plus utiles lors du développement initial et des tests. Pour plus d’informations, consultez Utilisation de SYSTEM$GET_JOB_LOGS

  • Utilisation d’une table d’événements : une table d’événements vous permet d’accéder aux journaux de plusieurs conteneurs dans tous les services. Snowflake conserve les journaux dans la table d’événements pour un accès ultérieur. Les tables d’événements sont utilisées de préférence pour l’analyse rétrospective des services et des tâches. Pour plus d’informations, voir Utilisation d’une table d’événements.

Utilisation de SYSTEM$GET_JOB_LOGS

Vous indiquez l’ID de la tâche, le nom du conteneur et, éventuellement, le nombre de lignes de journal les plus récentes à récupérer. Par exemple, la fonction SYSTEM$GET_JOB_LOGS suivante, pour l’ID de la tâche donnée, récupère les 10 lignes de journal les plus récentes d’un conteneur nommé main :

CALL SYSTEM$GET_JOB_LOGS('01ab9c76-0000-3c97-0000-0e990009102e', 'main', 10);
Copy

Exemple de sorties :

  • Exemple de journal de conteneur d’une tâche réussie :

    job-tutorial - INFO - Connection succeeded. Current session context: database="TUTORIAL_DB", schema="DATA_SCHEMA", warehouse="TUTORIAL_WAREHOUSE", role="TEST_ROLE"
    job-tutorial - INFO - Executing query [select current_time() as time,'hello'] and writing result to table [results]
    job-tutorial - INFO - Job finished
    
  • Exemple de journal de conteneur d’une tâche qui a échoué :

    job-tutorial - INFO - Job started
    usage: main.py [-h] --query QUERY --result_table RESULT_TABLE
    main.py: error: the following arguments are required: --query
    

    Cela indique qu’un argument requis n’a pas été fourni.

Si vous ne connaissez pas le nom du conteneur, vous pouvez d’abord lancer GET_JOB_STATUS pour obtenir des informations sur les conteneurs en cours d’exécution.

La sortie SYSTEM$GET_JOB_LOGS a les limitations suivantes :

  • Elle fusionne les flux de sortie et d’erreur standard, ce qui rend impossible la distinction entre la sortie normale et les messages d’erreur.

  • Elle rapporte les données capturées pour un conteneur de tâche spécifique.

  • Elle ne signale que les journaux d’un conteneur en cours d’exécution.

  • La fonction renvoie jusqu’à 100 KB de données.

Utilisation d’une table d’événements

Snowflake peut capturer et enregistrer la sortie standard et les erreurs standard de vos conteneurs dans la table d’événements configurée pour votre compte. Pour plus d’informations, voir Vue d’ensemble de la journalisation et du traçage. Par exemple, la requête SELECT suivante récupère les événements de services et de tâches de Snowpark Container Services enregistrés au cours de la dernière heure :

SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD_ATTRIBUTES, VALUE
  FROM <current-event-table-for-your-account>
  WHERE timestamp > dateadd(hour, -1, current_timestamp())
    AND RESOURCE_ATTRIBUTES:"snow.executable.type" = 'SnowparkContainers'
  ORDER BY timestamp DESC
  LIMIT 10;
Copy

Snowflake recommande d’inclure un horodatage dans la clause WHERE des requêtes de tables d’événements, comme le montre cet exemple. Ceci est particulièrement important en raison du volume potentiel de données générées par les différents composants de Snowflake. En appliquant des filtres, vous pouvez extraire un sous-ensemble de données plus restreint, ce qui améliore les performances de la requête.

Les colonnes de la table d’événements offrent des informations utiles concernant les journaux collectés par Snowflake depuis votre conteneur :

  • TIMESTAMP : cette colonne indique quand Snowflake a collecté le journal.

  • RESOURCE_ATTRIBUTES : cette colonne indique la tâche Snowflake et le conteneur de tâche qui ont généré le journal. Elle fournit des détails tels que l’UUID de la tâche, le nom du conteneur et le nom du pool de calcul.

    {
       "snow.containers.compute_pool.id":549816068,
       "snow.containers.compute_pool.name":"TUTORIAL_COMPUTE_POOL",
       "snow.containers.container.name":"main",
       "snow.containers.instance.name":"0",
       "snow.containers.restart.id":"a78230",
       "snow.database.id":549816076,
       "snow.database.name":"TUTORIAL_DB",
       "snow.executable.id":980991975,
       "snow.executable.name":"01af8425-0001-cb01-0020-c58700758ca6",
       "snow.executable.type":"SnowparkContainers",
       "snow.schema.id":549816076,
       "snow.schema.name":"DATA_SCHEMA"
    }
    
    Copy
  • RECORD_ATTRIBUTES : pour une tâche, cette colonne identifie une source d’erreur (sortie standard ou erreur standard). Par exemple :

    {
      "log.iostream": "stdout"
    }
    
    Copy
  • VALUE : dans cette colonne, la sortie standard et les erreurs standard sont divisées en lignes, et chaque ligne génère un enregistrement dans la table d’événements.

Configuration d’une table d’événements

Pour plus d’informations, consultez Vue d’ensemble de la journalisation et du traçage.

Privilèges

L’utilisateur qui a créé une tâche peut contrôler et obtenir le statut d’exécution de la tâche. Les tâches ne permettent pas d’accorder des privilèges à d’autres utilisateurs ou rôles.