Integrando o HDFS client com o Ozone
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
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 s3v
que já vem junto com o Ozone e o rescue
que 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