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
| Conceito | O que é |
|---|---|
| Pipeline | Grafo de transformações |
| PCollection | Coleção distribuída de dados (imutável) |
| PTransform | Transformação aplicada a uma PCollection |
| ParDo | Transformação elemento a elemento (equivale ao map) |
| GroupByKey | Agrupa elementos por chave |
| Windowing | Divide stream em janelas temporais para agregações |
| Watermark | Estimativa 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/tempFlex Templates (recomendado): pipeline empacotado como container Docker, mais flexível que Classic Templates.
Dataflow vs Spark (Dataproc)
| Dataflow | Dataproc (Spark) | |
|---|---|---|
| SDK | Apache Beam | PySpark / Scala Spark |
| Gerenciamento | Totalmente serverless | Cluster gerenciado (ainda existe) |
| Curva de aprendizado | Maior (modelo Beam) | Menor (PySpark familiar) |
| Streaming | Nativo e robusto | Spark Structured Streaming |
| Custo | Por worker/hora | Cluster sempre ligado (ou Dataproc Serverless) |
| Ideal para | Pipelines novos, streaming complexo | Migrar workloads Spark existentes |
Integração com o ecossistema
- Cloud Composer:
DataflowCreatePythonJobOperatordispara 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