Usando o Apache Hudi no Cloudera

Anselmo Borges
Rescue Point
Published in
6 min readOct 20, 2020
Uma grata descoberta…

Salveeee!

Ando meio sumido aqui do Medium, estou numa pegada de estudos pra uma prova de certificação e montando um treinamento de Nifi para colocar no Udemy. Mas arrumei um tempinho pra falar de coisa boa.

Semanas atrás o Marcelo Senaga (um engenheiro de dados monstro lá da empresa e está sempre antenado com coisas legais) me pediu pra que eu configurasse a lib do Apache Hudi no nosso ambiente de desenvolvimento para testes.

Minha primeira pergunta foi:

“Que porra é Apache Hudi!”

O Hudi é só um projeto que virou Apache Top-level project exatamente hoje (04.06.2020), logo, a parada é sinistra.

Lá vou eu pesquisar sobre, dei uma olhada na documentação dele (no link abaixo) e vou tentar fazer um resumão em poucas palavras sobre o que ele seria:

O Apache Hudi é um meio de realizar operações transacionas como upsert (insert/update), em tabelas que o dado final se encontra no HDFS (mais conhecido como Hadoop).

Ai você pergunta: Ué mais não dá já?

Ai que tá um cara bem famoso que usa essa estrutura é o Hive e para entender esse lance precisamos entender como Hive funciona basicamente no nosso novo quadro:

Entendendo o básico do Hive em 3 minutos:

Aprende ae o que é o Hive e aproveita e deixa um Like lá faz favor…

Agora podemos prosseguir:

Agora que você já sabe o que o Hive faz, falta falar um ponto importante que não falei no vídeo, o Hive não armazena os dados em si, as tabelas são metadados (esqueletos) que apontam pro objeto final que se encontra no HDFS.

Agora onde entra o Apache Hudi nessa Historia?

O Hudi vira um auxiliar na criação de um dataset criado pra uso no Spark por exemplo, o qual consigo visualizar pelo Hive. (Se posso alterar pelo Hive ainda não sei, mas volto no próximo post com a resposta, rs). Posso realizar a criação de tabelas/dataset pelo Spark usando o formato Hudi com o dado final armazenado no HDFS, ele vai criar uma pasta no HDFS onde vai gravar as suas transações usando o Timestamp para possíveis rollbacks caso necessário partindo da sua forma original (arquivo original) e tudo que foi alterado mais controle na pasta HDFS citada.

O Hive vira um visualizador desses dados sendo atualizados em tempo real pelo Spark e de forma extremamente performática.

Esses dados incrementais seriam a camada de Delta (dados entre o arquivo original até o ultimo ponto dado alterado) por isso na própria documentação a imagem traz o conceito de Delta Lake, por isso até o logo é um triangulo.

Se ligou parça? rs

Segue um desenho com uma arquitetura de exemplo:

Exemplo de arquitetura usando o Hudi

Outro ponto legal é o seguinte, eu falei de Hadoop, mas nem todo mundo usa o HDFS como o destino final dos dados em um ambiente bigdata, pode ser usado um diretório do Amazon S3 ou um Google Cloud Storage conforme exemplo da imagem, no meu caso como eu uso o Cloudera on premisses logo uso o HDFS mesmo.

Para mais informações dê uma olhada no site do Hudi:
https://hudi.apache.org/

Hoje usamos o Apache Kudu como a base transacional que não usa o HDFS e sim diretórios file system por node instalado e pensando em utilização de recursos, seria uma boa usar menos recursos desde que seja tão performático quanto.

Gosto muito do Kudu massss, iniciamos os testes, vamos dar uma olhada, não custa nada mesmo.

Custa menos ainda quando você descobrir o quanto é fácil configurar.

Configurando o Apache Hudi no Hive do Cloudera:

O Senaga já está criando os caras pelo Spark, sendo assim, esse material ensina como realizar a configuração no Hive para visualização desses dados, podemos usar via Beeline, se tivermos um Impala e um Hue apontados pro Hive, faço tudo via telinha gráfica! A configuração nada mais é do que colocar o .jar dentro do diretório lib do Hive.

Como o Cloudera tem um Hive customizado dentro de um parcel (compilado de pacotes e programas pré configurado Bigdata, como Hive, HDFS, Zookeeper, Hue e etc) temos que configurar no parcel, assim, quando você reiniciar o serviço lá estará ele.

O parcel Cloudera existe em todos os nodes do Cluster, portanto, você coloca a lib onde tiver o serviço do Hive instalado.

Estou usando a versão 5.16.2 do CDH sendo assim o repositório fica no caminho abaixo:

/opt/cloudera/parcels/CDH

Ele é um link simbolico da distribuição que você estiver usando, portanto não se preocupe com o outro CDH que você tiver, é um link para esse.

dentro desse diretório vão ter todos os serviços padrão do CDH conforme a lista abaixo:

root@sp-vmw-hdp-dev-01:/opt/cloudera/parcels/CDH# ls -lh
total 88K
drwxr-xr-x 2 root root 4,0K Jun 3 2019 bin
drwxr-xr-x 27 root root 4,0K Jun 3 2019 etc
drwxr-xr-x 5 root root 67 Jun 3 2019 include
drwxr-xr-x 2 root root 48K Mai 27 11:06 jars
drwxr-xr-x 38 root root 4,0K Jun 3 2019 lib
drwxr-xr-x 3 root root 4,0K Jun 3 2019 lib64
drwxr-xr-x 3 root root 26 Jun 3 2019 libexec
drwxr-xr-x 2 root root 132 Jun 3 2019 meta

Entrando no diretório bin vai dicar mais visível (peguei só alguns para exemplo):

...-rwxr-xr-x 1 root root  13K Jun  3  2019 impalad
-rwxr-xr-x 1 root root 533 Jun 3 2019 impala-collect-minidumps
-rwxr-xr-x 1 root root 535 Jun 3 2019 impala-collect-diagnostics
-rwxr-xr-x 1 root root 771 Jun 3 2019 hiveserver2
-rwxr-xr-x 1 root root 764 Jun 3 2019 hive
-rwxr-xr-x 1 root root 624 Jun 3 2019 hdfs
-rwxr-xr-x 1 root root 956 Jun 3 2019 hcat
-rwxr-xr-x 1 root root 591 Jun 3 2019 hbase-indexer-sentry
-rwxr-xr-x 1 root root 579 Jun 3 2019 hbase-indexer
-rwxr-xr-x 1 root root 1,1K Jun 3 2019 hbase
-rwxr-xr-x 1 root root 1,4K Jun 3 2019 hadoop-fuse-dfs.orig
-rwxr-xr-x 1 root root 737 Jun 3 2019 hadoop-0.20
-rwxr-xr-x 1 root root 621 Jun 3 2019 hadoop
-rwxr-xr-x 1 root root 638 Jun 3 2019 flume-ng
-rwxr-xr-x 1 root root 596 Jun 3 2019 cli_st
...

Ou seja, o CDH centraliza todos os serviços nessas pastas, eles não necessariamente instalados no node.

Saindo do bin e voltando ao diretório anterior, existe o diretório jars, é nesse diretório onde vamos colocar o nosso jar. Isso pode ser feito de 2 formas, uma é baixar o pacote com todas as libs do projeto nesse link e achar os 2 que usamos no Hive que seriam esses:

hudi-common-0.5.2-incubating.jar
hudi-hadoop-mr-0.5.2-incubating.jar

Ou usar esse comando abaixo por que sou legal pra caralho e já deixei no esquema pra você.

cd /opt/cloudera/parcels/CDH/jars
wget https://github.com/AnselmoBorges/hudi/raw/master/hudi-common-0.5.2-incubating.jar
wget https://github.com/AnselmoBorges/hudi/raw/master/hudi-hadoop-mr-0.5.2-incubating.jar

Feito isso tem que criar o link simbólico lá na pasta lib do Hive, ou seja, jogamos todos os jars na pasta jars raiz do parcel e depois criamos os links simbólicos conforme comandos abaixo:

ln -s /opt/cloudera/parcels/CDH/jars/hudi-common-0.5.2-incubating.jar /opt/cloudera/parcels/CDH/lib/hive/lib/hudi-common-0.5.2-incubating.jar
ln -s /opt/cloudera/parcels/CDH/jars/hudi-hadoop-mr-0.5.2-incubating.jar /opt/cloudera/parcels/CDH/lib/hive/lib/hudi-hadoop-mr-0.5.2-incubating.jar

Com isso temos as libs configuradas basta realizar o restart do Hive pelo Cloudera.

Nesse post é só:

Nesse post tentei mostrar de forma básica a ídeia com base no que eu entendi na documentação e a instalação, vou fazer mais uma série de testes e volto com mais informações quanto as formar de utilizações em outro post.

Até o próximo!

Anselmo Borges

--

--

Anselmo Borges
Rescue Point

Bigdata Engineer, Cloud Architect, Nerd, Alcoholic, Brazilian Jiujitsu Black belt and hide and seek World champion.