Dataproc é o serviço gerenciado de Apache Hadoop e Apache Spark do GCP. Permite executar workloads Spark, Hive, Flink e outros componentes do ecossistema Hadoop sem gerenciar a infraestrutura de cluster.

É a escolha principal para migrar workloads Spark existentes para a GCP, ou para times que já dominam PySpark e não precisam do modelo de programação do Dataflow (Apache Beam).

Dataproc vs Dataflow

DataprocDataflow
SDKPySpark / Scala SparkApache Beam
Workloads existentesMigração diretaReescrita necessária
Curva de aprendizadoMenor (PySpark familiar)Maior (modelo Beam)
StreamingSpark Structured StreamingNativo e robusto
GerenciamentoCluster gerenciado ou ServerlessTotalmente serverless
Ideal paraMigrar Spark existente, Hive, PrestoPipelines novos, streaming complexo

Modos de execução

Clusters gerenciados

Cluster de VMs com master e workers. Criado sob demanda e destruído após o job para minimizar custo:

# Criar cluster efêmero
gcloud dataproc clusters create meu-cluster \
  --region=us-central1 \
  --num-workers=4 \
  --worker-machine-type=n1-standard-4 \
  --image-version=2.1-debian11
 
# Submeter job PySpark
gcloud dataproc jobs submit pyspark gs://meu-bucket/jobs/meu_job.py \
  --cluster=meu-cluster \
  --region=us-central1 \
  -- --input=gs://meu-bucket/raw/ --output=gs://meu-bucket/processed/
 
# Destruir cluster após uso
gcloud dataproc clusters delete meu-cluster --region=us-central1

Dataproc Serverless

Executa jobs Spark sem criar ou gerenciar cluster. O GCP aloca recursos automaticamente e cobra apenas pela duração do job:

gcloud dataproc batches submit pyspark gs://meu-bucket/jobs/meu_job.py \
  --region=us-central1 \
  --deps-bucket=gs://meu-bucket/deps \
  -- --input=gs://meu-bucket/raw/ --output=gs://meu-bucket/processed/

Dataproc Serverless é o modo recomendado para novos jobs batch sem necessidade de sessão interativa.

Job PySpark típico

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
import argparse
 
parser = argparse.ArgumentParser()
parser.add_argument("--input",  required=True)
parser.add_argument("--output", required=True)
args = parser.parse_args()
 
spark = SparkSession.builder.appName("meu-job").getOrCreate()
 
df = (
    spark.read.parquet(args.input)
    .filter(F.col("status") == "ativo")
    .withColumn("ano_mes", F.date_format("data_criacao", "yyyy-MM"))
    .groupBy("ano_mes", "regiao")
    .agg(
        F.count("*").alias("total"),
        F.sum("valor").alias("receita"),
    )
)
 
df.write.mode("overwrite").parquet(args.output)
 
spark.stop()

Componentes do ecossistema suportados

ComponenteUso
Apache SparkProcessamento batch e streaming em memória
Apache HiveSQL sobre dados no GCS/HDFS
Apache FlinkStreaming com baixa latência
Presto / TrinoSQL analítico interativo e federado
Jupyter NotebooksAnálise interativa via Component Gateway

Integração com o ecossistema GCP

GCS como sistema de arquivos: Dataproc usa o conector gs:// nativamente, substituindo o HDFS local. Dados ficam no GCS mesmo após o cluster ser destruído.

Metastore: usar o Dataproc Metastore (Hive Metastore gerenciado) para compartilhar esquemas de tabelas entre clusters e com o BigQuery.

BigQuery Connector: lê e escreve tabelas BigQuery diretamente do Spark sem exportar para GCS:

df = (
    spark.read.format("bigquery")
    .option("table", "meu-projeto.dataset.tabela")
    .load()
)
 
df.write.format("bigquery") \
    .option("table", "meu-projeto.dataset.resultado") \
    .mode("overwrite") \
    .save()

Cloud Composer: operadores DataprocCreateClusterOperator, DataprocSubmitJobOperator e DataprocDeleteClusterOperator permitem orquestrar o ciclo completo (criar, executar, destruir) como um DAG Airflow.

from airflow.providers.google.cloud.operators.dataproc import (
    DataprocCreateClusterOperator,
    DataprocSubmitJobOperator,
    DataprocDeleteClusterOperator,
)
 
criar   = DataprocCreateClusterOperator(task_id="criar_cluster",   ...)
executar = DataprocSubmitJobOperator(task_id="executar_job", ...)
destruir = DataprocDeleteClusterOperator(task_id="destruir_cluster", ...)
 
criar >> executar >> destruir

Boas práticas

  • Clusters efêmeros: criar o cluster, executar o job e destruir imediatamente. Clusters ociosos são o principal gerador de custo desnecessário.
  • Separar compute de storage: manter todos os dados no GCS, não no HDFS local do cluster.
  • Dataproc Serverless primeiro: para novos jobs batch, preferir Serverless antes de provisionar clusters gerenciados.
  • Autoscaling: ativar autoscaling policies em clusters de longa duração para ajustar o número de workers conforme a carga.
  • Preemptible workers: usar VMs preemptíveis (70% mais baratas) para workers secundários em jobs tolerantes a falha.

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

Spark: spark | spark-arquitetura | spark-apis | spark-sql | spark-performance | spark-troubleshooting | spark-streaming