Dataflow é o serviço gerenciado do GCP para execução de pipelines Apache Beam. Processa dados em batch e streaming com auto-scaling automático de workers.

Nasceu do FlumeJava e MillWheel, tecnologias internas do Google. É a alternativa gerenciada ao Spark para pipelines de transformação em escala.

Apache Beam e Dataflow

Apache Beam é o SDK de programação: você escreve o pipeline em Python, Java ou Go. Dataflow é o runner que executa esse pipeline no GCP com workers gerenciados.

flowchart TD
    A["Código Beam - Python / Java / Go"] --> B[Dataflow Runner]
    B <--> C[Workers GCE]
    B --> D["GCS / BigQuery / Pub/Sub"]

Conceitos do modelo Beam

ConceitoO que é
PipelineGrafo de transformações
PCollectionColeção distribuída de dados (imutável)
PTransformTransformação aplicada a uma PCollection
ParDoTransformação elemento a elemento (equivale ao map)
GroupByKeyAgrupa elementos por chave
WindowingDivide stream em janelas temporais para agregações
WatermarkEstimativa de quando todos os dados de uma janela chegaram

Pipeline básico em Python

import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
 
options = PipelineOptions(
    runner="DataflowRunner",
    project="meu-projeto",
    region="us-central1",
    temp_location="gs://meu-bucket/temp",
    staging_location="gs://meu-bucket/staging",
)
 
with beam.Pipeline(options=options) as p:
    (
        p
        | "Ler GCS"       >> beam.io.ReadFromText("gs://meu-bucket/raw/*.csv")
        | "Parsear linha"  >> beam.Map(lambda linha: linha.split(","))
        | "Filtrar vazios" >> beam.Filter(lambda row: len(row) > 1)
        | "Formatar"       >> beam.Map(lambda row: {"id": row[0], "valor": row[1]})
        | "Escrever BQ"    >> beam.io.WriteToBigQuery(
            "meu-projeto:dataset.tabela",
            write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,
        )
    )

Batch vs Streaming

Batch

  • Fonte delimitada: GCS, BigQuery, arquivo local
  • Job roda até o fim e termina
  • Faturamento por horas de worker

Streaming (unbounded)

# Leitura do Pub/Sub
mensagens = (
    p
    | "Ler Pub/Sub" >> beam.io.ReadFromPubSub(topic="projects/proj/topics/meu-topico")
    | "Decodificar"  >> beam.Map(lambda m: json.loads(m.decode("utf-8")))
)
 
# Janela fixa de 5 minutos para agregação
janelado = (
    mensagens
    | "Janela 5min" >> beam.WindowInto(beam.window.FixedWindows(5 * 60))
    | "Contar"      >> beam.combiners.Count.PerKey()
)

Templates

Templates pré-compilam o pipeline e permitem execução sem código Python no ambiente de prod:

# Executar template do Google (GCS → BigQuery)
gcloud dataflow jobs run meu-job \
  --gcs-location gs://dataflow-templates/latest/GCS_Text_to_BigQuery \
  --region us-central1 \
  --parameters \
    javascriptTextTransformGcsPath=gs://meu-bucket/udf.js,\
    JSONPath=gs://meu-bucket/schema.json,\
    javascriptTextTransformFunctionName=transform,\
    outputTable=meu-projeto:dataset.tabela,\
    inputFilePattern=gs://meu-bucket/raw/*.csv,\
    bigQueryLoadingTemporaryDirectory=gs://meu-bucket/temp

Flex Templates (recomendado): pipeline empacotado como container Docker, mais flexível que Classic Templates.

Dataflow vs Spark (Dataproc)

DataflowDataproc (Spark)
SDKApache BeamPySpark / Scala Spark
GerenciamentoTotalmente serverlessCluster gerenciado (ainda existe)
Curva de aprendizadoMaior (modelo Beam)Menor (PySpark familiar)
StreamingNativo e robustoSpark Structured Streaming
CustoPor worker/horaCluster sempre ligado (ou Dataproc Serverless)
Ideal paraPipelines novos, streaming complexoMigrar workloads Spark existentes

Integração com o ecossistema

  • Cloud Composer: DataflowCreatePythonJobOperator dispara jobs Dataflow como task Airflow
  • Cloud Storage: fonte e destino padrão para arquivos
  • BigQuery: destino final para resultados de transformação
  • Pub/Sub: fonte para pipelines de streaming

Ver também: gcp | gcp-bigquery | gcp-cloud-storage | gcp-cloud-composer | gcp-boas-praticas | pipeline-de-dados | big-data