Você está na página 1de 10

Bootcamp: Engenheiro(a) de Dados (Cloud)

Desafio

Módulo 4 Tecnologias de Big Data - Processamento de Dados Massivos

Objetivos

Exercitar os seguintes conceitos trabalhados no Módulo:

✓ Entendimento da manipulação de dados com Spark.

✓ Uso do Spark SQL.

✓ Otimização de processamentos com Spark.

✓ Deploy e desenvolvimento de aplicações.

✓ Uso do Spark em conjunto dos serviços do GCP.

Enunciado
Suponha que, como engenheiro de dados, foi apontada uma necessidade de utilizar informações
de bases de dados públicas para enriquecer os dados da sua companhia. Deve ser estabelecido
então uma aplicação de processamento e escrita de dados no Data Lake da empresa, hoje todo
disponibilizado na plataforma da nuvem do Google, o GCP. Os dados a serem utilizados são
disponibilizados publicamente no site http://200.152.38.155/CNPJ/, e dizem respeito a base
completa de CNPJs já registrados no Brasil. Sua tarefa é juntar as tabelas de estabelecimentos,
CNAEs e municípios em uma única tabela analítica, que será consumida por áreas estratégicas da
empresa.
Atividades
Os alunos deverão desempenhar as seguintes atividades:

1 – Download dos Dados

Os arquivos necessários para a realização da prática estarão disponíveis em um bucket público do


GCS, cujas informações seguem abaixo:

• Região: us-east1.

• Bucket: desafio-final.

• Link: https://console.cloud.google.com/storage/browser/desafio-final.

Durante a prática, os alunos devem acessar esses dados diretamente do bucket, utilizando as
ferramentas apresentadas em aula. Observação: é possível ler os dados do bucket diretamente do
Spark, tanto localmente quanto em um cluster (apesar da segunda opção ser a mais
recomendada).

As tabelas utilizadas são:

• CNAE.

• Municípios.

• Estabelecimentos de CNPJ.

Um dicionário de dados das tabelas pode ser encontrado abaixo:

• Dicionário de Dados.

Os arquivos estão disponibilizados no formato csv.

2 – Criação da conta no GCP e disponibilização dos serviços

Os passos para a criação da conta no GCP e a habilitação dos serviços foram apresentados ao
longo de todo o capítulo 8. Os alunos devem assistir as aulas e tomar a apostila como referência.
Nessa prática devem ser usados o Google Cloud Storage (GCS) e o Dataproc. Lembre-se de
habilitar corretamente os componentes do cluster para que seja acessada a interface do Jupyter.

3 – Tarefas Específicas

Durante a prática, o aluno deve:

• Criar um bucket no GCS e disponibilizar um cluster no Dataproc. Atenção: é recomendado


utilizar um cluster com mais nós (máquinas), uma vez que o volume de dados é bastante
intenso. Abaixo o comando para gerar o cluster recomendado:

gcloud dataproc clusters create cluster-teste


--enable-component-gateway
--region ${REGION} --zone ${REGION}-c
--master-machine-type n1-standard-4
--master-boot-disk-size 500
--num-workers 5
--worker-machine-type n1-standard-4
--worker-boot-disk-size 500
--image-version 2.0-debian10
--optional-components JUPYTER
--project ${PROJECT_ID}

Segundo a própria documentação do Dataproc, esse cluster geraria um custo de US$ 0,48 caso
ficasse ligado 2 horas. O custo é calculado da seguinte forma:

Nº de vCPUs * horas * $0,01

Apesar de o limite gratuito ser mais do que suficiente para que a prática seja realizada, esteja
ciente de que cada hora gasta implica em um custo. Use o cluster com cuidado e lembre-se de
excluí-lo ao final de cada sessão de uso.

• Ler as tabelas disponibilizadas (Dica: utilize a opção escape = "\"").


• Construir o schema e ajustar os tipos (Atenção: não é porque o dado deve ser de um
determinado tipo que uma simples operação de “cast” irá convertê-lo corretamente.
Observe a forma como os dados estão dispostos).

• Escrever as tabelas individuais em um bucket do GCS chamado “trusted”.

• Realizar operações subjetivas nas tabelas da pasta trusted, de forma a tornar as tabelas
mais interessantes e confiáveis para o usuário final. Utilize os conhecimentos aprendidos
ao longo do curso!

• Juntar as tabelas, consolidando as informações em um único DataFrame.

• Escrever os dados em um do bucket do GCS, chamada “refined”.

• Após isso, responder as questões do desafio. As questões são sobre o processo de


manipulação e sobre o DataFrame final.

A nomenclatura das pastas utilizadas nessa prática é a mais comum em estruturas de Data Lake
reais. Para isso, deve-se considerar que a camada “raw” é o bucket público disponibilizado.

4 – Deploy da aplicação

Por se tratar de uma prática em que é necessário realizar várias operações exploratórias, é natural
utilizar o Jupyter Notebook para responder as questões. No entanto, fica o desafio opcional para o
aluno de executar o processo final utilizando um script Python e o recurso de lançamento de
aplicações Spark do Dataproc, visto em aula. Essa parte não será avaliada diretamente, mas é um
passo importante para o entendimento e consolidação dos conhecimentos desenvolvidos.
Respostas Finais
Os alunos deverão desenvolver a prática e, depois, responder às seguintes questões objetivas:

1. A melhor forma de reparticionar o DataFrame “df” para 25 partições, dado que


ele tem 100, é
X df.coalesce(25).
df.repartition(25).
df.partitionBy(25).
df.partition(25).

2. O Spark dispõe de pelo menos três algoritmos diferentes para realizar joins:
Broadcast Join (BHJ) Shuffled Hash Join (SHJ) Sort Merge Join (SMJ). Suponha
que tenhamos duas tabelas, df1 e df2, e que durante o processamento
devemos realizar uma operação de join entre elas. Considere que df1 é
consideravelmente maior que df2, que nenhuma outra operação é realizada
anterior ao join e que id é uma coluna ordenável que serve como chave da
junção. Observação: os dados de ambas as tabelas estão particionados.
Broadcast Join, se a tabela menor for pequena o suficiente, e Shuffled Hash
X
Join caso contrário.
Deve-se utilizar o Sort Merge Join em todas as situações.
Shuffled Hash Join, se a tabela menor for pequena o suficiente, e Broadcast
Join caso contrário.
Salvar as tabelas em buckets particionados e ordenados pela coluna id e
realizar um Sort Merge Join.

3. A diferença entre os modos de deploy “client” e “cluster” são:


No modo “cluster” tanto o driver como os executores do Spark estão
X presente em algum dos nós do cluster, enquanto no modo “client” o driver
fica na máquina que enviou a aplicação e os executores presentes nos nós.
No modo “cluster” o driver fica na máquina que enviou a aplicação e os
executores presentes nos nós do cluster, enquanto no modo “client” tanto o
driver como os executores do Spark estão presentes nos nós.
No modo “cluster” o driver do Spark faz o papel de cluster manager,
enquanto no modo “client” o driver apenas se comunica com um manager
existente.
No modo “cluster” o driver apenas se comunica com um manager existente,
enquanto no modo “client” o driver do Spark faz o papel de cluster manager.

4. A vantagem de se utilizar a persistência de dados na memória é:


É eliminada a necessidade de realizar as operações salvas pelo Lazy
X
Evaluation todas as vezes em consultas futuras aos dados.
As operações salvas pelo Lazy Evaluation são executadas de forma mais
rápida em consultas futuras aos dados.
O plano físico gerado pelo Catalyst Optimizer é otimizado pela presença física
dos dados em disco.
Não há vantagens significativas de se utilizar a persistência em memória.

5. Sobre o Spark SQL, podemos afirmar que


Ele é intercambiável em relação a API de DataFrames, e ambas as formas de
X
manipulação estão relacionadas.
Ele é exclusivo em relação a API de DataFrames, e ambas as formas de
manipulação não interagem entre si.
Ele só pode ser usado em um shell criado pelo comando spark-sql.
Ele dispõe de diversas funções implementadas que podem ser usadas, mas
não permite o registro de udfs.

6. Qual código abaixo é usado para gerar tabelas temporárias no Spark?


X Não há tabelas temporárias no Spark.
df.createOrReplaceTempTable(“table_name”).
df.write.saveAsTempTable(“table_name”).
spark.sql(“CREATE TEMPORARY TABLE table_name (schema)”).
7. Para limpar todos os dados persistidos na memória, deve-se usar:
X spark.catalog.clearCache()
spark.catalog.clearTables()
spark.catalog.unpersistAll()
spark.catalog.unpersistTables()

8. Uma aplicação do Spark foi desenvolvida em uma estrutura composta por


cinco scripts Python. Os scripts estão organizados na seguinte estrutura:

Qual é o comando spark-submit adequado para deploy dessa aplicação


localmente?
X spark-submit --py-files src.zip main.py
spark-submit –py-files main.py src.zip
spark-submit –py-files src.zip,main.py
spark-submit --py-files src.zip src/main.py

9. Qual das opções de leitura abaixo fornece a leitura adequada da tabela de


estabelecimentos? Considere que o schema está criado e a variável abaixo:
path = 'gs://desafio-final/estabelecimentos/*'
Obs.: utilize a opção de “escape” apresentada abaixo para a leitura dos dados na
resolução das demais questões.
Enunciado modificado.
X
10. Qual o código do CNAE mais presente nas empresas ativas? Quantas empresas
utilizam esse CNAE?
X CNAE 4781400, 1.781.558 empresas.
CNAE 4781400, 991.316 empresas.
CNAE 4781400, 2.415.486 empresas.
CNAE 4772500, 825.859 empresas.

11. Usando a função to_date(), qual a forma CORRETA do argumento format para
converter as colunas de data para o tipo correto?
X yyyyMMdd
yyyy-MM-dd
ddMMyyyy
dd/MM/yyyy

12. Quantos CNPJs não ativos existem no estado de São Paulo?


Enunciado modificado.
X 7.966.472
6.020.626
6.122.031
14.088.503

13. Quantas empresas de “Consultoria em tecnologia da informação” existem em


Belo Horizonte?
Enunciado modificado.
X 6930.
5754.
8957.
13891.

14. Qual o CNAE primário do IGTI?


Dica: O IGTI está localizado em Belo Horizonte.
X 8532500, Educação superior – graduação e pós-graduação.
8542200, Educação profissional de nível tecnológico.
8531700, Educação superior – graduação.
8533300, Educação superior – pós-graduação e extensão.

15. Quantas empresas foram abertas desde 2020?


X 6.314.456.
6.312.750.
5.277.792.
1.036.664.

Você também pode gostar