Como criar um Workflow parametrizado no Cloud Dataproc

Nesta postagem, mostramos como usar o fluxo de trabalho(workflow) parametrizado 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 - Linha de comando

 

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 vazio:

 

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

 

Observação:

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

 

11. Crie um bucket no Cloud Storage com a finalidade de colocar os scripts a serem usados no Dataproc:

 

gsutil mb -l $REGION gs://$PROJECT-scripts

 

12. Utilize o comando nano para gerar o arquivo create.sql com o seguinte conteúdo:

 

CREATE EXTERNAL TABLE tb_test (TestDate DATE, TestType STRING)

STORED AS PARQUET LOCATION '${hivevar:meu_bucket}';"

 

13. Copie seu arquivo para o seu bucket:

 

gsutil cp create.sql gs://$PROJECT-scripts/

 

14. Neste passo vamos adicionar um job de Hive no nosso template, esse job vai usar nosso arquivo do passo anterior:

 

gcloud dataproc workflow-templates add-job hive \

  --step-id cria_tabela \

  --region us-central1 \

  --file gs://$PROJECT-scripts/create.sql \

  --workflow-template meu_template \

  --params meu_bucket=gs://$PROJECT-scripts/tb_test

 

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 “params” contêm os parâmetros a ser passados para a query, nesse cenário definimos o parâmetro meu_bucket que será o diretório da nossa external table.

 

·        A propriedade “file” contêm o comando a ser executado dentro do arquivo no nosso diretório, nesse caso a instrução de create.

 

15. Exporte o template como um arquivo de configuração .yaml:

 

gcloud dataproc workflow-templates export meu_template --destination=hive-template.yaml --region us-central1

 

Observação:

·        Esse arquivo será gerado na sua pasta atual do Cloud Shell, para visualizar use o comando ls

 

13. Edite o arquivo gerado, vou usar o nano como exemplo:

 

nano hive-template.yaml

14. Após o StepId adicione o trecho abaixo:

parameters:
- name: meu_bucket
  fields:
  - jobs['cria_tabela'].hiveJob.scriptVariables['meu_bucket']

15. Atualize seu template:

gcloud dataproc workflow-templates import meu_template \
--source=hive-template.yaml --region us-central1

16. Adicione um cluster ao seu 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á.

17. Execute o template passando o valor do parâmetro:

gcloud dataproc workflow-templates instantiate meu-template \

--parameters="meu_bucket=${meu_bucket}"

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

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

19. 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

·        passing parameters via dataproc workflow-templates

https://stackoverflow.com/questions/46820897/passing-parameters-via-dataproc-workflow-templates