External Storages com Unity Catalog

Anselmo Borges
Rescue Point
Published in
9 min readNov 19, 2022
Esse post é a prova que as coisas evoluem, rs

Geralmente eu dou um intervalo considerável entre meus posts, mas ontem numa reunião com a Databricks quinzenal que temos, o Arquiteto deles elogiou o meu post anterior e soltou a braba “você vai ficar chocado em ver a facilidade de fazer o mesmo processo usando o Unity Catalog”. Acabou a reunião falei “a é?” (Curiosão, rs)

Vamô vê essa parada ae

Primeiramente vou explicar de forma Reduzida 2 coisas, Data Mesh e onde o Unity Catalog entra nisso.

Data Mesh

A “buzzword” do momento no mundo dos dados. O mundo dos dados sempre foi centralizado desde quando não existia a cloud, os servidores eram adquiridos pelo time de TI, administrados por TI e o custo deles ficando a maioria das vezes em TI, sem passar os gastos para as áreas que realmente lucram com o uso deles. A migração do mundo on premisses pra cloud na maioria das empresas foi quase um CTRL+C e CTRL+V disso, deixando uma administração de serviços centralizada e por sua vez os dados de forma centralizada, tanto em armazenamento como no acesso a eles também.

O Data Mesh propõe uma descentralização desses dados trabalhando com o dados por domínio, mas ainda assim propondo uma governança centralizada (A parte lógica da coisa). Por exemplo, numa instituição financeira, o time de cartões ser um domínio, o time de marketing outro domínio, conta corrente outro e assim por diante. Porém com cada um responsável por esse dado, o controle fica mais fino, o custo fica mais visível, o uso de tecnologias e serviços mais enxuto, pois cada uma das áreas pode ter um data stack de ferramentas somente dele, uns usando mais coisas e outros não.

Existe um site que é a bíblia desse assunto caso tenha interesse.

É uma metodologia um pouco extensa, o objetivo é entregar o dado como um produto que pode ser consumido e gerado por domínios em curtas palavras.

Tá, mas onde o Unity Catalog da Databricks entra nisso?

Lembra que falei que hoje é tudo centralizado? Então considere um único workspace de Databricks (seja DEV/QA/PROD) pra empresa inteira? É exatamente isso que a maioria das empresas tem hoje e com a vinda do DataMesh onde cada domínio será responsável pelo seu dado, também será responsável pela ferramenta que gera os dados, no caso o Databricks, tendo um Workspace para cada Dominio se ele for necessário para esse Stack.

Ai você fala: “Mas vai ficar uma loucura isso, quem vai gerenciar todos esses Workspaces, usuários, acessos a recursos, clusters, dados?”

Entendo sua preocupação pois foi o mesmo pensamento que eu tive no início, mas o que o Unity Catalog sugere é um gerenciamento centralizado dos Workspace usados nos N domínios de sua empresa.

Unity Catalog

A idéia aqui é um overview rápido sobre Unity Catalog até pra você entenda o assunto central do artigo que é a entrega do External Storage (ADLS) para o Databricks feito por ele. Acho que esse desenho explica mais ou menos o funcionamento, é relativamente simples.

Como funcionava antes e como passa a ser com o Unity Catalog

O desenho acima explica o gerenciamento centralizado do Unity Catalog sobre os Workspaces 1 e 2 controlando acesso, gerenciando usuários e a parte que interessa pra esse post, OS EXTERNAL STORAGES.

O exemplo mostra que posso gerenciar meus MetaStores de forma centralizada também

Se liga que louco, eu crio um service principal na minha cloud, com acesso completo a um Storage Account (Azure), entrego ele pro Unity Catalog e ele fala, OK, deixa que eu distribuo os acessos pros usuários e ambientes que eu tenho aqui. Por exemplo posso criar um grupo que só lê os arquivos e outro que pode ter privilégio total, não pela Azure e sim pelo Unity Catalog, sem precisar abrir chamado pro seu time de Cloud por exemplo, seu Databricks admin ou seu próprio sistema de chamados pode fazer isso via API do Databricks. Foda né?

Falei mano, valeu a pena o teste, eu já vinha estudando o Unity mas não tinha usado.

Outro ponto que estou querendo ver se funciona, se posso ter meu Databricks principal da Azure que é o meu caso e colocar metastores ou external locations da AWS (S3) e do Google (GCS) no mesmo Unity (ainda estou vendo se funciona).

Seria um lance incrível por exemplo que tenho dados gerenciados no Google Analitycs e processados pelo BigQuery do Google, esses dados ficam num GCS deles e trazidos pra Azure diariamente, eu poderia ou ter uma metastore ou external storages entre clouds como poderia ter uma parte do domínio de dados no Google com um Databricks lá e gerenciado pelo mesmo Unity catalog, usando features como o Delta Sharing para compartilhar esses dados entre workspaces das 2 clouds.

Irado né? Eu dou umas brisadas mesmo, rs.

Se quiser ver mais como funciona segue um material de introdução ao Unity Catalog.

Tem também um vídeo bem explicativo pra você ver que não tem nenhum bicho de 7 cabeças.

Demo explicando o Unity Catalog

Agora que te dei um banho de loja de Data Mesh e Unity Catalog, vamos ver como consigo entregar esse ADLS pro Databricks.

Vamos à prática

Nesse exemplo abaixo eu tenho um Unity Catalog e 2 Workspaces Databricks chamados ADB001 e ADB002 conforme a imagem abaixo.

2 workspaces Databricks como disse

O primeiro ponto aqui é criar um MetaStore, mas…

O que seria um Metastore?

Quando eu não tenho um MetaStore linkado a um Workspace pelo Unity Catalog, no seu Workspace a aba “Data” aparece mais ou menos assim:

Exibição da aba DATA sem o Unity Catalog, é aquela carinha tradicional que você conhece.

O Unity catalog usa um Metastore, um local que você define no seu Storage Account Azure que vai centralizar as informações dos seus catálogos, schemas (databases se você preferir chamar assim) e tabelas desses schemas. Onde você pode (ou não) compartilhar com um ou mais schemas, assim esses dados ficam compartilhados entre um ou mais Workspaces. Vamos fazer na prática isso de brinde.

Voltando pro Azure

Vou criar um novo storage account no Azure chamado “testeunity”, criar um container chamado “teste” e criar uma pastinha lá chamada “pasta2” (só pra efeitos didáticos, nem precisaria).

Criando o Storage Account

Criando um Azure Databricks Access Connector

Esse cara é novo e bem diferente do que foi o post de ontem, esse é um app registration que é criado pra fazer a integração entre o Databricks e os Serviços da Azure mais especificamente o Storage Account. Ele funciona mais ou menos conforme imagem abaixo:

Ele é o user intermediário basicamente.

Vamos criar esse cara e dar privilégio de Storage Blob Contributor pra ele no IAM (eu ja tinha criado um mas vou excluir e criar de novo pra mostrar como e feito).

No final eu copio o Resource ID dele pois vou precisar dele jájá.

Agora vou dar privilegio no Storage account pra esse cara.

Eu tenho que ir no Storage Account e lá coloco o privilegio no IAM

Agora que concluímos a parte do Azure vamos pro Databricks, mas antes vou mostrar pra vocês que ainda não funciona, pra você não dizer que foi bruxaria.

O comando debaixo apontando para o novo Storage Account

Vamos lá no Unity Catalog cadastrar esse cara agora para entrar no Unity catalog você loga nesse link abaixo com sua conta admin Azure Databricks (A conta que você usou pra criar seu Workspace Databricks)

Logado na console, você vai lá em DATA > Create MetaStore e um Wizard será exibido igual o gif abaixo.

Criei o metastore e atribui ao workspace (esse errinho era o outro que tinha)

A primeira vez que fiz eu falei: “car****, então ele já aparece esse storage pro Workspace?” não se emocione como eu, ainda não é isso, estamos falando de Metastore ainda.

Atribuindo o Metastore a um Workspace

Eu vou atribuir o Metastore ao meu Workspace “ADB001” e se liga como vai ser exibido meu campo Data, no fim do GIF vou lá no “ADB002” e te provar que lá continua igual era antes.

Olha ae você já vendo a diferença!

Deu pra entender né? Agora vou mostrar como colocar finalmente o External Location ADLS pra usar. Eu tenho um outro Storage account chamado “sarescue001” e dentro dele um container chamado “dados”, criei uma pastinha lá chamada pasta1, só pra dizer que coloquei algo lá.

O nosso external location vai ser nesse Storage account

Tenho uma service principal (app registration) chamada “srv_rescue” e dei privilégios de storage blob contributor pra ela, conforme GIF abaixo:

Teoricamente essa parte final de ACL nem precisava, mas na duvida, rs.

O que vou fazer? Dentro do Workspace “ADB001" vou criar uma service principal com o app registration “srv_rescue” (você vai ver que eu poderia usar o “adbcrescue” que usamos para o Metastore, mas pra deixar os acessos bem segmentados, criei um só pra esse External Metastore).

Cadastrando a service principal para uso no Workspace ADB001

O ponto aqui é que deixo de ter aqueles spark configs chumbados no notebook (igual o post anterior), não preciso colocar mais no spark config (o que seria o próximo post que traria uma versão mais otimizada da autorização OAUTH2 durante a subida do cluster). É tudo cadastrado no Metastore e boas, seguro, gerenciável de forma visual e com administração centralizada.

Agora vamos adicionar finalmente o External Storage com essa service principal que cadastramos.

Criando o External Storage

Com nosso carinha criado vou fazer alguns testes:

  1. Tentar listar o conteúdo do External Storage com dbutils.fs.ls.
  2. Criando uma temporary view (biritas_temp) apontando para um csv do External Storage.
  3. Criando um catalogo chamado catalogo01 apontando pro External Storage.
  4. Criar um database chamado anselmo apontando o location pra esse External Storage.
  5. Criar uma tabela delta (biritas) lendo a temp view biritas_temp como origem nesse database anselmo.
Criando as parada tudo no External Storage

Viu que criei os caras apontando para esse external storage, note também que quando crio catalogo e database tenho a opção de adicionar a location apontando para um external storage ou posso não colocar nada, assim em vez dele usar o sarescue001 que eu teria, ele usa o testeunity.

Vamos validar lá no Storage account se tudo foi criado.

Note que como criei a tabela biritas como managed table, ele gera um nome de table como um hashid.

Se precisar desse notebook pra adaptar pro seu cenário, segue abaixo.

Considerações finais

O que quis mostrar com esse post, são as facilidades que o Unity catalog traz para o gerenciamento do meu lake, principalmente com essa idéia de Data Mesh chegando, sinceramente eu não vi ainda como colocar External Storages de outras clouds, o desenho da documentação vendia isso ou entendi errado, rs. Descobrindo faço um post aqui.

Eu não precisei criar notebooks, Azure Key Vault e outras peripércias do post anterior, foi bem mais simples e visual fazendo por aqui, nem precisei setar spark configs nem no notebook nem na inicialização do cluster, o Unity catalog se vira com isso.

De brinde

Se liga esse ultimo GIF Bonus, você vai ver que no workspace ADB002 o catalogo01 nem o database anselmo aparecem, mas vou linkar o metastore com ele e você verá a mágica.

E como num passe de mágica o Catalogo e database aparecem em ADB002

Te fez entender? Ajuda ae, dá a palminha ae, compartilha o o artigo, o post do Linkedin pra chegar em mais pessoas que precisam desse material, perdi 7 horas de um sábado fazendo isso que nem tem nada em português a respeito.

Dá essa moral ae?

Abraço e 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.