Escrito por Jamuarê de Almeida Strauss e Hamilton Francisco Culik,
5 minutos de leitura
Azure Databricks: Primeiros Passos
Confira alguns exemplos de desafios que solucionamos utilizando o Databricks.
Databricks é uma plataforma para desenvolvimento, análise e soluções de Big Data com processamentos escaláveis. Atualmente com suporte para Python, Scala, R, Java e SQL, ele permite um desenvolvimento colaborativo entre os vários membros de uma equipe. Sua interface é composta de notebooks, similares aos do Google Colab ou Jupyter Notebook.
Cada membro poderia desenvolver em uma célula diferente, até mesmo linguagens diferentes de modo independente ou integrado ao que está sendo produzido pelos outros. Tudo vai depender das necessidades do projeto.
Com sistema baseado em Apache Spark, ele dispensa do usuário toda a parte de configurações. Sendo necessário apenas dizer quais versões do Spark e do Scala que se pretende usar, bem como quais serão as características do servidor. Tudo isso feito em uma interface bem intuitiva.
O Apache Spark é uma engine multi-linguagem para processamento de big data de forma paralela e distribuída. O Spark trabalha direto na memória ao invés de unidades de disco, resultando em uma velocidade 100x maior quando comparado ao Hadoop, por exemplo.
Com relação a sua estrutura, o Spark é dividido em:
*Spark Core: núcleo da plataforma, é responsável pelo gerenciamento de memória, recuperação de falhas, agendamentos, distribuição, monitoramento dos jobs e interação com o sistema de armazenamento.
*Spark SQL: permite executar querys dentro de programas Spark aproveitando do conhecimento que o usuário já possui em SQL
Exemplo:
results = spark.sql(“SELECT * FROM TABLE1”)
* Spark Streaming: é uma API que permite o processamento de dados em tempo real. Trabalha tanto com batch quanto com streaming de dados. Ele discretiza os dados em pequenos pacotes de informação inseridos em um fluxo contínuo (Discretized Stream).
* MLliB – biblioteca para aprendizado de máquina com diferentes algoritmos pré-definidos para classificação por regressão, recomendação, agrupamento e também contém módulos para transformações de recursos, construções de pipeline, avaliação de modelos, álgebra linear distribuída e estatística.
* GraphX – biblioteca para processamento de grafos e computação paralela de grafos.
A nossa aplicação técnica
+++ Contextualizando nosso ambiente e desafios
O Azure Data Lake Gen 2 é um serviço de armazenamento e análise baseado em nuvem que é otimizado para grandes cargas de trabalho de dados. Ele combina a escalabilidade e flexibilidade do Azure Data Lake Storage com as capacidades de segurança e governança do Azure Active Directory, tornando-o uma plataforma poderosa para armazenamento e análise de grandes conjuntos de dados.
Uma forma de usar o Azure Data Lake Gen 2 é em conjunto com o conceito de uma “zona de aterrissagem”. Uma zona de aterrissagem é uma área designada no data lake onde os dados crus não processados são ingeridos e armazenados pela primeira vez. Estes dados podem então ser movidos para outras partes do data lake, tais como uma zona curada, onde são limpos, transformados e organizados para uso por processos de análise e relatórios posteriores.
O Azure Data Factory pode ser usado para orquestrar o movimento de dados entre a zona de aterrissagem e outras partes do data lake. O Data Factory é um serviço de integração e orquestração baseado em nuvem que pode ser usado para automatizar e gerenciar o movimento e a transformação dos dados. Pode ser usado para criar cargas que especificam fluxos entre diferentes depósitos, assim como as transformações que devem ser aplicadas em cada etapa.
A utilização do Data Factory para orquestrar o movimento de dados entre a zona de aterrissagem e outras partes do data lake permite um processo mais eficiente e automatizado para o gerenciamento e análise de grandes conjuntos de informações. Também permite às organizações implementar uma estratégia de governança e segurança que garanta que somente usuários autorizados tenham acesso aos dados sensíveis.
Embora o Azure Data Factory possa ser usado para criar arquivos de parquet para armazenamento, o ADF é intrinsecamente limitado em seu escopo de construção destes parquets para retenção mais avançadas de dados, como retenção por algum valor de coluna ou que necessite de transformações mais avançadas. O uso do Databricks permite a criação de tabelas Delta, que oferecem várias vantagens sobre os arquivos de parquet tradicionais, e todo o leque de técnicas de programação, além do uso do Spark, para total liberdade de transformação e gestão dessas tabelas.
Onde o Databricks e um ambiente Spark nos ajuda
+++Tabelas Delta e retenção por valores em colunas
As tabelas Delta são um novo tipo de tabela em Databricks que são otimizadas para cargas de dados rápidas, eficientes e escaláveis. Elas combinam o desempenho e a confiabilidade de um Data warehouse com a flexibilidade e escalabilidade de um Data lake. Uma vantagem chave das tabelas Delta é que elas suportam transações ACID (Atômicas, Consistentes, Isoladas e Duráveis), que garantem que os dados sejam sempre consistentes e precisos, mesmo quando vários usuários estão acessando e atualizando os dados simultaneamente. As tabelas Delta também suportam o versionamento dos dados, o que permite o fácil retrocesso para versões anteriores dos dados, se necessário.
Essa grande flexibilidade dos dados também se manifesta nos meios de utilização do Databricks, dando a liberdade de utilização tanto por meio da sintaxe do Spark SQL, como também do Python, e nos permitindo a utilizar a linguagem melhor adaptada para o momento. Um exemplo de um uso principal do Databricks para nós se dá pelo controle de retenção de dados por meio de alguma coluna chave, nos permitindo um tratamento de Upsert, como por exemplo por meio do trecho de código abaixo:
Neste exemplo, o comando MERGE é usado para atualizar a localizacao.tabela com dados da tmp_tabela. O comando especifica que quando um registro correspondente é encontrado com base na coluna id, o registro existente em localizacao.tabela deve ser atualizado com os valores de tmp_tabela. Se nenhum registro correspondente for encontrado, um novo registro é inserido em localizacao.tabela com os valores de tmp_tabela, nos dando um controle fino sobre linhas individuais, que é impossível replicar no Azure Data Factory sem a utilização de Dataflows.
+++Arquivos inconsistentes no formato Excel
Outro desafio que enfrentamos pôde ser resolvido ao utilizar o Databricks para carregar diversos arquivos Excel com colunas diferentes, onde foi utilizado uma definição de schema predeterminado como parâmetro de carregamento dos dados no cluster. Isto garantiu que todos os arquivos Excel tivessem a mesma estrutura e pudessem ser facilmente carregados como uma complexa tabela Delta, acelerando acessos e consultas e nos conferindo diversas vantagens para a retenção destes dados.
Além disso, devido à grande quantidade de dados em vários arquivos Excel, utilizamos o parâmetro maxRowsInMemory=20 durante o carregamento para permitir que nossos nós trabalhadores pudessem carregar e tratar os arquivos corretamente, com suas limitações de memória. Isto nos permitiu carregar apenas um número limitado de linhas de cada arquivo, garantindo que nossos nós trabalhadores pudessem lidar com a carga de trabalho sem nenhum problema, abaixo, temos o exemplo completo do carregamento desses dados em Excel.
+++Grande flexibilidade acelerando desenvolvimento
Por fim, um último exemplo de aplicação de grande utilidade para as nossas necessidades se deu por meio das várias capacidades de um Notebook para um Cluster Databricks, tendo como um exemplo dessas a habilidade de utilizar livremente comandos SQL em conjunto com comandos em Pyspark para manipular quaisqueres fontes de dados, podendo realizar tarefas de scripting fáceis e rápidas com Python e gerar valores relevantes, para então utilizar seus resultados dentro de um comando SQL por meio da sintaxe do spark.sql().
Abaixo, um exemplo básico demonstrando uma sintaxe que fora frequentemente usada para controlar a forma de retenção de dados em várias de nossas tabelas, combinando uma variável criada anteriormente via Python que foi então utilizada em um comando seguinte de SQL.
Outra grande vantagem que foi utilizada do ambiente em Notebook é advinda das suas capacidades de monitoramento, gravando os resultados das execuções individualmente, além das saídas de cada uma das células. No exemplo anterior, salvamos o resultado do comando de exclusão executado por meio do spark.sql() para então rodarmos o comando display() e termos uma forma direta de associar a quantidade de registros que foram excluídos naquela execução, que serão gravados nos registros de execução do nosso cluster e poderão ser auditados e verificados a qualquer momento.