Apache Spark definido

Apache Spark é uma estrutura de processamento de dados que pode executar rapidamente tarefas de processamento em conjuntos de dados muito grandes e também pode distribuir tarefas de processamento de dados em vários computadores, sozinho ou em conjunto com outras ferramentas de computação distribuída. Essas duas qualidades são fundamentais para os mundos do big data e do aprendizado de máquina, que exigem a mobilização de um enorme poder de computação para processar grandes armazenamentos de dados. O Spark também tira parte da carga de programação dessas tarefas dos ombros dos desenvolvedores com uma API fácil de usar que abstrai grande parte do trabalho pesado da computação distribuída e do processamento de big data.

O que é Spark em big data

Quando as pessoas falam sobre “big data”, geralmente se referem ao rápido crescimento de dados de todos os tipos – dados estruturados em tabelas de banco de dados, dados não estruturados em documentos comerciais e e-mails e dados semiestruturados em arquivos de log do sistema e páginas da web. Enquanto a análise de anos anteriores se concentrava em dados estruturados e girava em torno do data warehouse, a análise de hoje coleta insights de todos os tipos de dados e gira em torno do data lake. O Apache Spark foi desenvolvido especificamente para esse novo paradigma.

Desde seu início humilde no AMPLab na UC Berkeley em 2009, o Apache Spark se tornou uma das principais estruturas de processamento distribuído de big data do mundo. O Spark pode ser implantado de várias maneiras, fornece ligações nativas para as linguagens de programação Java, Scala, Python e R e oferece suporte a SQL, streaming de dados, aprendizado de máquina e processamento de gráficos. Você o encontrará usado por bancos, empresas de telecomunicações, empresas de jogos, governos e todos os grandes gigantes da tecnologia, como Apple, IBM, Meta e Microsoft.

Faísca RDD

No cerne do Apache Spark está o conceito de Resilient Distributed Dataset (RDD), uma abstração de programação que representa uma coleção imutável de objetos que podem ser divididos em um cluster de computação. As operações nos RDDs também podem ser divididas no cluster e executadas em um processo em lote paralelo, levando a um processamento paralelo rápido e escalonável. Apache Spark transforma os comandos de processamento de dados do usuário em um Gráfico Acíclico Direcionadoou DAG. O DAG é a camada de agendamento do Apache Spark; determina quais tarefas são executadas em quais nós e em que sequência.

RDDs podem ser criados a partir de arquivos de texto simples, bancos de dados SQL, armazenamentos NoSQL (como Cassandra e MongoDB), buckets Amazon S3 e muito mais. Grande parte da API Spark Core é construída sobre esse conceito RDD, permitindo a funcionalidade tradicional de mapeamento e redução, mas também fornecendo suporte integrado para união de conjuntos de dados, filtragem, amostragem e agregação.

O Spark funciona de forma distribuída, combinando um motorista processo central que divide um aplicativo Spark em tarefas e as distribui entre muitos executor processos que fazem o trabalho. Esses executores podem ser ampliados ou reduzidos conforme necessário para as necessidades do aplicativo.

Faísca SQL

Spark SQL tornou-se cada vez mais importante para o projeto Apache Spark. É a interface mais comumente usada pelos desenvolvedores atuais ao criar aplicativos. Spark SQL está focado no processamento de dados estruturados, usando uma abordagem de dataframe emprestada de R e Python (em Pandas). Mas, como o nome sugere, o Spark SQL também fornece uma interface compatível com SQL2003 para consulta de dados, trazendo o poder do Apache Spark para analistas e também para desenvolvedores.

Juntamente com o suporte SQL padrão, o Spark SQL fornece uma interface padrão para leitura e gravação em outros armazenamentos de dados, incluindo JSON, HDFS, Apache Hive, JDBC, Apache ORC e ​​Apache Parquet, todos com suporte imediato. Outros armazenamentos de dados populares — Apache Cassandra, MongoDB, Apache HBase e muitos outros — podem ser usados ​​extraindo conectores separados do ecossistema Spark Packages. O Spark SQL permite que funções definidas pelo usuário (UDFs) sejam usadas de forma transparente em consultas SQL.

Selecionar algumas colunas de um dataframe é tão simples quanto esta linha de código:

citiesDF.select(“name”, “pop”)

Usando a interface SQL, registramos o dataframe como uma tabela temporária, após a qual podemos emitir consultas SQL sobre ele:

citiesDF.createOrReplaceTempView(“cities”)
spark.sql(“SELECT name, pop FROM cities”)

Nos bastidores, o Apache Spark usa um otimizador de consulta chamado Catalyst que examina dados e consultas para produzir um plano de consulta eficiente para localidade de dados e computação que realizará os cálculos necessários em todo o cluster. Desde o Apache Spark 2.x, a interface Spark SQL de dataframes e conjuntos de dados (essencialmente um dataframe digitado que pode ser verificado em tempo de compilação quanto à correção e aproveitar mais memória e otimizações de computação em tempo de execução) tem sido a abordagem recomendada para desenvolvimento. A interface RDD ainda está disponível, mas é recomendada apenas se suas necessidades não puderem ser atendidas dentro do paradigma Spark SQL (como quando você precisa trabalhar em um nível inferior para extrair até a última gota de desempenho do sistema).

Spark MLlib e MLflow

O Apache Spark também reúne bibliotecas para aplicação de técnicas de aprendizado de máquina e análise de gráficos a dados em escala. MLlib inclui uma estrutura para criação de pipelines de aprendizado de máquina, permitindo fácil implementação de extração de recursos, seleções e transformações em qualquer conjunto de dados estruturado. MLlib vem com implementações distribuídas de algoritmos de clustering e classificação, como clustering k-means e florestas aleatórias que podem ser trocadas dentro e fora de pipelines personalizados com facilidade. Os modelos podem ser treinados por cientistas de dados no Apache Spark usando R ou Python, salvos usando MLlib e, em seguida, importados para um pipeline baseado em Java ou Scala para uso em produção.

Uma plataforma de código aberto para gerenciar o ciclo de vida do aprendizado de máquina, o MLflow não faz parte tecnicamente do projeto Apache Spark, mas também é um produto do Databricks e de outros membros da comunidade Apache Spark. A comunidade tem trabalhado na integração do MLflow com o Apache Spark para fornecer recursos de MLOps, como rastreamento de experimentos, registros de modelos, empacotamento e UDFs que podem ser facilmente importados para inferência na escala do Apache Spark e com instruções SQL tradicionais.

Streaming Estruturado

O Structured Streaming é uma API de alto nível que permite aos desenvolvedores criar dataframes e conjuntos de dados de streaming infinitos. A partir do Spark 3.0, o Structured Streaming é a forma recomendada de lidar com dados de streaming no Apache Spark, substituindo a abordagem anterior do Spark Streaming. O Spark Streaming (agora marcado como um componente legado) estava cheio de dificuldades para os desenvolvedores, especialmente ao lidar com agregações em tempo de evento e entrega tardia de mensagens.

Todas as consultas em fluxos estruturados passam pelo otimizador de consultas Catalyst e podem até ser executadas de maneira interativa, permitindo que os usuários executem consultas SQL em dados de streaming ao vivo. O suporte para mensagens atrasadas é fornecido por mensagens com marca d'água e três tipos suportados de técnicas de janelas: janelas em cascata, janelas deslizantes e janelas de tempo de comprimento variável com sessões.

No Spark 3.1 e posterior, você pode tratar streams como tabelas e tabelas como streams. A capacidade de combinar vários fluxos com uma ampla variedade de junções fluxo a fluxo semelhantes a SQL cria possibilidades poderosas de ingestão e transformação. Aqui está um exemplo simples de criação de uma tabela a partir de uma fonte de streaming:

val df = spark.readStream
  .format("rate")
  .option("rowsPerSecond", 20)
  .load()

df.writeStream
  .option("checkpointLocation", "checkpointPath")
  .toTable("streamingTable")

spark.read.table("myTable").show()

O streaming estruturado, por padrão, usa um esquema de microlotes para lidar com dados de streaming. Mas no Spark 2.3, a equipe do Apache Spark adicionou um modo de processamento contínuo de baixa latência ao streaming estruturado, permitindo lidar com respostas com latências impressionantes de até 1 ms e tornando-o muito mais competitivo com rivais como Apache Flink e Apache Beam. O Processamento Contínuo restringe você a operações semelhantes a mapas e de seleção e, embora ofereça suporte a consultas SQL em fluxos, atualmente não oferece suporte a agregações SQL. Além disso, embora o Spark 2.3 tenha chegado em 2018, a partir do Spark 3.3.2 em março de 2023, o Processamento Contínuo é ainda marcado como experimental.

O Streaming Estruturado é o futuro dos aplicativos de streaming com a plataforma Apache Spark, portanto, se você estiver criando um novo aplicativo de streaming, deverá usar o Streaming Estruturado. As APIs legadas do Spark Streaming continuarão a ter suporte, mas o projeto recomenda migrar para o Structured Streaming, pois o novo método torna a escrita e a manutenção do código de streaming muito mais suportável.

Lago Delta

Assim como o MLflow, o Delta Lake é tecnicamente um projeto separado do Apache Spark. Nos últimos anos, no entanto, Delta Lake tornou-se parte integrante do ecossistema Spark, formando o núcleo do que a Databricks chama de Arquitetura Lakehouse. Delta Lake aumenta os data lakes baseados em nuvem com transações ACID, semântica de consulta unificada para processamento em lote e fluxo e aplicação de esquema, eliminando efetivamente a necessidade de um data warehouse separado para usuários de BI. Histórico completo de auditoria e escalabilidade para lidar com exabytes de dados também fazem parte do pacote.

E usar o formato Delta Lake (construído sobre arquivos Parquet) no Apache Spark é tão simples quanto usar o delta formatar:

df = spark.readStream.format("rate").load()

stream = df 
  .writeStream
  .format("delta") 
  .option("checkpointLocation", "checkpointPath") 
  .start("deltaTable")

API Pandas no Spark

O padrão da indústria para manipulação e análise de dados em Python é a biblioteca Pandas. Com o Apache Spark 3.2, foi fornecida uma nova API que permite que uma grande proporção da API Pandas seja usada de forma transparente com o Spark. Agora os cientistas de dados podem simplesmente substituir as suas importações por import pyspark.pandas as pd e ter alguma certeza de que seu código continuará funcionando e também aproveitar as vantagens da execução de vários nós do Apache Spark. No momento, cerca de 80% da API Pandas está coberta, com uma meta de cobertura de 90% nos próximos lançamentos.

Executando o Apache Spark

Em um nível fundamental, um aplicativo Apache Spark consiste em dois componentes principais: um motoristaque converte o código do usuário em múltiplas tarefas que podem ser distribuídas entre nós de trabalho, e executores, que são executados nesses nós de trabalho e executam as tarefas atribuídas a eles. Alguma forma de gerenciador de cluster é necessária para mediar entre os dois.

Pronto para uso, o Apache Spark pode ser executado em um modo de cluster independente que simplesmente requer a estrutura Apache Spark e uma Java Virtual Machine em cada nó do cluster. No entanto, é mais provável que você queira aproveitar um sistema de gerenciamento de recursos ou de cluster mais robusto para cuidar da alocação de trabalhadores sob demanda para você.

Na empresa, isso historicamente significava executar no Hadoop YARN (YARN é como as distribuições Cloudera e Hortonworks executam trabalhos do Spark), mas à medida que o Hadoop se tornou menos arraigado, mais e mais empresas se voltaram para a implantação do Apache Spark no Kubernetes. Isso se refletiu nas versões Apache Spark 3.x, que melhoram a integração com o Kubernetes, incluindo a capacidade de definir modelos de pod para drivers e executores e usar agendadores personalizados, como o Volcano.

Se você procura uma solução gerenciada, as ofertas do Apache Spark podem ser encontradas em todas as três grandes nuvens: Amazon EMR, Azure HDInsight e Google Cloud Dataproc.

Plataforma Databricks Lakehouse

A Databricks, empresa que emprega os criadores do Apache Spark, adotou uma abordagem diferente de muitas outras empresas fundadas em produtos de código aberto da era do Big Data. Por muitos anos, a Databricks oferece um serviço de nuvem gerenciado abrangente que oferece clusters Apache Spark, suporte de streaming, desenvolvimento integrado de notebook baseado na Web e desempenho de E/S otimizado proprietário em uma distribuição Apache Spark padrão. Esta mistura de serviços gerenciados e profissionais transformou a Databricks em um gigante na área de Big Data, com uma avaliação estimada em US$ 38 bilhões em 2021. A plataforma Databricks Lakehouse está agora disponível em todos os três principais provedores de nuvem e está se tornando o de fato maneira como a maioria das pessoas interage com o Apache Spark.

Tutoriais do Apache Spark

Pronto para mergulhar e aprender Apache Spark? Recomendamos começar com o portal de aprendizagem Databricks, que fornecerá uma boa introdução à estrutura, embora seja ligeiramente tendencioso para a Plataforma Databricks. Para se aprofundar, sugerimos o Spark Workshop, que é um tour completo pelos recursos do Apache Spark através de lentes Scala. Alguns livros excelentes também estão disponíveis. Spark: The Definitive Guide é uma introdução maravilhosa escrita por dois mantenedores do Apache Spark. E High Performance Spark é um guia essencial para processar dados com Apache Spark em grandes escalas e com alto desempenho. Feliz aprendizado!