Apache Beam vs Spark em 2026: Pipelines Unificados e Perguntas de Entrevista
Comparação detalhada entre Apache Beam e Spark para pipelines de dados em 2026. Portabilidade, windowing, performance e perguntas técnicas de entrevista.

Apache Beam e Spark representam duas abordagens fundamentalmente diferentes para processamento de dados em larga escala. Beam 2.76 (agosto 2026) e Spark 4.2 (julho 2026) lidam com cargas de trabalho batch e streaming, mas suas filosofias de design divergem: Beam abstrai o motor de execução enquanto Spark fornece um runtime fortemente integrado.
Escolher Beam quando a portabilidade entre runners (Dataflow, Flink, Spark) é importante ou ao usar Google Cloud Dataflow. Escolher Spark para clusters autogerenciados, Databricks, ou integração ML com MLlib.
Modelo de Portabilidade do Beam vs Motor Unificado do Spark
Apache Beam separa o modelo de programação da execução. Uma única definição de pipeline executa no Google Cloud Dataflow, Apache Flink, Apache Spark, ou outros runners sem alterações no código. Essa abstração vem do SDK do Beam que gera uma representação portável do pipeline que qualquer runner compatível interpreta.
Spark 4.2 adota a abordagem oposta. A API DataFrame, Structured Streaming e MLlib compartilham o mesmo otimizador Catalyst e o motor de execução Tungsten. Esse acoplamento forte permite otimizações como Adaptive Query Execution que ajusta os planos em tempo de execução baseado em estatísticas reais dos dados.
# beam_pipeline.py
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
# O mesmo código executa no Dataflow, Flink, ou Spark runner
options = PipelineOptions([
'--runner=DataflowRunner', # Trocar para FlinkRunner ou SparkRunner
'--project=my-project',
'--region=us-central1',
'--temp_location=gs://my-bucket/temp'
])
with beam.Pipeline(options=options) as pipeline:
(pipeline
| 'ReadEvents' >> beam.io.ReadFromPubSub(topic='projects/p/topics/events')
| 'ParseJSON' >> beam.Map(lambda x: json.loads(x))
| 'FilterValid' >> beam.Filter(lambda e: e.get('status') == 'valid')
| 'WindowByMinute' >> beam.WindowInto(beam.window.FixedWindows(60))
| 'CountPerWindow' >> beam.combiners.Count.Globally()
| 'WriteToBQ' >> beam.io.WriteToBigQuery('project:dataset.table'))O equivalente Spark está diretamente vinculado ao runtime Spark:
# spark_streaming.py
from pyspark.sql import SparkSession
from pyspark.sql.functions import from_json, col, window
spark = SparkSession.builder \
.appName("EventProcessing") \
.config("spark.sql.adaptive.enabled", "true") \
.getOrCreate()
# Spark 4.2: Modo ANSI habilitado por padrão, verificação de tipos mais rigorosa
events = spark.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "broker:9092") \
.option("subscribe", "events") \
.load()
processed = events \
.select(from_json(col("value").cast("string"), schema).alias("data")) \
.filter(col("data.status") == "valid") \
.groupBy(window(col("data.timestamp"), "1 minute")) \
.count()
processed.writeStream \
.format("bigquery") \
.option("table", "project.dataset.table") \
.outputMode("append") \
.start()A portabilidade do Beam permite arquiteturas cloud-agnósticas mas adiciona uma camada de tradução. A execução direta do Spark geralmente mostra menor latência para operações equivalentes no mesmo hardware.
Windowing e Processamento Event-Time Comparados
Ambos os frameworks lidam com semântica event-time, mas suas APIs refletem heranças diferentes. O modelo de windowing do Beam vem do Dataflow Model paper (2015), tratando windows como elementos de pipeline de primeira classe. Spark adaptou seu windowing para Structured Streaming, integrando-o com a API DataFrame.
| Funcionalidade | Beam 2.76 | Spark 4.2 |
|---|---|---|
| Fixed windows | FixedWindows(duration) | window(col, duration) |
| Sliding windows | SlidingWindows(size, period) | window(col, size, period) |
| Session windows | Sessions(gap) | Não nativo (flatMapGroupsWithState) |
| Custom windows | Subclasse WindowFn | Limitado |
| Tratamento de dados atrasados | Triggers integrados | Atrasos de watermark |
| Latência permitida | Configuração por window | Watermark global |
As session windows revelam melhor a diferença. Beam trata as sessões como uma estratégia de windowing nativa:
# beam_sessions.py
from apache_beam import window
# 30 minutos de gap de sessão, aceita 1 hora de dados atrasados
windowed = (
events
| 'SessionWindow' >> beam.WindowInto(
window.Sessions(30 * 60), # 30 min de gap fecha a sessão
trigger=beam.trigger.AfterWatermark(
early=beam.trigger.AfterProcessingTime(60),
late=beam.trigger.AfterCount(1)
),
allowed_lateness=3600, # Aceita dados até 1 hora atrasados
accumulation_mode=beam.trigger.AccumulationMode.ACCUMULATING
)
)Spark requer processamento stateful para sessões:
# spark_sessions.py
from pyspark.sql.streaming import GroupState, GroupStateTimeout
def update_session(key, events, state: GroupState):
# Gerenciamento manual de sessões com a API de estado
session_data = state.getOption() or {"count": 0, "start": None, "end": None}
for event in events:
ts = event.timestamp
if session_data["end"] and (ts - session_data["end"]).seconds > 1800:
# Gap excedeu 30 min, emitir sessão anterior
yield session_data
session_data = {"count": 0, "start": ts, "end": ts}
session_data["count"] += 1
session_data["end"] = ts
if not session_data["start"]:
session_data["start"] = ts
state.update(session_data)
state.setTimeoutDuration(30 * 60 * 1000) # 30 min timeout
# Spark 4.2 Arbitrary State API v2
result = events \
.groupByKey(lambda e: e.user_id) \
.flatMapGroupsWithState(
update_session,
outputMode="append",
stateType=session_schema,
timeoutConf=GroupStateTimeout.ProcessingTimeTimeout
)Para preparação de entrevistas sobre esses tópicos, consultar o módulo de Perguntas de entrevista Apache Beam e Dataflow.
Performance: Dados de Benchmark 2026
Comparações diretas requerem configuração cuidadosa já que Beam executa sobre Spark como uma opção de runner. A comparação relevante é Beam-on-Dataflow vs Spark nativo.
Os benchmarks recentes da Databricks e Google Cloud mostram:
| Carga de trabalho | Spark 4.2 (Databricks) | Beam 2.76 (Dataflow) | Notas |
|---|---|---|---|
| Batch ETL (1TB Parquet) | 4.2 min | 5.1 min | Vantagem do motor Photon do Spark |
| Streaming (100K eventos/seg) | 45ms p99 latência | 120ms p99 latência | Overhead de autoscaling do Dataflow |
| Escritas exactly-once | Nativo | Nativo | Ambos suportam desde 2024 |
| Custo (carga sustentada) | $0.12/GB processado | $0.08/GB processado | Preços Dataflow Flex |
Os ganhos de performance do Spark 4.2 vêm de várias funcionalidades:
- Modo ANSI por padrão: semântica SQL mais rigorosa detecta erros mais cedo
- Tipo de dados VARIANT: tratamento nativo de dados semi-estruturados
- Adaptive Query Execution: otimização do plano em tempo de execução
- Suporte Java 21: virtual threads reduzem overhead
Beam 2.76 contra-ataca com:
- Suporte Flink 2.0 runner: streaming stateful de nível produção
- Persistência de offsets CDC: DebeziumIO FileSystemOffsetRetainer
- Integração ADK: suporte do Google Agent Development Kit no SDK Python
Pronto para mandar bem nas entrevistas de Data Engineering?
Pratique com nossos simuladores interativos, flashcards e testes tecnicos.
Perguntas de Entrevista Comuns: Beam vs Spark
Entrevistas técnicas para posições de data engineering frequentemente comparam esses frameworks. Estas são as perguntas que aparecem nas entrevistas de 2026, com a profundidade de resposta esperada.
P1: Quando escolher Beam em vez de Spark nativo?
Pontos de resposta esperados:
- Deployments multi-cloud ou híbridos onde o código do pipeline deve executar sem modificações
- Ambientes Google Cloud onde Dataflow fornece infraestrutura gerenciada
- Semântica event-time complexa requerendo session windows ou triggers personalizados
- Equipes com experiência existente em Beam vinda de background em Dataflow
Resposta red flag: "Beam é sempre melhor porque é portável." A portabilidade tem custos de overhead.
P2: Como a abstração do runner do Beam afeta o debugging?
Pontos de resposta esperados:
- Stack traces referenciam tanto o SDK do Beam quanto a implementação do runner
- Otimizações específicas do runner podem se comportar diferentemente (checkpoints do Flink vs checkpoints do Spark)
- A API de Metrics fornece monitoramento unificado, mas os dashboards dos runners mostram detalhes diferentes
- Testar com DirectRunner antes de fazer deploy no runner de produção
P3: Explicar a semântica exactly-once em ambos os frameworks.
Resposta esperada:
# Beam: exactly-once via garantias do runner
# Dataflow fornece exactly-once para sources e sinks
# O SDK lida com deduplicação e coordenação de checkpoints
with beam.Pipeline() as p:
(p
| beam.io.ReadFromPubSub(subscription='...') # Leitura exactly-once
| beam.Map(process)
| beam.io.WriteToBigQuery(...) # Escrita exactly-once com retries
)
# Spark: exactly-once via checkpointing e sinks idempotentes
spark.readStream \
.format("kafka") \
.load() \
.writeStream \
.option("checkpointLocation", "/checkpoint") # Recuperação de estado
.foreachBatch(idempotent_write) # Deduplicação a nível de aplicação
.start()Para mais tópicos de entrevista sobre streaming, consultar o módulo PySpark.
P4: Como migrar um job batch Spark para Beam?
Essa pergunta testa a compreensão de ambas as APIs. Pontos-chave:
- Mapear operações DataFrame para PCollections e transforms
- Substituir
spark.readpelos conectores I/O apropriados do Beam - Converter UDFs para funções
beam.Mapoubeam.ParDo - Lidar com particionamento diferentemente (
Reshuffledo Beam vsrepartitiondo Spark) - Testar com DirectRunner antes de fazer deploy no runner de produção
Escolhendo a Ferramenta Certa: Matriz de Decisão
A escolha depende mais do contexto organizacional do que das capacidades técnicas. Ambos os frameworks lidam com a maioria das cargas de trabalho de data engineering de forma competente.
| Fator | Favorece Beam | Favorece Spark |
|---|---|---|
| Provedor cloud | Google Cloud | AWS EMR, Databricks, on-prem |
| Expertise da equipe | Experiência existente em Dataflow | Habilidades existentes em Spark/PySpark |
| Integração ML | Limitada (ferramentas separadas) | MLlib, Spark ML |
| Análise interativa | Não projetado para isso | Spark SQL, notebooks |
| Session windows | Suporte nativo | Gerenciamento manual de estado |
| Modelo de custos | Pay-per-use (Dataflow) | Provisionamento de cluster |
| Vendor lock-in | Menor (múltiplos runners) | Maior (código específico de Spark) |
Para decisões sobre padrões ETL/ELT, considerar o volume de dados e os requisitos de latência antes de selecionar um framework.
Arquitetura Real: Abordagem Híbrida
Muitas organizações utilizam ambos os frameworks. Um padrão comum:
[Ingestão Streaming] [Processamento Batch] [Treinamento ML]
| | |
Beam/Dataflow Spark no Databricks Spark MLlib
| | |
v v v
BigQuery <----- dbt -----> Delta Lake -----> Model RegistryBeam gerencia a ingestão streaming onde o autoscaling do Dataflow combina com os padrões de tráfego. Spark processa cargas de trabalho batch onde a economia de clusters favorece computação sustentada. Ambos alimentam um data warehouse unificado.
Essa arquitetura aparece no tutorial Apache Spark com detalhes de implementação.
Comece a praticar!
Teste seus conhecimentos com nossos simuladores de entrevista e testes tecnicos.
Pontos-Chave para a Seleção Beam vs Spark
- Beam 2.76 fornece portabilidade de runners no Dataflow, Flink 2.0 e Spark, trocando performance por flexibilidade de deployment
- Spark 4.2 oferece integração mais forte entre SQL, streaming e cargas de trabalho ML com funcionalidades como tipos VARIANT e Adaptive Query Execution
- Session windows e triggers complexos favorecem o modelo de windowing nativo do Beam
- Performance batch em hardware equivalente geralmente favorece Spark graças à otimização Catalyst/Tungsten
- Perguntas de entrevista focam em trade-offs em vez de declarar um framework superior
- Arquiteturas híbridas utilizando ambos os frameworks são comuns em ambientes de produção
- A comparação de custos depende dos padrões de carga de trabalho: preços por GB do Dataflow vs provisionamento de cluster Spark
Você saberia encontrar o bug em Data Engineering?
Um trecho real, um bug escondido, uma tentativa por dia. Sem conta para testar.

Escrito por
Anthony Fillion-MailletFundador da SharpSkill
Desenvolvedor fullstack há mais de 10 anos. Dirige a SharpSkill e responde por tudo o que é publicado aqui.
Atualizado em 10 de setembro de 2026
Tags
Compartilhar
Artigos relacionados

Top 25 Perguntas de Entrevista para Engenharia de Dados em 2026
Guia completo com as 25 perguntas mais relevantes para entrevistas de engenharia de dados em 2026. Inclui SQL, Spark, Kafka, ETL/ELT, modelagem de dados e design de pipelines.

Apache Kafka para Engenheiros de Dados: Particionamento, Consumer Groups e Pipelines de Streaming
Guia completo de Apache Kafka para engenharia de dados: arquitetura KRaft, estrategias de particionamento, consumer groups, CDC com Debezium, exactly-once semantics, Share Groups e perguntas de entrevista com exemplos praticos em Python.

Apache Flink em 2026: Processamento de Streams, Event Time e Perguntas de Entrevista
Guia completo sobre Apache Flink 2.3 para processamento de streams em tempo real. Watermarks, janelas, gerenciamento de estado e preparação para entrevistas de data engineering.