Gerenciamento de dependências de tarefa com gráficos de tarefa

Com gráficos de tarefa, você pode executar sequências de tarefas automaticamente. Um gráfico de tarefa ou gráfico acíclico dirigido (DAG) é uma série de tarefas composta de uma tarefa raiz e tarefas filho, organizadas por suas dependências. Os gráficos de tarefa fluem em uma única direção, o que significa que uma tarefa mais adiante na série não pode solicitar a execução de uma tarefa anterior. Cada tarefa pode depender de várias outras tarefas e não será executada até que todas sejam concluídas. Cada tarefa também pode ter diversas tarefas filho que dependam dela.

Tarefas em um gráfico de tarefas também podem usar os valores de retorno de tarefas pai para executar operações baseadas em lógica em seu corpo de função SQL.

Crie um gráfico de tarefa

Para criar um gráfico de tarefa, especifique as tarefas pai ao criar ou alterar uma tarefa. A tarefa raiz de seu gráfico é a tarefa sem tarefas pai. A tarefa raiz deve ter um cronograma definido que inicie uma execução do gráfico da tarefa. Cada tarefa filho deve ter pelo menos uma tarefa pai definida para vincular as tarefas no gráfico de tarefa.

Use os comandos CREATE TASK … AFTER ou ALTER TASK … ADD AFTER para adicionar tarefas filho. Também é possível gerenciar suas tarefas e gráficos de tarefa Snowflake com Python. Para obter mais informações, consulte Gerenciamento de tarefas e gráficos de tarefas do Snowflake com Python.

Considerações sobre o gráfico de tarefa
  • O gráfico de tarefa é limitado a um máximo de 1.000 tarefas.

  • Uma única tarefa pode ter um máximo de 100 tarefas pai e 100 tarefas filho.

  • O computador que executa o gráfico de tarefa deve ser dimensionado para lidar com execuções de tarefas simultâneas. Para obter mais informações, consulte, Recursos de computação.

No exemplo a seguir, a tarefa raiz solicita a execução simultânea das tarefas B e C. A tarefa D é executada quando ambas as tarefas B e C são completadas.

Um gráfico de tarefa em formato de diamante com a tarefa A à esquerda, rotulada como tarefa raiz, apontando para as tarefas B e C no meio. As tarefas B e C apontam para a tarefa D à direita.

O exemplo a seguir mostra como você pode usar um gráfico de tarefa para atualizar tabelas de dimensões em um banco de dados de vendas antes de agregar dados factuais:

Um gráfico de tarefa em forma de diamante com uma tarefa no centro. A tarefa raiz à esquerda aponta para as tarefas Atualizar tabela de cliente, Atualizar tabela de produto e Atualizar tabela de dados e tempo. Essas três tarefas apontam para a tarefa Tabela de vendas agregadas à direita.

Este exemplo mostra a tarefa final em um gráfico de tarefa chamando uma função externa para solicitar um serviço de mensagens remotas para enviar uma notificação de que todas as tarefas anteriores foram executadas com sucesso até a conclusão.

Um gráfico de tarefa com tarefas intermediárias ignoradas usando reticências. A tarefa raiz à esquerda aponta para as reticências que apontam para a tarefa final Enviar notificação via função externa à direita.

Gerenciamento da propriedade do gráfico de tarefa

Todas as tarefas em um gráfico de tarefa devem ter o mesmo proprietário e ser armazenadas no mesmo banco de dados e esquema.

Você pode transferir a propriedade de todas as tarefas em um gráfico de tarefa usando uma das seguintes ações:

  • Descarte o proprietário de todas as tarefas no gráfico de tarefa usando DROP ROLE. O Snowflake transfere a propriedade para a função que executa o comando DROP ROLE.

  • Transfira a propriedade de todas as tarefas no gráfico de tarefa usando GRANT OWNERSHIP em todas as tarefas em um esquema.

Quando você transfere a propriedade de tarefa em um gráfico de tarefa usando esses métodos, as tarefas no gráfico de tarefa mantêm seus relacionamentos entre si.

Transferir a propriedade de uma única tarefa remove a dependência entre a tarefa e quaisquer tarefas pai e filho. Para obter mais informações, consulte Desvinculação de tarefas pai e filho (neste tópico).

Nota

A replicação de banco de dados não funciona para gráficos de tarefa se o gráfico for de propriedade de uma função diferente da que executa a replicação.

Execução de tarefas em um gráfico de tarefa

Uma execução de gráfico de tarefa é iniciada por uma execução de sua tarefa raiz definida. Uma execução bem-sucedida de uma tarefa raiz aciona uma execução em cascata de tarefas filho no gráfico de tarefa quando a tarefa anterior é concluída. As tarefas raiz podem ser executadas das seguintes maneiras:

  • Agendamento de tarefas – Geralmente os gráficos de tarefa são executados em um CRON ou cronograma baseado em intervalos.

  • ALTER TASK – Você pode usar ALTER TASK [ IF EXISTS ] <name> RESUME para executar um gráfico de tarefa com base em seu cronograma existente. Todas as tarefas devem ser retomadas quando criadas pela primeira vez.

  • EXECUTE TASK- Você pode usar EXECUTE TASK <name> para criar uma execução única de um gráfico de tarefa.

Execução manual de tarefas em um gráfico de tarefa

O comando EXECUTE TASK aciona manualmente uma única execução de uma tarefa, independentemente do cronograma definido para a tarefa. Uma execução bem-sucedida de uma tarefa raiz aciona uma execução em cascata de tarefas filhas no gráfico de tarefas quando a tarefa anterior é concluída, como se a tarefa raiz tivesse sido executada em seu cronograma definido.

Você também pode usar EXECUTE TASK <name> RETRY LAST para executar novamente qualquer tarefa filho em um gráfico de tarefa. RETRY LAST tenta executar o gráfico de tarefa a partir da última tarefa com falha. Se a tarefa for bem-sucedida, todas as tarefas filho continuarão sendo executadas conforme suas tarefas precedentes forem concluídas.

Este comando SQL é útil para testar gráficos de tarefa novos ou modificados antes de habilitá-los a executar o código SQL na produção.

Sobreposição de execuções de gráficos da tarefa

Por padrão, o Snowflake assegura que apenas uma instância de um determinado gráfico da tarefa seja autorizada a funcionar de cada vez. A próxima execução de uma tarefa raiz só é programada depois que todas as tarefas no gráfico da tarefa tiverem terminado. Isto significa que se o tempo acumulado necessário para executar todas as tarefas no gráfico da tarefa exceder o tempo explicitamente programado determinado na definição da tarefa raiz, pelo menos uma execução do gráfico de tarefas é ignorada. O comportamento é controlado pelo parâmetro ALLOW_OVERLAPPING_EXECUTION na tarefa raiz; o valor padrão é FALSE. A definição do valor do parâmetro como TRUE permite que execuções do gráfico da tarefa se sobreponham.

Além disso, uma tarefa filha começa sua execução somente depois que todas as tarefas predecessoras da tarefa filha tenham completado com sucesso suas próprias execuções. Uma tarefa que executa operações SQL demoradas atrasa o início de qualquer tarefa filha que identifique a tarefa como predecessora.

No exemplo a seguir, uma execução do gráfico da tarefa está programada para começar quando uma execução anterior ainda não foi concluída. O período de sobreposição, ou simultaneidade, é identificado em vermelho. O diagrama também identifica o intervalo de tempo em que cada tarefa é enfileirada antes de ser executada no warehouse administrado pelo usuário. Observe que se você usar recursos de computação sem servidor, não haverá período de fila:

Sobreposição de execuções de gráficos da tarefa

As execuções sobrepostas podem ser toleradas (ou mesmo desejáveis) quando operações SQL de leitura/escrita realizadas por execuções sobrepostas de um gráfico da tarefa não produzem dados incorretos ou duplicados. Entretanto, para outros gráficos da tarefa, os proprietários das tarefas (a função com o privilégio OWNERSHIP em todas as tarefas no gráfico da tarefa) devem definir um cronograma apropriado na tarefa raiz e escolher um tamanho de warehouse apropriado (ou usar recursos de computação sem servidor) para garantir que uma instância do gráfico da tarefa termine a conclusão antes que a tarefa raiz seja agendada.

Para alinhar melhor um gráfico da tarefa com o cronograma definido na tarefa raiz:

  1. Se possível, aumente o tempo de agendamento entre as execuções da tarefa raiz.

  2. Considere modificar tarefas de computação pesadas para usar recursos de computação sem servidor. Se a tarefa depender de recursos de computação gerenciados pelo usuário, aumente o tamanho do warehouse que executa instruções SQL grandes ou complexas ou procedimentos armazenados no gráfico da tarefa.

  3. Analise as instruções SQL ou procedimentos armazenados executados por cada tarefa. Determine se o código pode ser reescrito para aproveitar o processamento paralelo.

Se nenhuma das soluções acima ajudar, considere se é necessário permitir execuções simultâneas do gráfico da tarefa definindo ALLOW_OVERLAPPING_EXECUTION = TRUE na tarefa raiz. Este parâmetro pode ser definido ao criar uma tarefa (usando CREATE TASK) ou mais tarde (usando ALTER TASK ou no Snowsight).

Suspensão e retomada de tarefas em um gráfico de tarefa

Para suspender ou retomar uma tarefa em um gráfico de tarefa, use ALTER TASK … RESUME | SUSPEND ou o Snowsight.

Suspensão de uma tarefa raiz

Quando a tarefa raiz é suspensa, todas as futuras execuções agendadas da tarefa raiz são canceladas; entretanto, se alguma tarefa estiver em execução no momento, essas tarefas e quaisquer tarefas descendentes continuam sendo executadas.

Retomada e suspensão de tarefas filho

Para retomar ou suspender uma tarefa filho, é necessário suspender a tarefa raiz. Não é necessário retomar tarefas filho suspensas para retomar a tarefa raiz.

Retomada recursiva de tarefas

Para retomar recursivamente todas as tarefas em um gráfico de tarefa, consulte a função SYSTEM$TASK_DEPENDENTS_ENABLE.

Execuções do gráfico da tarefa com tarefas filhas suspensas

Quando um gráfico da tarefa é executado com uma ou mais tarefas filhas suspensas, a execução ignora essas tarefas. Uma tarefa filha com múltiplos predecessores é executada desde que pelo menos um dos predecessores esteja em um estado de retomada, e todos os predecessores retomados sejam executados com sucesso até a conclusão.

Controle de versão do gráfico de tarefa

Quando a tarefa raiz em um gráfico de tarefa é retomada ou executada manualmente, o Snowflake define uma versão de todo o gráfico de tarefa, incluindo todas as propriedades de todas as tarefas no gráfico de tarefa. Após uma tarefa ser suspensa e modificada, o Snowflake define uma nova versão quando a tarefa raiz é retomada ou executada manualmente.

Para modificar ou recriar qualquer tarefa em um gráfico de tarefa, a tarefa raiz deve primeiro ser suspensa. Quando a tarefa raiz é suspensa, todas as futuras execuções agendadas da tarefa raiz são canceladas; entretanto, se alguma tarefa estiver sendo executada, essas tarefas e quaisquer tarefas descendentes continuam a ser executadas usando a versão atual.

Nota

Se a definição de um procedimento armazenado chamado por uma tarefa mudar enquanto o gráfico da tarefa estiver sendo executado, a nova programação poderá ser executada quando o procedimento armazenado for chamado pela tarefa na execução atual.

Por exemplo, suponha que a tarefa raiz em um gráfico da tarefa esteja suspensa, mas uma execução programada desta tarefa já tenha começado. O proprietário de todas as tarefas no gráfico da tarefa modifica o código SQL chamado por uma tarefa filha enquanto a tarefa raiz ainda está em execução. A tarefa filha executa o código SQL em sua definição usando a versão do gráfico da tarefa que era atual quando a tarefa raiz iniciou sua execução. Quando a tarefa raiz é retomada ou é executada manualmente, uma nova versão do gráfico da tarefa é definida. Esta nova versão inclui as modificações da tarefa filha.

Para recuperar o histórico das versões de tarefas, consulte TASK_VERSIONS Exibição do Account Usage (no banco de dados SNOWFLAKE compartilhado).

Suspender automaticamente gráficos de tarefa após execuções de tarefas com falha

Opcionalmente, suspenda os gráficos de tarefa automaticamente após um número especificado de tarefas consecutivas que falham ou atingem o tempo limite.

Defina o parâmetro SUSPEND_TASK_AFTER_NUM_FAILURES = num na tarefa raiz em um gráfico de tarefa. Quando o parâmetro é definido como um valor maior que 0, a tarefa raiz é suspensa automaticamente depois que qualquer tarefa filho no gráfico de tarefa falhar consecutivamente ou atingir o tempo limite especificado. A tarefa filha que falha ou expira não é suspensa.

Repetição automática das execuções de gráficos de tarefa que falharam

Especifica o número de tentativas automáticas de repetição do gráfico de tarefas. Se algum gráfico de tarefas for concluído em um estado FAILED, o Snowflake poderá tentar novamente automaticamente os gráficos da tarefa da última tarefa no gráfico que falhou.

A nova tentativa automática do gráfico de tarefas está desabilitada por padrão. Para ativar esse recurso, defina TASK_AUTO_RETRY_ATTEMPTS como um valor maior que 0.

Visualização de tarefas dependentes em um gráfico de tarefa

Para visualizar as tarefas filho de uma tarefa raiz, consulte a função de tabela TASK_DEPENDENTS. Para recuperar todas as tarefas em um gráfico de tarefa, insira a tarefa raiz ao chamar a função.

Você também pode usar o Snowsight para gerenciar e visualizar seus gráficos de tarefa. Para obter mais informações, consulte Visualização de tarefas e gráficos de tarefa no Snowsight.

Liberação e limpeza de gráficos de tarefa

Uma tarefa finalizadora trata do lançamento e limpeza de recursos que um gráfico da tarefa usa. A tarefa finalizadora terá execução garantida se o gráfico de tarefa for executado e garantirá a limpeza adequada dos recursos e a conclusão das etapas necessárias em todos os cenários. Por exemplo, se uma execução de gráfico da tarefa usar tabelas intermediárias para rastrear dados para processamento e falhar antes que as linhas da tabela sejam consumidas, a próxima execução encontrará linhas duplicadas e reprocessará os dados, resultando em tempo de execução mais longo ou desperdício de recursos de computação. A tarefa finalizadora pode resolver esse problema descartando as linhas ou truncando a tabela conforme necessário.

A tarefa finalizadora funciona como qualquer outra tarefa em um gráfico da tarefa, com as seguintes diferenças:

  • Uma tarefa finalizadora está sempre associada a uma tarefa raiz. Cada tarefa raiz pode ter apenas uma tarefa finalizadora, e uma tarefa finalizadora só pode ser associada a uma tarefa raiz.

  • Uma tarefa finalizadora é agendada somente quando nenhuma outra tarefa está em execução ou na fila na execução do gráfico da tarefa atual e pelo menos uma tarefa no gráfico iniciou a execução. Se um gráfico for ignorado (por exemplo, a tarefa raiz for ignorada), a tarefa finalizadora não será executada. Se ALLOW_OVERLAPPING_EXECUTION for verdadeiro, a tarefa finalizadora se comportará como as outras tarefas e ainda será agendada mesmo se houver outras execuções do gráfico da tarefa em andamento.

  • Uma tarefa finalizadora não pode ter tarefas secundárias. Qualquer comando que tente transformar a tarefa finalizadora em uma predecessora falhará. A criação de uma tarefa finalizadora deve incluir a palavra-chave FINALIZE, que é incompatível com as palavras-chave SCHEDULE e AFTER.

Para criar uma tarefa finalizadora, crie uma tarefa usando a palavra-chave FINALIZE e defina um relacionamento com a tarefa raiz:

CREATE TASK <TASK_NAME> ...
... FINALIZE = <ROOT_TASK_NAME>
Copy

Para obter mais informações, consulte CREATE TASK.