Apache Spark

Open Source 2024 Trending Mature Processamento

Engine unificado para analytics em larga escala com processamento em memória

O que é Apache Spark?

Apache Spark é um engine unificado para analytics em larga escala que fornece APIs de alto nível em Java, Scala, Python e R, além de um engine otimizado que suporta grafos de execução gerais. Ele também suporta um conjunto rico de ferramentas de alto nível incluindo Spark SQL para SQL e processamento de dados estruturados, pandas API no Spark para processamento pandas, MLlib para machine learning, GraphX para processamento de grafos, e Structured Streaming para processamento incremental e stream.

História

O Apache Spark foi desenvolvido inicialmente na UC Berkeley em 2009 como parte do projeto AMPLab. Foi open-sourced em 2010 e doado para a Apache Software Foundation em 2013. O projeto se tornou um Apache Top-Level Project em 2014. Spark foi criado para superar as limitações do MapReduce, especialmente para workloads iterativos e interativos.

Arquitetura

Spark utiliza uma arquitetura master-worker onde o driver program coordena a execução através de um cluster manager (como YARN, Mesos ou Kubernetes). Os dados são representados como Resilient Distributed Datasets (RDDs) ou DataFrames/Datasets, que são distribuídos através dos nós do cluster. O engine utiliza lazy evaluation e otimizações como o Catalyst optimizer para melhorar performance.

Vantagens

  • Performance: Processamento em memória até 100x mais rápido que MapReduce
  • Facilidade de uso: APIs simples em múltiplas linguagens
  • Unificação: Suporte a batch, streaming, ML e graph processing
  • Compatibilidade: Roda em Hadoop, Mesos, Kubernetes ou standalone
  • Otimizações: Catalyst optimizer e Tungsten execution engine
  • Ecossistema: Integração com diversas fontes de dados

Desvantagens

  • Consumo de memória: Requer mais RAM que soluções tradicionais
  • Complexidade: Tuning de performance pode ser desafiador
  • Latência: Não ideal para processamento de baixa latência
  • Overhead: Pode ser excessivo para workloads pequenos
  • Debugging: Troubleshooting em clusters distribuídos é complexo

Principais Recursos

🚀 Spark Core

Engine fundamental com RDDs, task scheduling, memory management e fault recovery.

📊 Spark SQL

Módulo para trabalhar com dados estruturados usando SQL ou DataFrame API.

🌊 Structured Streaming

Processamento de stream escalável e fault-tolerant baseado no Spark SQL engine.

🤖 MLlib

Biblioteca de machine learning escalável com algoritmos comuns e utilitários.

🕸️ GraphX

API para processamento de grafos e computação paralela de grafos.

🐼 Pandas API

API compatível com pandas para processamento distribuído de DataFrames.

Especificações Técnicas

Versão Atual 3.5.0
Linguagens Suportadas Scala, Java, Python, R, SQL
Cluster Managers YARN, Mesos, Kubernetes, Standalone
Formatos de Dados Parquet, JSON, CSV, Avro, ORC, Delta Lake
Sistemas de Armazenamento HDFS, S3, Azure Blob, GCS, Cassandra, HBase
Requisitos Mínimos Java 8+, 1GB RAM por executor

Casos de Uso

🔄 ETL e Data Processing

Transformação de grandes volumes de dados com performance superior ao MapReduce tradicional. Ideal para pipelines de dados complexos que requerem múltiplas transformações.

📈 Analytics Interativo

Consultas ad-hoc em grandes datasets com resposta em segundos. Perfeito para data scientists e analistas que precisam explorar dados rapidamente.

🌊 Stream Processing

Processamento de dados em tempo real de fontes como Kafka, Kinesis ou TCP sockets. Ideal para detecção de fraudes, monitoramento e alertas.

🤖 Machine Learning

Treinamento de modelos ML em larga escala com MLlib. Suporte a algoritmos distribuídos para classificação, regressão, clustering e filtragem colaborativa.

🕸️ Graph Analytics

Análise de redes sociais, detecção de comunidades e algoritmos de grafos como PageRank usando GraphX.

Quando Usar Apache Spark

✅ Recomendado para:
  • Processamento de dados em larga escala (TB/PB)
  • Workloads que se beneficiam de processamento em memória
  • Pipelines ETL complexos com múltiplas transformações
  • Analytics interativo e exploração de dados
  • Machine learning distribuído
  • Processamento unificado de batch e streaming
  • Migração de workloads MapReduce
⚠️ Considere alternativas se:
  • Você precisa de latência sub-segundo (use Flink ou Storm)
  • Recursos de memória são muito limitados
  • Workloads são muito simples (overhead desnecessário)
  • Você precisa apenas de SQL analytics (considere Presto/Trino)
  • Processamento de stream com garantias exactly-once críticas

Exemplos Práticos

Instalação

# Download e instalação
wget https://archive.apache.org/dist/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz
tar -xzf spark-3.5.0-bin-hadoop3.tgz
export SPARK_HOME=/path/to/spark-3.5.0-bin-hadoop3
export PATH=$PATH:$SPARK_HOME/bin

# Instalação via pip (PySpark)
pip install pyspark

# Instalação via conda
conda install pyspark

Configuração Básica

# spark-defaults.conf
spark.master                     yarn
spark.driver.memory              2g
spark.executor.memory            4g
spark.executor.cores             2
spark.sql.adaptive.enabled       true
spark.sql.adaptive.coalescePartitions.enabled true
spark.serializer                 org.apache.spark.serializer.KryoSerializer

Exemplo Python (PySpark)

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, avg

# Criar SparkSession
spark = SparkSession.builder \
    .appName("ExemploSpark") \
    .config("spark.sql.adaptive.enabled", "true") \
    .getOrCreate()

# Ler dados
df = spark.read.parquet("s3://bucket/dados.parquet")

# Transformações
resultado = df.filter(col("idade") > 18) \
    .groupBy("categoria") \
    .agg(count("*").alias("total"), 
         avg("valor").alias("valor_medio")) \
    .orderBy("total", ascending=False)

# Ação
resultado.show()

# Salvar resultado
resultado.write.mode("overwrite").parquet("s3://bucket/resultado.parquet")

spark.stop()

Exemplo Scala

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

object ExemploSpark {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("ExemploSpark")
      .config("spark.sql.adaptive.enabled", "true")
      .getOrCreate()
    
    import spark.implicits._
    
    // Ler dados
    val df = spark.read.parquet("s3://bucket/dados.parquet")
    
    // Transformações e agregações
    val resultado = df
      .filter($"idade" > 18)
      .groupBy("categoria")
      .agg(count("*").alias("total"), 
           avg("valor").alias("valor_medio"))
      .orderBy($"total".desc)
    
    resultado.show()
    
    spark.stop()
  }
}

Streaming Example

# Structured Streaming com Kafka
from pyspark.sql import SparkSession
from pyspark.sql.functions import from_json, col
from pyspark.sql.types import StructType, StructField, StringType, IntegerType

spark = SparkSession.builder \
    .appName("StreamingExample") \
    .getOrCreate()

# Schema dos dados
schema = StructType([
    StructField("user_id", StringType(), True),
    StructField("event_type", StringType(), True),
    StructField("timestamp", StringType(), True),
    StructField("value", IntegerType(), True)
])

# Ler stream do Kafka
df = spark.readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "events") \
    .load()

# Parse JSON e transformações
parsed_df = df.select(
    from_json(col("value").cast("string"), schema).alias("data")
).select("data.*")

# Agregação em janela de tempo
windowed_counts = parsed_df \
    .groupBy(
        window(col("timestamp"), "1 minute"),
        col("event_type")
    ) \
    .count()

# Output para console
query = windowed_counts.writeStream \
    .outputMode("update") \
    .format("console") \
    .trigger(processingTime='30 seconds') \
    .start()

query.awaitTermination()

Tutoriais Relacionados

Comparações

Alternativas Similares

Tecnologia Performance Facilidade de Uso Comunidade Licença
Apache Spark Excelente Alta Muito Ativa Apache 2.0
Apache Flink Excelente Média Ativa Apache 2.0
Hadoop MapReduce Média Baixa Ativa Apache 2.0
Dask Boa Alta Ativa BSD
Ray Excelente Boa Crescente Apache 2.0

Spark vs Flink

Apache Spark
  • Melhor para batch processing
  • Ecossistema mais maduro
  • APIs mais simples
  • Melhor integração com ML
  • Maior comunidade
Apache Flink
  • Melhor para stream processing
  • Menor latência
  • Exactly-once guarantees
  • Melhor para event-time processing
  • Backpressure nativo
📊 Quick Facts
Versão Atual: 3.5.0
Licença: Apache 2.0
Linguagem: Scala, Java
Primeira Release: 2014
Última Atualização: Dezembro 2024
🔄 Tecnologias Relacionadas
💼 Conteúdo Patrocinado

Espaço disponível para parceiros

Anuncie Aqui