Ozone Sh: A interface linha de comando do Apache Ozone

Anselmo Borges
Rescue Point
Published in
8 min readNov 26, 2020
Vamos começar a manipular arquivos usando o Ozone sh

No último post fizemos a instalação do nosso ambiente, agora estamos loucos pra usar, vamos começar usando a interface linha de comando do próprio Ozone, o ozone sh.

O mesmo material desse post está disponível via vídeo no canal da Rescue Point no Youtube, aproveite e siga a gente lá, tem muita coisa bacana na área de dados.

Vídeo auxiliar desse material

Na realidade, estaremos usando o mesmo comando “ozone” que usamos no post anterior mas adicionamos o comando sh para manipulação de dados dentro dele, vamos passar por alguns comandos básicos com a lista abaixo:

Obtendo ajuda

Todos os comandos no ozone tem uma ajuda bem intuitiva, para receber ajuda basta adicionar a sintaxe--help em qualquer comando que eu for usar, por exemplo quero a ajuda dos possíveis comandos com volume:

[opc@whiterose ~]$ ozone sh volume --help
Usage: ozone sh volume [-hV] [COMMAND]
Volume specific operations
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
info returns information about a specific volume
list, ls List the volumes of a given user
create Creates a volume for the specified user
update Updates parameter of the volumes
delete deletes a volume if it is empty
addacl Add one or more new ACLs.
removeacl Remove one or more existing ACLs.
setacl Set one or more ACLs, replacing the existing ones.
getacl List all ACLs.

Essa ajuda se extende aos subcomandos por exemplo:

[opc@whiterose ~]$ ozone sh volume update --help
Usage: ozone sh volume update [-hV] [--quota=<quota>] [--user=<ownerName>]
<value>
Updates parameter of the volumes
<value> URI of the volume.
Ozone URI could start with o3:// or without prefix. URI
may contain the host/serviceId and port of the OM
server. Both are optional. If they are not specified it
will be identified from the config files.
--quota=<quota> Quota of the volume to set(eg. 1G)
--user=<ownerName> Owner of the volume to set
-h, --help Show this help message and exit.
-V, --version Print version information and exit.

Bom então esse é o básico para você se virar no ozone sh, kkkkkkkkk

Falowww aeee…

Zuera, vamos ver pelo menos o básico das criações e como funciona a manipulação:

Recapitulando a organização do Ozone

Fiz um desenho bem safado no primeiro post, que mostrava a divisão dos principais itens do Ozone que são:

  • Volumes
  • Buckets
  • Keys
Organização do Apache Ozone

Com essa relembrada vamos criar os Volumes que são unidades que só podem ser criadas e deletadas por administradores, mesmo que você tenha um colume pra você, você não tem privilégio para excluir ou criar um se não for o admin do Ozone.

Como estamos usando um single instance sem restrição, o meu user “opc” é o admin da porra toda, assim como o de vocês vai ser.

Gerenciando volumes:

Vamos realizar algumas operações básicas com volumes como criar, listar e deletar que já é o suficiente pra você viver:

Criando volume

Vamos criar um volume de nome rescue:

ozone sh volume create rescue

Listando os volumes

Lembrando que o volume s3v já vem com a instalação, não tinhamos nenhum outro volume ai. Vamos ver se nosso volume rescue foi criado:

ozone sh volume ls

O ls é como o ls do Unix/Linux mesmo, ele lista e pode ser usado para os demais comandos a seguir, note que o retorno é um JSON. O DB do Ozone é uma base chave/valor que é gerenciada por uma API, o ozone sh só faz o papel do intermediador entre o API e você numa interface mais amigável, nada impede que as consultas sejam feitas via API o que veremos mais pra frente.

...
{
"metadata" : { },
"name" : "rescue",
"admin" : "opc",
"owner" : "opc",
"creationTime" : "2020-11-25T23:19:45.776Z",
"modificationTime" : "2020-11-25T23:19:45.776Z",
"acls" : [ {
"type" : "USER",
"name" : "opc",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
}, {
"type" : "GROUP",
"name" : "opc",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
}, {
"type" : "GROUP",
"name" : "wheel",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
}, {
"type" : "GROUP",
"name" : "adm",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
}, {
"type" : "GROUP",
"name" : "systemd-journal",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
} ],
"quota" : 1152921504606846976
}

Note no retorno que ele te mostra algo muito parecido com o que você veria num ls mas numa forma de chave/valor, como usuário, grupo, acl aplicada e coisas do gênero.

Bom vamos criar mais um volume chamado point pra podermos deletar depois, rode o comando abaixo:

ozone sh volume create point

Deletando um volume

Até aqui você viu que é tudo bem simples e intuitivo, o delete é basicamente substituir o create por delete

ozone sh volume delete point

A seguinte informação volume point is deletedque confirma que o volume point foi deletado.

Vamos agora ao próximo nível da hierarquia que são os buckets.

Gerenciando Buckets

Como já vimos como listar, criar e deletar, fica óbvio que com buckets é a mesma coisa, sendo assim vamos listar as opções que temos em buckets

ozone sh bucket --help

Podemos ver que é realmente a mesma coisa de volume com a excessão da opção link que dá a possibilidade de fazermos um link, muito parecido com o conceito de links simbólicos no Linux.

[opc@whiterose ~]$ ozone sh bucket --help
Usage: ozone sh bucket [-hV] [COMMAND]
Bucket specific operations
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
info returns information about a bucket
list, ls lists the buckets in a volume.
create creates a bucket in a given volume
link creates a symlink to another bucket
delete deletes an empty bucket
addacl Add one or more new ACLs.
removeacl Remove one or more existing ACLs.
getacl List all ACLs.
setacl Set one or more ACLs, replacing the existing ones.

Já ia esquecendo um ponto importantíssimo sobre buckets

Não é possível criar um bucket dentro de outro bucket, ele aceita criar buckets dentro de volumes apenas

Dá uma olhada nesse exemplo:

[opc@whiterose logs]$ ozone sh bucket create /rescue/teste/testandoInvalid value for positional parameter at index 0 (<value>): cannot convert '/rescue/teste/testando' to OzoneAddress (org.apache.hadoop.ozone.client.OzoneClientException: Invalid bucket name. Delimiters (/) not allowed in bucket name)

Ele fala que não pode usar o “/” no nome de bucket, ou seja, ele não entendeu o caminho que passei, não tentei de outras formas mas a documentação diz que não rola.

Sendo assim dou como encerrado o Bucket.

Gerenciando Keys

Esse cara que queremos ver, pois o astro desse filme é o dado e precisamos saber como vamos gerencia-lo no Ozone, a primeira coisa a fazer é rodar o --help do comando key

ozone sh key --help

Os primeiros caras que vemos ai de cara são:

  • cp: copiar arquivos
  • get: pegar os arquivos do Ozone server
  • cat: literalmente dar um cat para visualizar o conteúdo do arquivo, trazendo ele do Ozone para o S.O e usando a saída padrão do sistema operacional para exibir.
  • rename: renomear uma key existente
  • put: criar ou sobrescrever um arquivo existente no Ozone server

Existem alguns outros que podemos ver na saída abaixo mas é praticamente mais do mesmo.

[opc@whiterose ~]$ ozone sh key --help
Usage: ozone sh key [-hV] [COMMAND]
Key specific operations
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
info returns information about an existing key
list, ls list all keys in a given bucket
get Gets a specific key from ozone server
cat Copies a specific Ozone key to standard output
put creates or overwrites an existing key
rename renames an existing key
cp copies an existing key to another one within the same bucket
delete deletes an existing key
addacl Add one or more new ACLs.
removeacl Remove one or more existing ACLs.
setacl Set one or more ACLs, replacing the existing ones.
getacl List all ACLs.

Nesse exemplo vamos pegar como exemplo o arquivo README.md que está no /ozone, copiamos ele pra lá quando fizemos a instalação do Ozone. Vamos jogar esse cara dentro do Ozone mas tem um detalhes bem importante

A sintaxe do comando put (a do get também) que vai jogar o arquivo no Ozone é diferente do que você conhece por um comando CP de copiar, ela é o contrario, ou seja, é destino primeiro depois o que você quer copiar. Se liga só

Vamos criar um bucket dentro do volume rescue criado para podermos jogar nosse README.md nele. Vamos criar o bucket teste

ozone sh bucket create /rescue/teste

Após criado nosso bucket vamos usar o put para colocar o arquivo README.md que está em /ozone/README.md no Ozone no caminho /rescue/teste

Mas antes vamos ver o que o comando key nos oferece de opções usando o --help nele

ozone sh key --help

As seguintes opções são exibidas

Usage: ozone sh key put [-hV] [-r=<replicationFactor>] [-t=<replicationType>]
<value> <fileName>
creates or overwrites an existing key
<value> URI of the volume/bucket/key.
Ozone URI could start with o3:// or without prefix. URI may
contain the host/serviceId and port of the OM server. Both are
optional. If they are not specified it will be identified from
the config files.
<fileName> File to upload
-h, --help Show this help message and exit.
-r, --replication=<replicationFactor>
Replication factor of the new key. (use ONE or THREE) Default is
specified in the cluster-wide config.
-t, --type=<replicationType>
Replication type of the new key. (use RATIS or STAND_ALONE)
Default is specified in the cluster-wide config.
-V, --version Print version information and exit.

Vou deixar a surpresa para a hora que você copiar o arquivo, se você entendeu a arquitetura do Ozone citada no primeiro post sobre a ferramenta vai se ligar no que vai acontecer.

ozone sh key put /rescue/teste/README.md /ozone/README.md

A seguinte mensagem vai ser exibida abaixo:

INTERNAL_ERROR Allocated 0 blocks. Requested 1 blocks

Porque essa informação aparece?

Lembra que falamos que o Ozone tem uma replicação realizada pelo Apache Ratis que exige no mínimo 3 copias do bloco? Então, se a gente der uma olhada no ultimo log gerado…

[opc@whiterose ~]$ tail -300f /ozone/logs/ozone-opc-scm-whiterose.log
2020-11-26 01:07:30,777 [IPC Server handler 94 on default port 9863] WARN org.apache.hadoop.hdds.scm.pipeline.PipelinePlacementPolicy: Pipeline creation failed due to no sufficient healthy datanodes. Required 3. Found 1.
2020-11-26 01:07:30,777 [IPC Server handler 94 on default port 9863] WARN org.apache.hadoop.hdds.scm.block.BlockManagerImpl: Pipeline creation failed for type:RATIS factor:THREE. Datanodes may be used up.
org.apache.hadoop.hdds.scm.exceptions.SCMException: Pipeline creation failed due to no sufficient healthy datanodes. Required 3. Found 1.

Se liga, estamos trabalhando com um único datanode, ele pede que eu tenha 3, pois o replication factor padrão do RATIS é igual a 3.

Ai que entra o --help do comando key, lá no começo ele tem um parametro -r ou --replication onde você configura a replicação para ONE ou para THREE , sendo assim vamos mudar a replicação para 1 adicionando ao comando a sintaxe -r=ONE

ozone sh key put -r=ONE /rescue/teste/README.md /ozone/README.md

Pronto amigão seu arquivo está la dentro, vamos testar o cat lendo o conteúdo desse cara diretamente do Ozone?

ozone sh key cat /rescue/teste/README.md
Chammaaaaaa no cat dentro do Ozoneeee

Pois é amigão seu arquivo está dentro do Ozone e legível, dahora né?

Observações finais

Lembrando o que o ozone sh é uma interface linha de comando LOCAL, até tem como se conectar usando outros protocolos como o o3 e outros mas veremos isso mais pra frente.

Concluindo

O resto é com você pequeno Padawan, teste mais comandos, brinque pois você tem um Ozone seu pra dar aquele delete sem medo de ser feliz.

Nos próximos posts vamos ver como integrar o HDFS Client com o Ozone e fazer uso dos comandos que já conhecemos sem impacto e a integração com um Bucket S3 da Amazon.

Bem vindo ao futuro meu Brother, pelo menos hoje quando estou escrevendo é, vai saber quando você vai ler isso…

Deixe sua palminha ae…

Anselmo Borges
Rescue Point

--

--

Anselmo Borges
Rescue Point

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