Desenvolvendo uma aplicação batch testável no Apache Spark
Introdução Na minha experiência, desenvolver uma aplicação Spark com código testável não costuma ser tarefa fácil para muitos profissionais de dados. Não pretendo discutir os motivos disso. Nesta postagem, apresento o que funciona para mim quando preciso desenvolver uma aplicação Spark. Este texto é composto de duas seções. Na primeira, TDD - Desenvolvendo código a partir de testes, mostro um exemplo de como desenvolver um código modular, de fácil leitura e compreensão e, consequentemente, fácil de manter. Na última seção, Mais que produzir um código bonito, é sobre construir conhecimento organizacional, enfatizo os benefícios de usar TDD para desenvolver projetos em dados, suportado tanto pela minha experiência, quanto por publicações de outros blogs e livros. ...
Por que tomar cuidado com o uso de DISTINCT?
Se existe a menor desconfiança da possibilidade de um DataFrame apresentar linhas duplicadas, o melhor é garantir que elas serão removidas antes de carregar os dados no data lake do que arriscar, certo? Certo. O problema é que muitas vezes essa “garantia” vem com um custo, usando a cláusula DISTINCT em todos possíveis DataFrames, mesmo quando não precisamos dele. Acredito que o uso indiscriminado dessa cláusula é um evento canônico na vida de todo profissional de dados, e que vale a pena ser esclarecido para que novos profissionais não cometam esse equívoco de forma inconsciente. ...
Adicionando a descrição de um job em uma aplicação Apache Spark
O objetivo da descrição de um job em uma aplicação Apache Spark é facilitar a localização de oportunidades de otimização. Utilizando o método setJobGroup corretamente, é possível agilizar a busca por etapas candidatas à melhoria na Spark UI e relacioná-las com o código da aplicação. Neste curto texto, apresento como fazer isso. O problema Suponha que gostaríamos de realizar o benchmark para uma aplicação simples envolvendo apenas a leitura e ordenação dos dados,onde desejamos avaliar o desempenho da sua execução em função do número de partições. O código inicial é apresentado a seguir: ...
O processo executor e sua memória
Na postagem anterior, abordamos alguns conceitos relacionados à estrutura de uma aplicação Spark Nesta publicação, entrarei em detalhes a respeito da memória do executor partindo ideia de tarefa, comum ao texto anterior. Na primeira seção, “Tarefas e partições”, veremos a relação entre tarefas, partições e o hardware para introduzir o tema. Em seguida, veremos em “*Memória On-Heap e Off-Heap”, onde discutimos sobre as diferentes regiões de memória de um executor, com maior foco na memória On-Heap. Nesta seção, teremos tópicos como “Memória reservada, memória unificada e memória de usuário” para entrar em maiores detalhes de como a memória On-Heap é dividida e utilizada, e em “Memória unificada: armazenamento e execução” trataremos sobre a região de memória mais importante para a pessoa desenvolvedora. ...
Arquitetura de uma aplicação Apache Spark
Nesta postagem, gostaria de apresentar mais uma abordagem para ajudar na compreensão de conceitos relacionados ao Apache Spark. Muito do que é apresentado aqui encontra-se em livros, blogs (como este), cursos pagos e vídeo-aulas no Youtube. Apenas compilei parte deste material e adicionei algumas coisas que julgo importantes com base na minha experiência. Este texto foi dividido em três grandes seções. Na primeira seção, “Uma visão geral dos componentes do Apache Spark”, abordo de forma ampla os componentes básicos do Apache Spark e suas respectivas responsabilidades, bem como descrevo a anatomia de uma aplicação do Apache Spark. Na segunda seção, trato dos conceitos de “Ações, transformações e avaliação preguiçosa”, que são fundamentais para o entendimento da execução de uma aplicação. Por fim, concluo com um resumo dos pontos apresentados nas sessões anteriores. ...