Partilhar via


Migrar dados do MongoDB para uma conta do Azure Cosmos DB para MongoDB usando o Azure Databricks

APLICA-SE A: MongoDB

Este guia de migração faz parte de uma série sobre a migração de bancos de dados do MongoDB para a API do Azure Cosmos DB para MongoDB. As etapas críticas de migração são pré-migração, migração e pós-migração, conforme mostrado abaixo.

Diagrama de etapas de migração

Migração de dados usando o Azure Databricks

O Azure Databricks é uma oferta de plataforma como serviço (PaaS) para o Apache Spark. Ele oferece uma maneira de fazer migrações offline em um conjunto de dados de grande escala. Você pode usar o Azure Databricks para fazer uma migração offline de bancos de dados do MongoDB para o Azure Cosmos DB para MongoDB.

Neste tutorial, vai aprender a:

  • Provisionar um cluster do Azure Databricks

  • Adicionar dependências

  • Criar e executar notebook Scala ou Python

  • Otimize o desempenho da migração

  • Solucionar problemas de erros de limitação de taxa que podem ser observados durante a migração

Pré-requisitos

Para concluir este tutorial, precisa de:

Provisionar um cluster do Azure Databricks

Você pode seguir as instruções para provisionar um cluster do Azure Databricks. Recomendamos selecionar Databricks runtime version 7.6, que suporta o Spark 3.0.

Diagrama de criação de novo cluster databricks.

Adicionar dependências

Adicione a biblioteca MongoDB Connector for Spark ao cluster para se conectar aos pontos de extremidade nativos do MongoDB e do Azure Cosmos DB para MongoDB. No cluster, selecione Bibliotecas>Instalar Novo>Maven e adicione org.mongodb.spark:mongo-spark-connector_2.12:3.0.1 coordenadas Maven.

Diagrama de adição de dependências de cluster databricks.

Selecione Instalar e reinicie o cluster quando a instalação estiver concluída.

Nota

Certifique-se de reiniciar o cluster Databricks após a instalação da biblioteca MongoDB Connector for Spark.

Depois disso, você pode criar um bloco de anotações Scala ou Python para migração.

Criar bloco de anotações Scala para migração

Crie um bloco de anotações Scala no Databricks. Certifique-se de inserir os valores corretos para as variáveis antes de executar o seguinte código:

import com.mongodb.spark._
import com.mongodb.spark.config._
import org.apache.spark._
import org.apache.spark.sql._

var sourceConnectionString = "mongodb://<USERNAME>:<PASSWORD>@<HOST>:<PORT>/<AUTHDB>"
var sourceDb = "<DB NAME>"
var sourceCollection =  "<COLLECTIONNAME>"
var targetConnectionString = "mongodb://<ACCOUNTNAME>:<PASSWORD>@<ACCOUNTNAME>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@<ACCOUNTNAME>@"
var targetDb = "<DB NAME>"
var targetCollection =  "<COLLECTIONNAME>"

val readConfig = ReadConfig(Map(
  "spark.mongodb.input.uri" -> sourceConnectionString,
  "spark.mongodb.input.database" -> sourceDb,
  "spark.mongodb.input.collection" -> sourceCollection,
))

val writeConfig = WriteConfig(Map(
  "spark.mongodb.output.uri" -> targetConnectionString,
  "spark.mongodb.output.database" -> targetDb,
  "spark.mongodb.output.collection" -> targetCollection,
  "spark.mongodb.output.maxBatchSize" -> "8000"  
))

val sparkSession = SparkSession
  .builder()
  .appName("Data transfer using spark")
  .getOrCreate()

val customRdd = MongoSpark.load(sparkSession, readConfig)

MongoSpark.save(customRdd, writeConfig)

Criar bloco de anotações Python para migração

Crie um Notebook Python no Databricks. Certifique-se de inserir os valores corretos para as variáveis antes de executar o seguinte código:

from pyspark.sql import SparkSession

sourceConnectionString = "mongodb://<USERNAME>:<PASSWORD>@<HOST>:<PORT>/<AUTHDB>"
sourceDb = "<DB NAME>"
sourceCollection =  "<COLLECTIONNAME>"
targetConnectionString = "mongodb://<ACCOUNTNAME>:<PASSWORD>@<ACCOUNTNAME>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@<ACCOUNTNAME>@"
targetDb = "<DB NAME>"
targetCollection =  "<COLLECTIONNAME>"

my_spark = SparkSession \
    .builder \
    .appName("myApp") \
    .getOrCreate()

df = my_spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri", sourceConnectionString).option("database", sourceDb).option("collection", sourceCollection).load()

df.write.format("mongo").mode("append").option("uri", targetConnectionString).option("maxBatchSize",2500).option("database", targetDb).option("collection", targetCollection).save()

Otimize o desempenho da migração

O desempenho da migração pode ser ajustado através destas configurações:

  • Número de trabalhadores e núcleos no cluster do Spark: mais trabalhadores significam mais fragmentos de computação para executar tarefas.

  • maxBatchSize: o maxBatchSize valor controla a taxa na qual os dados são salvos na coleção do Azure Cosmos DB de destino. No entanto, se o maxBatchSize for muito alto para a taxa de transferência de coleta, isso pode causar erros de limitação de taxa.

    Você precisaria ajustar o número de trabalhadores e maxBatchSize, dependendo do número de executores no cluster do Spark, potencialmente do tamanho (e é por isso que o custo da RU) de cada documento que está sendo escrito e dos limites de taxa de transferência da coleção de destino.

    Gorjeta

    maxBatchSize = Taxa de transferência de coleta / (custo de RU para 1 documento * número de trabalhadores do Spark * número de núcleos de CPU por trabalhador)

  • MongoDB Spark partitioner and partitionKey: O particionador padrão usado é MongoDefaultPartitioner e partitionKey padrão é _id. O particionador pode ser alterado atribuindo valor MongoSamplePartitioner à propriedade spark.mongodb.input.partitionerde configuração de entrada. Da mesma forma, partitionKey pode ser alterado atribuindo o nome de campo apropriado à propriedade spark.mongodb.input.partitioner.partitionKeyde configuração de entrada. A partitionKey direita pode ajudar a evitar a distorção de dados (grande número de registros sendo gravados para o mesmo valor de chave de estilhaço).

  • Desabilitar índices durante a transferência de dados: para grandes quantidades de migração de dados, considere desabilitar índices, especialmente o índice curinga na coleção de destino. Os índices aumentam o custo de RU para escrever cada documento. Liberar essas RUs pode ajudar a melhorar a taxa de transferência de dados. Você pode habilitar os índices depois que os dados forem migrados.

Resolver problemas

Erro de tempo limite (código de erro 50)

Você pode ver um código de erro 50 para operações no banco de dados do Azure Cosmos DB para MongoDB. Os cenários a seguir podem causar erros de tempo limite:

  • A taxa de transferência alocada para o banco de dados é baixa: verifique se a coleção de destino tem taxa de transferência suficiente atribuída a ela.
  • Inclinação excessiva de dados com grande volume de dados. Se você tiver uma grande quantidade de dados para migrar para uma determinada tabela, mas tiver uma distorção significativa nos dados, ainda poderá enfrentar limitação de taxa, mesmo se tiver várias unidades de solicitação provisionadas em sua tabela. As unidades de solicitação são divididas igualmente entre partições físicas, e a distorção de dados pesada pode causar um afunilamento de solicitações para um único fragmento. A distorção de dados significa um grande número de registros para o mesmo valor de chave de estilhaço.

Limite de taxa (código de erro 16500)

Você pode ver um código de erro 16500 para operações no banco de dados do Azure Cosmos DB para MongoDB. Estes são erros de limitação de taxa e podem ser observados em contas mais antigas ou contas onde o recurso de repetição do lado do servidor está desativado.

  • Habilitar nova tentativa do lado do servidor: habilite o recurso de repetição do lado do servidor (SSR) e permita que o servidor tente novamente as operações limitadas de taxa automaticamente.

Otimização pós-migração

Depois de migrar os dados, você pode se conectar ao Azure Cosmos DB e gerenciar os dados. Você também pode seguir outras etapas pós-migração, como otimizar a política de indexação, atualizar o nível de consistência padrão ou configurar a distribuição global para sua conta do Azure Cosmos DB. Para obter mais informações, consulte o artigo Otimização pós-migração.

Recursos adicionais

Próximos passos