Integrando o HDFS client com o Ozone

Anselmo Borges
Rescue Point
Published in
6 min readDec 2, 2020
Usando o Ozone com a ferramenta tradicional

Sem muita enrolação e apenas recapitulando, no post anterior realizamos a manipulação básica de arquivos via “Ozone sh”, mas considerando que não queremos mudanças pra quem já tem vivência com HDFS e aproveitando a integração total que o Ozone tem com o Hadoop, vamos fazer essa integração super simples.

Protocolos usados

O Ozone usa 2 protocolos básicos para acessar os dados:

  • OFS: É o protocolo padrão, inclusive o usado pelo “ozone fs”, onde apontamos para o serviço do Ozone e temos acesso a todo conteúdo. Volumes, buckets e Keys. Em uma visão de segurança seria recomendados apenas para administradores do Cluster.
  • O3FS: As grandes diferenças desse para o anterior é que esse padrão acessa somente um bucket e a configuração dele já aponta um modelo muito parecido com o S3 da Amazon de of3s://bucket.volume.hostname:porta/key

Esse ultimo exemplo como se fossemos acessar um arquivo (key), perceba como o caminho é construído, logo mais vamos fazer um teste, para isso…

Instalando o Hadoop 3.30

Calma ae…

Saimos do HDFS para voltar pro HDFS? Não!! A ideia e simular uma conexão do HDFS Client com o Ozone, pra isso precisamos alterar um arquivo de configuração do HDFS chamado core-site.xml.

Outro ponto é que vamos usar o mesmo ambiente dos posts anteriores sendo assim não temos um HDFS lá e vamos criar um.

Baixando e descompactando o Hadoop

Vamos fazer o download da ultima versão e descompactar o pacote, estou levando em consideração que estou no diretório home do meu usuário e tenho privilégio de sudo.

cd ~
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
tar zfxv hadoop-3.3.0.tar.gz

Criando o diretório /hadoop e movimentando o conteúdo

Agora vamos criar um diretório “/hadoop” o qual vamos dar privilégios para o nosso usuário (no meu caso o user opc) e movimentar o conteúdo do arquivo descompactado pra lá.

sudo mkdir -p /hadoop
sudo chown opc:opc /hadoop
mv ~/hadoop-3.3.0/* /hadoop/

Vou excluir os arquivos baixados mas isso fica a seu critério

rm -rf ~/hadoop*

Setando as variáveis de ambiente

No post anterior setamos as variáveis PATH e JAVA_HOME, aqui vamos fazer também, porem vamos acrescentar o caminho dos binários do Hadoop /hadoop/bin na variável PATH para podermos rodar os comandos.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
export PATH=$PATH:/ozone/bin:/hadoop/bin
export HADOOP_OPTS='-XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled'

Configurando a lib do Ozone para o HDFS Client

Agora que temos o HDFS instalado vamos ir no arquivo de configuração do HDFS /hadoop/etc/hadoop/core-site.xml e no meio do arquivo vão ter 2 tags configuration e no meio delas colamos esse conteúdo:

<property>
<name>fs.ofs.impl</name>
<value>org.apache.hadoop.fs.ozone.RootedOzoneFileSystem</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>ofs://localhost/</value>
</property>

Nessa configuração estamos configurando o protocolo ofs como protocolo padrão e estamos dizendo que o diretório raiz de nossas consultas e manipulações é o ofs://localhost , ou seja, a raiz do ozone, visualizando todos os volumes, buckets e keys.

Como o meu usuário “opc” é o owner da porra toda ele tem privilégios geral no Ozone. Agora falta um ultimo ponto para acessarmos o Ozone via HDFS é setarmos a variável HADOOP_CLASSPATH apontando para a lib do ofs do ozone, ela vem junto com a instalação dele.

export HADOOP_CLASSPATH=/ozone/share/ozone/lib/hadoop-ozone-filesystem-hadoop3-1.0.0.jar:$HADOOP_CLASSPATH

Agora que comecem os jogos

Vamos começar a rodar os comandos do HDFS e vamos ver que se tratam dos arquivos do Ozone, vamos dar um “ls” simples no “/”, se liga:

[opc@whiterose ~]$ hdfs dfs -ls /
Found 2 items
drwxrwxrwx - opc opc 0 2020-11-27 16:43 /rescue
drwxrwxrwx - opc opc 0 2020-11-24 18:45 /s3v

São nossos 2 volumes do Ozone, o s3vque já vem junto com o Ozone e o rescueque criamos no ultimo post.

Ainda não descobri como realizar o put, para inserir arquivos no Ozone via HDFS, pois se você lembra no post anterior como usamos o Ozone como single instance, não temos 3 pontos de replicação, ai usamos o parâmetro -r=ONE , agora é descobrir como passo isso no HDFS.

Podemos criar um novo volume como se fossemos criar um diretório no “/”, vamos criar o diretório point.

hdfs dfs -mkdir /point

Agora vamos listar pra ver se foi:

[opc@whiterose ~]$ hdfs dfs -ls /
Found 3 items
drwxrwxrwx - opc opc 0 2020-12-02 01:53 /point
drwxrwxrwx - opc opc 0 2020-11-27 16:43 /rescue
drwxrwxrwx - opc opc 0 2020-11-24 18:45 /s3v

Funciona! Agora vamos criar um bucket chamado teste

hdfs dfs -mkdir /point/teste

Vamos listar o conteúdo e:

[opc@whiterose ~]$ hdfs dfs -ls /point
Found 1 items
drwxrwxrwx - opc opc 0 2020-12-02 01:55 /point/teste

Movimentando arquivos:

Eu ia movimentar arquivos pra dentro do Ozone mas cairemos naquele impasse da replicação nesse ambiente de testes que criamos, sendo assim vamos usar o comando get e pegar o arquivo /rescue/teste/README.md que criamos no post anterior via HDFS. Vamos joga-lo no /tmp mesmo.

hdfs dfs -get /rescue/teste/README.md /tmp/

Pode conferir no diretório /tmp seu arquivo saiu do Ozone e foi parar no File System via HDFS Client. Simples né?

Usando o O3fs

Lembra que falamos da diferença do o3fs lá em cima? Ele visualiza somente um bucket logo vamos criar um volume e um Bucket via Ozone sh e depois vamos configurar esse cara:

ozone sh volume create /volume
ozone sh bucket create /volume/bucket

Agora vamos substituir aquelas entradas que fizemos no core-site.xml do Hadoop por essa abaixo no “/hadoop/etc/hadoop/core-site.xml”:

<property>
<name>fs.AbstractFileSystem.o3fs.impl</name>
<value>org.apache.hadoop.fs.ozone.OzFs</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>o3fs://bucket.volume</value>
</property>

Perceba que eu mudei o nome da propriedade para fs.AbstractFileSystem.o3fs.impl que define bem que estamos abstraindo o resto do filesystem do Ozone o que traz uma segurança absurda, mas se liga no caminho do fs.defaultFS: o3fs://bucket.volume

Ele reconhece que a partir do “/volume/bucket”, tudo é “/” para o HDFS client e perceba também que a ordem de chamada é do menor para o maior, “bucket — Volume”, vamos ver melhor isso em um exemplo mais a diante:

vim /hadoop/etc/hadoop/core-site.xml

Fiz uma alteração no ozone-site.xml, trocando tudo que tinha localhost para o host da minha maquina (whiterose), caso contrario a porta não vai escutar a requisição do HDFS Client. Reiniciei os serviços do ozone também.

Agora só rodar o comando de “ls” via HDFS e ver que não vai retornar nada. Isso porque dentro do bucket que criamos não tem nada mesmo.

hdfs dfs -ls /

Agora vamos criar uma pasta /users:

hdfs dfs -mkdir /users

Ué, mas se for assim criei um bucket dentro de um bucket? Não era impossivel? Via Ozone sh é, mas qualquer outro método que crie um diretório dentro de um bucket ele deixa, mas pro Ozone essa pasta é uma key, se liga:

[opc@whiterose ~]$ ozone sh key ls /volume/bucket
{
"volumeName" : "volume",
"bucketName" : "bucket",
"name" : "users/",
"dataSize" : 0,
"creationTime" : "2020-12-02T02:30:21.272Z",
"modificationTime" : "2020-12-02T02:30:21.272Z",
"replicationType" : "RATIS",
"replicationFactor" : 1
}

Bom teóricamente, criando esse diretorio /users via HDFS client, todas as demais ferramentas vão criar sua estrutura ai, por exemplo:

  • Hive: /users/hive
  • Spark: /users/spark
  • Sqoop: /users/sqoop

E assim vai, como disse de forma transparente usando o Ozone achando que estão usando o HDFS.

Pra fechar existe um ultimo método para manipular dados do Ozone via HDFS client:

[opc@whiterose ~]$ hdfs dfs -ls o3fs://teste.rescue.whiterose/
Found 1 items
-rw-rw-rw- 1 opc opc 3841 2020-11-27 16:52 o3fs://teste.rescue.whiterose/README.md

Note que o caminho que usei não é o setado no core-site.xml, portanto quando seto na mão o caminho o3fs, fui buscar a key README.md, que está no bucket “teste” do volume “rescue”. Desde que ele tenha privilégio essa é uma chamada direta.

Bom no post de hoje era isso, no próximo pra fechar essa trilha vou postar sobre a integração do Ozone com um Bucket S3 na AWS.

Espero que ajude, deixe sua palminha e até o proximo.

Anselmo Borges
Rescue Point

--

--

Anselmo Borges
Rescue Point

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