Migrar da computação clássica para a computação sem servidor

Migre as suas cargas de trabalho da computação clássica para a computação serverless. A computação serverless faz a gestão automaticamente do provisionamento, escalonamento, atualizações de runtime e otimização.

A maioria das cargas de trabalho clássicas pode migrar com alterações mínimas ou nenhumas no código. Esta página foca-se nessas cargas de trabalho. Algumas funcionalidades, como df.cache, ainda não são suportadas em serverless, mas não exigirão alterações de código assim que estiverem disponíveis. Certas cargas de trabalho que dependem de blocos de notas R ou Scala requerem recursos de computação clássicos e não poderão migrar para sem servidor. Para uma lista completa das limitações atuais, veja Limitações de computação sem servidor.

Etapas de migração

Para migrar as suas cargas de trabalho da computação clássica para a computação serverless, siga estes passos:

  1. Verifique os pré-requisitos: Verifique se o seu espaço de trabalho, redes e acesso ao armazenamento na cloud cumprem os requisitos. Consulte Antes de começar.
  2. Atualizar código: Faça quaisquer alterações necessárias no código e configuração. Veja Atualizar o seu código.
  3. Teste as suas tarefas de processamento: Valide a compatibilidade e correção antes de fazer a transição. Veja Teste as suas cargas de trabalho.
  4. Escolha um modo de desempenho: Selecione o modo de desempenho que melhor se adequa às suas necessidades de carga de trabalho. Veja Escolher um modo de desempenho.
  5. Migre em fases: Implemente o serverless de forma incremental, começando com cargas de trabalho novas e de baixo risco. Ver Migrar em fases.
  6. Monitorizar custos: Monitorizar o consumo de DBUs serverless e configurar alertas. Ver Monitorizar custos.

Antes de começar

Antes de começares a migrar, podes precisar de atualizar algumas configurações legadas no teu espaço de trabalho.

Pré-requisito Action Detalhes
O Workspace está ativado para o Unity Catalog Migrar da Metastore Hive se necessário Atualize um espaço de trabalho Azure Databricks para o Unity Catalog
Rede configurada Substituir o peering da VPC por NCCs, Private Link ou por regras de firewall Arquitetura de rede em plano de computação sem servidor
Acesso ao armazenamento na nuvem Substituir padrões de acesso a dados legados por localizações externas do Unity Catalog Ligar ao armazenamento de objetos na cloud utilizando o Unity Catalog

Confirma que o teu espaço de trabalho está numa região suportada.

Atualize o seu código

As secções seguintes listam o código e as alterações de configuração necessárias para tornar as suas cargas de trabalho compatíveis com serverless.

Acesso a dados

Os padrões de acesso a dados legados não são suportados em ambientes *serverless*. Atualize o seu código para usar o Unity Catalog em vez disso.

Padrão clássico Substituição sem servidor Detalhes
Caminhos DBFS (dbfs:/...) Volumes do catálogo Unity O que são volumes do Catálogo Unity?
Tabelas do Metastore Hive Tabelas do Catálogo Unity (ou HMS Federation) Atualize um espaço de trabalho Azure Databricks para o Unity Catalog
Credenciais da conta de armazenamento Localizações externas do Unity Catalog Ligar ao armazenamento de objetos na cloud utilizando o Unity Catalog
JARs JDBC personalizados Federação Lakehouse O que é federação de consultas?

Advertência

O acesso ao DBFS é limitado em ambientes sem servidor. Atualize todos os caminhos dbfs:/ para os volumes do Catálogo Unity antes de migrar. Para mais informações, consulte Migrar ficheiros armazenados no DBFS.

Exemplo: Substituir os caminhos do DBFS e as referências do Hive Metastore
# Classic
df = spark.read.csv("dbfs:/mnt/datalake/data.csv", header=True)
df.write.parquet("dbfs:/mnt/output/results")
df = spark.table("my_database.my_table")

# Serverless
df = spark.read.csv("/Volumes/main/sales/raw_data/data.csv", header=True)
df.write.parquet("/Volumes/main/analytics/output/results")
df = spark.table("main.my_database.my_table")  # three-level namespace

APIs e código

Certas APIs e padrões de código não são suportados em serverless. Consulte esta tabela para ver se o seu código precisa de ser atualizado.

Padrão clássico Substituição sem servidor Detalhes
APIs RDD (sc.parallelize, rdd.map) DataFrame APIs Compare o Spark Connect com o Spark Classic
df.cache(), df.persist() Remover chamadas de cache Limitações de computação sem servidor
spark.sparkContext, sqlContext Use spark (SparkSession) diretamente Compare o Spark Connect com o Spark Classic
Variáveis do Hive (${var}) SQL DECLARE VARIABLE ou Python f-strings DECLARE VARIABLE
Configurações Spark não suportadas Remove as configurações não suportadas. Serverless otimiza automaticamente a maioria das definições. Configurar propriedades do Spark para notebooks e tarefas sem servidor
Exemplo: Substituir operações RDD por DataFrames
from pyspark.sql import functions as F

# sc.parallelize + rdd.map
# Classic:  rdd = sc.parallelize([1, 2, 3]); rdd.map(lambda x: x * 2).collect()
df = spark.createDataFrame([(1,), (2,), (3,)], ["value"])
result = df.select((F.col("value") * 2).alias("value")).collect()

# rdd.flatMap
# Classic:  sc.parallelize(["hello world"]).flatMap(lambda l: l.split(" ")).collect()
df = spark.createDataFrame([("hello world",)], ["line"])
words = df.select(F.explode(F.split("line", " ")).alias("word")).collect()

# rdd.groupByKey
# Classic:  rdd.groupByKey().mapValues(list).collect()
df = spark.createDataFrame([("a", 1), ("b", 2), ("a", 3)], ["key", "value"])
grouped = df.groupBy("key").agg(F.collect_list("value").alias("values")).collect()

# rdd.mapPartitions → applyInPandas
import pandas as pd
def process_group(pdf: pd.DataFrame) -> pd.DataFrame:
    return pd.DataFrame({"total": [pdf["id"].sum()]})
result = (spark.range(100).repartition(4)
    .groupBy(F.spark_partition_id())
    .applyInPandas(process_group, schema="total long").collect())

# sc.textFile → spark.read.text
df = spark.read.text("/Volumes/catalog/schema/volume/file.txt")
Exemplo: Substituir o SparkContext e a cache
from pyspark.sql.functions import broadcast

# sc.broadcast → broadcast join
result = main_df.join(broadcast(lookup_df), "key")

# sc.accumulator → DataFrame aggregation
total = df.agg(F.sum("amount")).collect()[0][0]

# sqlContext.sql → spark.sql
result = spark.sql("SELECT * FROM main.db.table")

# df.cache() → remove caching calls
# Materialize expensive intermediate results to Delta as a workaround:
df = spark.read.parquet(path)
result = df.filter("status = 'active'")
expensive_df.write.format("delta").mode("overwrite").saveAsTable("main.scratch.temp")
result = spark.table("main.scratch.temp")

Bibliotecas e ambientes

Pode gerir bibliotecas e ambientes a nível de workspace usando ambientes base e a nível de notebook usando o ambiente serverless do notebook.

Padrão clássico Substituição sem servidor Detalhes
Scripts de inicialização Ambientes sem servidor Configurar o ambiente sem servidor
Bibliotecas com âmbito de cluster Bibliotecas com âmbito de notebook ou de ambiente Configurar o ambiente sem servidor
Bibliotecas Maven/JAR Suporte para tarefas JAR; PyPI para notebooks Tarefa JAR para trabalhos
Contentores Docker Ambientes serverless para necessidades de bibliotecas Configurar o ambiente sem servidor

Fixar pacotes Python em requirements.txt para criar ambientes reproduzíveis. Veja Especificar versões de pacotes Python.

Serviço de streaming

Cargas de trabalho de streaming são suportadas em serverless, mas certos gatilhos não são suportados. Atualiza o teu código para usar os gatilhos suportados.

Gatilho de faísca Suportado Notes
Trigger.AvailableNow() Sim Recomendado
Trigger.Once() Sim Isso está obsoleto. Utilize Trigger.AvailableNow() em substituição.
Trigger.ProcessingTime(interval) No Devoluções INFINITE_STREAMING_TRIGGER_NOT_SUPPORTED
Trigger.Continuous(interval) No Em vez disso, utilize o modo contínuo das Lakeflow Spark Declarative Pipelines.
Padrão (não definido .trigger()) No Omissão de .trigger() implica o padrão ProcessingTime("0 seconds"), que não é suportado em ambientes serverless. Define .trigger(availableNow=True) sempre explicitamente.

Para streaming contínuo, migre para os Pipelines Declarativos Spark em modo contínuo ou use tarefas de agendamento contínuo com AvailableNow. Para fontes grandes, defina maxFilesPerTrigger ou maxBytesPerTrigger para evitar erros de falta de memória.

Exemplo: Corrigir gatilhos de streaming
# Classic (not supported on serverless — default trigger is ProcessingTime)
query = df.writeStream.format("delta").outputMode("append").start()

# Serverless (explicit AvailableNow trigger)
query = (df.writeStream.format("delta").outputMode("append")
    .trigger(availableNow=True)
    .option("checkpointLocation", checkpoint_path)
    .start(output_path))
query.awaitTermination()

# With OOM prevention for large sources
query = (spark.readStream.format("delta")
    .option("maxFilesPerTrigger", 100)
    .option("maxBytesPerTrigger", "10g")
    .load(input_path)
    .writeStream.format("delta")
    .trigger(availableNow=True)
    .option("checkpointLocation", checkpoint_path)
    .start(output_path))

Testa as tuas cargas de trabalho

  1. Teste rápido de compatibilidade: Execute a carga de trabalho em computação clássica com modo de acesso Standard e Databricks Runtime 14.3 ou superior. Se a execução for bem-sucedida, a carga de trabalho pode migrar para serverless sem quaisquer alterações de código.
  2. Comparação A/B (recomendada para produção): Execute a mesma tarefa nos ambientes clássico (controlo) e sem servidor (experimento). Tabelas de saída do diff e verifique a correção. Iterar até que os resultados coincidam.
  3. Configurações temporárias: Pode definir temporariamente as configurações suportadas do Spark durante os testes. Remova-os quando estiver estável.

Escolha um modo de performance

Os trabalhos e pipelines sem servidor suportam dois modos de desempenho: padrão e otimizado para performance. O modo de desempenho que escolhes depende das tuas necessidades de carga de trabalho.

Mode Availability Startup Melhor para
Standard Empregos, Oleodutos Declarativos Lakeflow Spark 4-6 minutos Lote sensível ao custo
Otimizado para desempenho Cadernos, Empregos, Canodutos Declarativos Lakeflow Spark Segundos Interativo, sensível à latência

Migrar em fases

  1. Novas cargas de trabalho: Inicia todos os novos cadernos e trabalhos em serverless.
  2. Cargas de trabalho de baixo risco: migrar cargas de trabalho PySpark/SQL já em modo de acesso padrão e Databricks Runtime 14.3 ou superior.
  3. Cargas de trabalho complexas: Migrar cargas de trabalho que necessitam de alterações de código (reescritas RDD, atualizações de DBFS, correções de triggers).
  4. Cargas de trabalho restantes: Revise periodicamente à medida que as capacidades se expandem.

Monitorizar os custos

A faturação serverless baseia-se no consumo da DBU, não no tempo de funcionamento do cluster. Valide expectativas de custos com cargas de trabalho representativas antes de migrar em escala. Para monitorizar os custos serverless com ferramentas e estratégias, consulte Monitorizar o custo da computação serverless.

Recursos adicionais

Pode também consultar os seguintes artigos do blogue para mais informações: