Snowpark Container Services: como trabalhar com trabalhos

Importante

O recurso de trabalho do Snowpark Container Services está atualmente em versão preliminar privada e sujeito aos Termos de versão preliminar em https://snowflake.com/legal. Entre em contato com seu representante Snowflake para obter mais informações.

O Snowpark Container Services permite implantar, gerenciar e dimensionar facilmente seu aplicativo em contêiner como um serviço ou trabalho. Este tópico explica como trabalhar com trabalhos. Um trabalho tem uma vida útil finita, semelhante a um procedimento armazenado. Quando todos os contêineres de aplicativos do trabalho forem encerrados, o trabalho será considerado concluído.

Execução de trabalhos

Para ajudar você a implantar seu aplicativo como um trabalho, o Snowpark Container Services fornece o comando EXECUTE SERVICE. O trabalho é executado de forma síncrona; ele é concluído após a saída de todos os seus contêineres. Você precisa fornecer as seguintes informações:

  • Uma especificação de trabalho: esta especificação fornece ao Snowflake as informações necessárias para executar seu trabalho. A especificação é um arquivo YAML que você carrega no estágio Snowflake.

  • Um pool de computação: o Snowflake executa seu trabalho no pool de computação especificado.

Exemplo

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

A saída inclui o ID do trabalho de consulta (um UUID atribuído pelo Snowflake):

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

Você usa este ID do trabalho de consulta com SYSTEM$GET_JOB_STATUS para obter o status do trabalho e com SYSTEM$GET_JOB_LOGS para obter registros dos contêineres de trabalho.

Usar o comando EXECUTE SERVICE é semelhante a executar qualquer outra instrução SQL. Você pode usar a interface da web do Snowsight ou SQL para obter uma lista de trabalhos do histórico de consultas.

Como obter o UUID do trabalho

Para depurar a execução do seu trabalho, você pode usar as funções do sistema fornecidas pelo Snowflake. Por exemplo, você pode monitorar um trabalho usando SYSTEM$GET_JOB_STATUS e acessar o log do contêiner de trabalho usando SYSTEM$GET_JOB_LOGS. Ambas as funções do sistema exigem o UUID do trabalho (ID de consulta do trabalho), que pode ser obtido da seguinte forma:

  • Após a conclusão do trabalho: para trabalhos curtos, EXECUTE SERVICE é concluído rapidamente e você obtém o UUID do trabalho na saída. Você também pode chamar LAST_QUERY_ID imediatamente após EXECUTE SERVICE para capturar o UUID do trabalho.

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

    Observe que LAST_QUERY_ID pode fornecer um UUID do trabalho somente após a conclusão do trabalho, tornando-o adequado principalmente para trabalhos curtos.

  • Durante a execução do trabalho: para trabalhos de longa duração, se você estiver interessado em informações de status do trabalho em tempo real enquanto o trabalho ainda estiver em execução, poderá obter o UUID do trabalho da seguinte forma:

    • Na interface da web do Snowsight: quando você chama EXECUTE SERVICE, a interface da web do Snowsight retorna o UUID do trabalho na janela Resultados imediatamente, enquanto o trabalho ainda está em execução.

    • Com SnowSQL CLI:

      1. Abra uma nova janela de terminal executando uma nova instância SnowSQL CLI.

      2. Use a família QUERY HISTORY de funções de tabela para obter o ID de consulta do trabalho. Na sua nova sessão, chame QUERY_HISTORY_BY_USER para obter o ID da consulta do trabalho em execução:

        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

Cancelamento de um trabalho

Você pode usar as funções do sistema SYSTEM$CANCEL_JOB para cancelar um trabalho em execução. Se você chamar SYSTEM$CANCEL_QUERY para cancelar uma consulta que acionou um trabalho, tanto a consulta quanto o trabalho serão cancelados.

Quando um trabalho é cancelado, todos os contêineres de trabalho param de funcionar e saem.

Monitoramento de um trabalho

Você pode usar a família QUERY_HISTORY de funções de tabela para consultar o histórico de consultas do Snowflake. Por exemplo, use QUERY_HISTORY_BY_USER para encontrar trabalhos em execução. Na consulta, especifique EXECUTE_SERVICE como o tipo de consulta.

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

Use SYSTEM$GET_JOB_STATUS para obter o status detalhado do tempo de execução de um trabalho. O status do trabalho pode indicar se o trabalho ainda está em execução ou falhou ao iniciar ou o motivo, caso ele tenha falhado. Como um trabalho não tem nome, use o ID do trabalho de consulta atribuído ao Snowflake (UUID do trabalho) ao chamar esta função do sistema.

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

O exemplo de saída a seguir é para um trabalho com um contêiner.

  • Esta saída mostra que o trabalho foi bem-sucedido:

    [
       {
             "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
  • Este fragmento de saída mostra que o trabalho falhou:

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

Você também pode usar SYSTEM$GET_JOB_LOGS para acessar logs de contêiner. Se o seu código gerar logs úteis para saída padrão ou erro padrão, o log poderá ajudá-lo a identificar problemas.

O instanceId sempre será 0. Você pode executar diversas instâncias de um serviço, mas apenas uma instância de trabalho pode estar em execução por vez.

SYSTEM$GET_JOB_STATUS usa um parâmetro timeout_secs opcional.

  • Se timeout_secs não for especificado ou for especificado com valor 0, a função retornará imediatamente o status atual.

  • Se timeout_secs for especificado, o Snowflake aguardará até que o trabalho atinja um estado terminal (DONE ou FAILED) dentro do tempo especificado antes de retornar o status do trabalho. Se o trabalho não atingir o estado terminal dentro do tempo especificado, o Snowflake retornará o estado atual no fim do intervalo de tempo especificado.

Exemplo

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

Seu trabalho pode ser executado em vários contêineres (conforme definido no arquivo de especificação do trabalho). Da mesma forma, o resultado get_job_status inclui uma lista de objetos e fornece o status de cada contêiner.

Acesso aos logs de contêiner

Snowflake coleta qualquer que seja o seu código em um contêiner que gera saída padrão ou erro padrão. Você deve garantir que seu código produza informações úteis para depurar um trabalho.

O Snowflake oferece duas maneiras de acessar esses logs de contêiner:

  • Usando a função do sistema SYSTEM$GET_JOB_LOGS: esta função dá acesso aos logs de um contêiner específico. Após a saída de um contêiner, você poderá continuar acessando os logs usando a função do sistema por um curto período. As funções do sistema são mais úteis durante o desenvolvimento e teste iniciais. Para obter mais informações, consulte Como usar SYSTEM$GET_JOB_LOGS

  • Usando uma tabela de eventos: uma tabela de eventos dá acesso a logs de vários contêineres em todos os serviços. Snowflake persiste os logs na tabela de eventos para acesso posterior. As tabelas de eventos são melhor utilizadas para a análise retrospectiva de serviços e trabalhos. Para obter mais informações, consulte Como usar uma tabela de eventos.

Como usar SYSTEM$GET_JOB_LOGS

Forneça o ID do trabalho, o nome do contêiner e, opcionalmente, o número de linhas de log mais recentes a serem recuperadas. Por exemplo, a seguinte função SYSTEM$GET_JOB_LOGS, para o ID do trabalho específico, recupera as 10 linhas de registro mais recentes de um contêiner chamado main:

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

Exemplo de saídas:

  • Exemplo de log de contêiner de um trabalho bem-sucedido:

    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
    
  • Exemplo de log de contêiner de um trabalho com falha:

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

    Isso indica que um argumento obrigatório não foi fornecido.

Se você não souber o nome do contêiner, primeiro execute GET_JOB_STATUS para obter informações sobre a execução de contêineres.

A saída SYSTEM$GET_JOB_LOGS tem as seguintes limitações:

  • Ele mescla saída padrão e fluxos de erro padrão, o que torna impossível distinguir entre saída normal e mensagens de erro.

  • Ele relata os dados capturados para um contêiner de trabalho específico.

  • Ele relata apenas logs de um contêiner em execução.

  • A função retorna até 100 KB de dados.

Como usar uma tabela de eventos

O Snowflake pode capturar e registrar resultados padrão e erros padrão de seus contêineres na tabela de eventos configurada para sua conta. Para obter mais informações, consulte Visão geral do registro e do rastreamento. Por exemplo, a consulta SELECT a seguir recupera eventos de trabalho e serviço do Snowpark Container Services registrados na última hora:

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 recomenda incluir um carimbo de data/hora na cláusula WHERE das consultas da tabela de eventos, conforme mostrado neste exemplo. Isso é especialmente importante devido ao volume potencial de dados gerados por vários componentes do Snowflake. Ao aplicar filtros, você pode recuperar um subconjunto menor de dados, o que melhora o desempenho da consulta.

As colunas da tabela de eventos oferecem informações úteis sobre os logs coletados pelo Snowflake do seu contêiner:

  • TIMESTAMP: esta coluna mostra quando o Snowflake coletou o log.

  • RESOURCE_ATTRIBUTES: esta coluna especifica qual trabalho do Snowflake e qual contêiner de trabalho gerou o log. Ele fornece detalhes como o UUID do trabalho, o nome do contêiner e o nome do pool de computação.

    {
       "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: para um trabalho, esta coluna identifica uma origem de erro (saída padrão ou erro padrão). Por exemplo:

    {
      "log.iostream": "stdout"
    }
    
    Copy
  • VALUE: nesta coluna, a saída padrão e os erros padrão são divididos em linhas, e cada linha gera um registro na tabela de eventos.

Configuração de uma tabela de eventos

Para obter mais informações, consulte Visão geral do registro e do rastreamento.

Privilégios

O usuário que criou um trabalho pode monitorar e obter o status do tempo de execução do trabalho. Os trabalhos não oferecem suporte à concessão de privilégios a outros usuários ou funções.