Como trabalhar com Timeout em um Workflow no Cloud Dataproc


Nesta postagem, mostramos como podemos setar o parâmetro de timeout no fluxo de trabalho(workflow) do Cloud Dataproc, dentro do Google Cloud.

O que é Cloud Dataproc?

É a plataforma de big data totalmente gerenciado, para processar grandes quantidades de dados com rapidez, de forma econômica e em grande escala. Usando ferramentas de código aberto como o Apache Spark, o Apache Hive, o Apache Hadoop e o Apache Pig combinadas à escalabilidade dinâmica do Compute Engine e ao armazenamento escalável do Cloud Storage, o Dataproc oferece às equipes analíticas os mecanismos e a elasticidade para executar análises na escala de petabytes por uma fração do custo dos clusters locais tradicional, além de ser facilmente incorporado a outros serviços do Google Cloud Platform (GCP).

O que é um Job?

Dentro do Dataproc, o Job seria um código que é executado dentro de um cluster, atualmente são aceitos diversos tipos, entre eles os principais são:

· Hadoop;

· Spark;

· SparkR;

· PySpark;

· Hive;

· SparkSql;

· Pig;

· Presto.


O que é um Workflow?

O fluxo de trabalho do Dataproc é um conjunto de Jobs que podem ter ou não uma dependência/sequência entre si, de certa forma, é executada um grafo acíclico dirigido (DAG).

O uso de Workflow é recomendado para processos complexos que tenham dependências entre os Jobs.


O que é um Workflow Template?

O modelo de fluxo de trabalho permite utilizar os fluxos de trabalho de forma reutilizável.

É possível criar ou selecionar um cluster para execução, permite criação de parâmetros.

Possui quatro tipos:

· Cluster gerenciado:

Permite usar um cluster gerenciado para execução dos Jobs.

Com essa opção o Workflow vai criar esse cluster “efêmero” e após a conclusão do processo, exclui-lo

· Seletor do cluster:

Permite selecionar um cluster que já exista e ao final do processo ele não será excluído.

· Parametrizado:

Permite o uso parâmetros de execução, é recomendado caso o workflow execute várias vezes com valores diferentes.

· Inline:

Permite criar o cluster através de arquivos YAML.


Passo a Passo

1. O primeiro passo a fazer é o login em sua conta do GCP, para este tutorial você vai precisar de uma conta que possua um projeto.

2. Vá até a barra superior e clique no ícone do Cloud Shell, igual a imagem abaixo.

3. Agora temos que preparar as variáveis de ambiente que vamos usar nos outros passos:

a) Para definir a variável de região usaremos o código abaixo:

export REGION=us-central1

b) Para definir a variável de Zona usaremos o código abaixo:

export ZONE=us-central1-a

4. Nesse passo vamos definir o projeto a ser usado dentro do cloud shell, no campo [PROJECT_ID], insira o id do seu projeto:

gcloud config set project [PROJECT_ID]

5. Neste passo vamos definir a Zona a ser usada dentro do cloud shell com base na variável que definimos antes:

gcloud config set compute/zone $ZONE

6. Nesse passo vamos definir a Região a ser usada dentro do cloud shell com base na variável que definimos antes:

gcloud config set compute/region $REGION

7. Após isso vamos definir a variável PROJECT com o id do projeto:

export PROJECT=$(gcloud info --format='value(config.project)')

8. Com o código abaixo a api do dataproc será habilitada, caso já esteja pode desconsiderar:

gcloud services enable dataproc.googleapis.com sqladmin.googleapis.com

9. Caso não exista, crie um cluster do dataproc com o comando abaixo:

gcloud dataproc clusters create meu-cluster \
--image-version 1.3 \
--region $REGION \
--subnet default \
--master-machine-type n1-standard-1 \
--master-boot-disk-size 500 \
--num-workers 2 \
--worker-machine-type n1-standard-1 \
--worker-boot-disk-size 500 \
--project $PROJECT

Observações:

· A propriedade “subnet” faz referência a sub-rede que usamos no cluster.

· A propriedade “master-machine-type” permite selecionar o tipo de máquina a ser usado pelo master.

· A propriedade “worker-machine-type” permite selecionar o tipo de máquina a ser usado pelos workers.

· A propriedade “project” especifica em qual projeto será criado o cluster.

10. Neste passo vamos gerar um Workflow template, com o parametro "dag-timeout":

gcloud beta dataproc workflow-templates create meu_template \
--region $REGION \
--dag-timeout="10m"

Observação:

· Na propriedade “create” definimos um valor/nome do nosso template, o template_id no caso.

· Na propriedade “region” definimos a região em que nosso fluxo de trabalho está.

· Na propriedade “dag-timeout” definimos o tempo limite para cancelar o fluxo de trabalho se os jobs dentro dele não terminarem dentro do período especificado.

Esse tempo se aplica somente ao tempo de execução dos jobs, não é incluído o tempo de criação um cluster(quando o fluxo de trabalho cria o cluster).

Ao chegar o fim do tempo se tiver algum job em execução, ele será interrompido e o fluxo de trabalho será encerrado, no caso em que o fluxo de trabalho que criou o cluster, o mesmo será apagado.

Os valores aceitos são:"s" (duração de segundo), "m" (duração de minuto), "h" (duração de hora) e "d" (duração de dia).

Exemplos:

  • Segundo:

--dag-timeout="10s"

  • Minuto:

--dag-timeout="10m"

  • Hora:

--dag-timeout="10h"

  • Dia:

--dag-timeout="1d"

Importante: Existe uma limitação para tempo limite, o valor precisa estar entre 10 minutos ("10m") e 24 horas ("24h" ou "1d").

11. Neste passo vamos selecionar um cluster para execução do Workflow template:

gcloud dataproc workflow-templates set-cluster-selector meu_template \
--cluster-labels goog-dataproc-cluster-name=meu-cluster \
--region $REGION

Observações

· Na propriedade “set-cluster-selector” colocamos o template_id.

· A propriedade “cluster-labels goog-dataproc-cluster-name” se refere ao nome do cluster que usaremos.

· A propriedade “region” se refere a região em que nosso cluster está.

12. Neste passo vamos adicionar um job de Hive no nosso template, esse job irá retornar a hora atual em que foi disparado o job:

gcloud dataproc workflow-templates add-job hive \
--step-id data_atual \
--region $REGION \
--execute "select current_timestamp" \
--workflow-template meu_template

Observações:

· A propriedade “step-id” Ã© o id/nome do nosso job.

· A propriedade “workflow-template” faz referência ao template_id do nosso template.

· A propriedade “execute” contém o comando a ser executado, nesse caso a instrução de select.

13. Para executar nosso template, use o comando instantiate com o parametro timeout:

gcloud dataproc workflow-templates instantiate meu_template \
--region $REGION \
--timeout=2h

Observações:

· A propriedade “timeout” permite alterar o tempo limite da chamada, caso ela tenha sido feita via google-cloud-sdk, atualmente o tempo padrão é 35 minutos. Esse tempo inclui tanto a execução do job como criação de cluster, sendo assim, o tempo da execução de um fluxo de trabalho como um todo.

14. Ao abrir a aba Jobs no menu do dataproc no console do GCP, aparecerá a execução do Job:

15. Use o comando abaixo para deletar seu template:

gcloud dataproc workflow-templates delete meu_template --region $REGION

Referências

· gcloud alpha dataproc workflow-templates set-dag-timeout

https://cloud.google.com/sdk/gcloud/reference/alpha/dataproc/workflow-templates/set-dag-timeout?hl=pt&skip_cache=true

· Dataproc documentation

https://cloud.google.com/dataproc/docs

· Submit a job

https://cloud.google.com/dataproc/docs/guides/submit-job

· Overview of Dataproc Workflow Templates

https://cloud.google.com/dataproc/docs/concepts/workflows/overview

· Using workflows

https://cloud.google.com/dataproc/docs/concepts/workflows/using-workflows

· Monitoring and debugging workflows

https://cloud.google.com/dataproc/docs/concepts/workflows/debugging