Nesta postagem, mostramos como usar o Apache Hive no Cloud Dataproc,
sendo que o armazenando dados será feito no Cloud Storage e o metastore em um
banco de dados MySQL do Cloud SQL. |
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 é Cloud Storage?
Fornece,
a nÃvel mundial, um armazenamento de objetos altamente durável que escalona
para exabytes de dados. É possÃvel acessar dados instantaneamente de qualquer
classe de armazenamento, integrar o armazenamento aos seus aplicativos com uma
API exclusiva unificada e otimizar o preço e desempenho de forma fácil.
O que é Apache Hive?
O Apache Hive permite a realizar
consultas e analises nos dados que estejam hospedados no sistema de arquivos
(HDFS) do Apache Hadoop.
Sendo considerado um Data
Warehouse, ele oferece uma linguagem de consulta semelhante ao SQL, que se
chama Hive Query Language, na sigla HQL ou HiveQL.
O Hive precisa de um database
externo para guardar informações de seus metadados, como por exemplo, as
estruturas de suas tabelas ou views. Geralmente os bancos MySQL e
PostgreSQL são instalados no cluster para fazer esse armazenamento.
O que é Cloud SQL?
É um serviço gerenciado do GCP
que permite a criação de um banco de dados relacional MySQL, PostgreSQL ou SQL
Server. Na abordagem proposta por esse tutorial, somente os metadados vão estar no Cloud Sql, toda a consulta aos dados será feita pelo Dataproc.
Por que armazenar o metastore no Cloud SQL e os dados no Cloud Storage?
Além de ser uma abordagem que é
recomendada pelo próprio GCP, esse desacoplamento oferece diversas
possibilidades, entre elas, a "independência" de um cluster, ou seja,
com os dados e o metastore guardados externamente, podemos deletar o cluster
sem perder essas informações, criar outro com especificações diferentes (mais
nós ou memória) para dar continuidade ao trabalho.
É possÃvel também criar um
cluster efêmero, e exclui-lo após a conclusão do processo, para redução de
custos em processamento de dados não crÃticos pode-se
usar VMs preemptivas.
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. Criaremos o bucket do Cloud Storage que será o repositório de dados do hive:
gsutil mb -l $REGION gs://$PROJECT-warehouse
10. Crie uma instância do Cloud SQL que será usada para armazenar os
metadados do hive:
gcloud sql instances create hive-metastore \
--database-version="MYSQL_5_7" \
--activation-policy=ALWAYS \
--gce-zone $ZONE
11. Crie um cluster do dataproc com o comando abaixo:
gcloud dataproc clusters create hive-cluster \
--scopes sql-admin \
--image-version 1.3 \
--initialization-actions
gs://dataproc-initialization-actions/cloud-sql-proxy/cloud-sql-proxy.sh \
--properties
hive:hive.metastore.warehouse.dir=gs://$PROJECT-warehouse/datasets \
--metadata
"hive-metastore-instance=$PROJECT:$REGION:hive-metastore" \
--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 “hive:hive.metastore.warehouse.dir=gs://$PROJECT-warehouse/datasets” faz referência ao diretório que serão guardadas por padrão os dados provenientes de tabelas gerenciadas em que não foi especificado um PATH.
·
A propriedade “image-version 1.3” se refere a versão de imagem de
SO do cluster.
·
A propriedade “initialization-actions
gs://dataproc-initialization-actions/cloud-sql-proxy/cloud-sql-proxy.sh” permite
que ao criar o cluster o script de inicialização do Cloud SQL Proxy (que permite
fazer acesso às instâncias sem a necessidade de redes autorizadas ou de configuração de SSL de forma segura) execute nas maquinas.
·
A propriedade “hive-metastore-instance=$PROJECT:$REGION:hive-metastore”
permite que seja estabelecida uma conexão segura com a instância criada do
Cloud SQL.
·
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.
12. Neste passo vamos gerar um job do Dataproc que vai criar uma tabela externa do hive:
gcloud dataproc jobs submit hive \
--cluster hive-cluster \
--region $REGION \
--execute "
CREATE EXTERNAL TABLE
transactions
(SubmissionDate DATE,
TransactionAmount DOUBLE, TransactionType STRING)
STORED AS PARQUET
LOCATION 'gs://$PROJECT-warehouse/datasets/transactions';"
Observações:
· A propriedade “submit” faz referência ao tipo de job que vamos executar, pode-se substituir o valor “hive” por “spark” ou “spark-sql” por exemplo.
· A propriedade “cluster” faz referência ao cluster que executaremos o job.
· A propriedade “region” faz referência a região em que o cluster está.
· A propriedade “execute” contêm o comando a ser executado, nesse caso a instrução de create.
· Caso a instância do Cloud SQL esteja desligada o job vai falhar.
· Podemos ver o resultado do Job através da linha de comando ou no pelo console do GCP.
13. Agora vamos gerar um job do Dataproc que vai consultar a tabela externa que criamos no passo anterior:
gcloud dataproc jobs submit hive \
--cluster hive-cluster \
--region $REGION \
--execute "select * from transactions;"
Observação: Também é possÃvel criar os Jobs do Dataproc através do console do GCP.
14. A tabela vai estar vazia pois ainda não tem arquivos na pasta, para que a tabela tenha dados, vamos copiar um arquivo na nossa pasta do Cloud Storage:
gsutil cp gs://hive-solution/part-00000.parquet \
gs://$PROJECT-warehouse/datasets/transactions/part-00000.parquet
15. Execute novamente o job de select para visualizar os dados carregados:
gcloud dataproc jobs submit hive \
--cluster hive-cluster \
--region $REGION \
--execute "select * from transactions limit 10;"
O retorno deve ser semelhante ao abaixo:
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
·
Cloud Storage documentation
https://cloud.google.com/storage/docs
·
Cloud Storage as a data lake
https://cloud.google.com/solutions/build-a-data-lake-on-gcp
·
Cloud SQL documentation
https://cloud.google.com/sql/docs
·
About the Cloud SQL Proxy
https://cloud.google.com/sql/docs/mysql/sql-proxy
·
Apache Hive documentation
https://hive.apache.org/