Como criar um Workflow no Cloud Dataproc

Nesta postagem, mostramos como usar o 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 usaremos 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. Nesse 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 usaremos 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 workes. 

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

10. Neste passo vamos gerar um Workflow template: 

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

Observação:

·        Na propriedade “create” definimos o valor do nosso template_id. 

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á criar uma tabela externa: 

gcloud dataproc workflow-templates add-job hive \

  --step-id cria_tabela \

  --region $REGION \

  --execute "CREATE EXTERNAL TABLE tb_transactions (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING) STORED AS PARQUET LOCATION 'gs://$PROJECT-warehouse/datasets/transactions';" \

  --workflow-template meu_template 

Observações:

·        A propriedade “step-id” é o id 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 create. 

13. Neste passo vamos adicionar um job de Hive no nosso template, esse job irá ser executado após criar uma tabela externa: 

gcloud dataproc workflow-templates add-job hive \

    --step-id select_tabela \

            --region $REGION \

    --start-after cria_tabela \

            --execute "select * from tb_transactions;" \

    --workflow-template meu_template

 Observação:

·        A propriedade “start-after” é o id do job anterior, ou seja, esse só pode iniciar após o termino do job. 

14. Neste passo vamos adicionar um job de Hive no nosso template, esse job irá ser executado após criar e consultar uma tabela externa: 

gcloud dataproc workflow-templates add-job hive \

    --step-id dropa_tabela \

            --region $REGION \

    --start-after cria_tabela,select_tabela \

            --execute "drop table tb_transactions;" \

    --workflow-template meu_template 

Observações:

·        Na propriedade “start-after” para adicionar mais de um job use virgula como delimitador.

 15. Para executar nosso template, use esse comando: 

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

 16. Ao abrir a aba fluxo de trabalho no menu do dataproc no console do GCP, aparecerá a execução do workflow, clique no código do fluxo de trabalho:



17. Nessa tela vai aparecer a ordem de execução dos Jobs com a dependência, se clicar no Id do Job o Log de execução aparecerá:



18. Ao rodar novamente o template, use o comando abaixo para listar as operações em execução:

gcloud dataproc operations list --filter "labels.goog-dataproc-operation-type=WORKFLOW AND status.state=RUNNING"  --region $REGION

 19. Use o comando abaixo para remover um job do seu template:

 gcloud dataproc workflow-templates remove-job meu_template  --step-id dropa_tabela --region $REGION

 20. Use o comando abaixo para deletar seu template: 

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

 Referências

 

·        Using Apache Hive on Cloud Dataproc

https://cloud.google.com/solutions/using-apache-hive-on-cloud-dataproc

·        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