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';
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();
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:
Abra uma nova janela de terminal executando uma nova instância SnowSQL CLI.
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);
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
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');
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":"" } ]
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", ... } ]
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);
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);
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;
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" }
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" }
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.