Compartilhar via


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

APLICA-SE AO: 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 a pré-migração, a migração e a pós-migração, como mostrado abaixo.

Diagrama das etapas de migração

Migração de dados usando o Azure Databricks

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

Neste tutorial, você aprenderá a:

  • Provisionar um cluster do Azure Databricks

  • Adicionar dependências

  • Criar e executar um notebook Python ou Scala

  • Otimizar o desempenho da migração

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

Pré-requisitos

Para concluir este tutorial, você precisará:

Provisionar um cluster do Azure Databricks

Você pode seguir as instruções para provisionar um cluster Azure Databricks. Recomendamos a seleção do runtime do Databricks versão 7.6, que é compatível com o Spark 3.0.

Diagrama de criação de cluster do databricks.

Adicionar dependências

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

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

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

Observação

Reinicie o cluster do Databricks após a instalação da biblioteca do Conector do MongoDB para Spark.

Depois disso, você poderá criar um notebook Scala ou Python para migração.

Criar um Notebook Scala para migração

Crie um Notebook Scala no Databricks. Insira 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 um Notebook Python para migração

Crie um Notebook Python no Databricks. Insira 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()

Otimizar o desempenho da migração

O desempenho da migração pode ser ajustado por meio dessas configurações:

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

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

    Você precisaria ajustar o número de funções de trabalho e de maxBatchSize, dependendo do número de executores no cluster do Spark, potencialmente o tamanho (isso é o que causa o custo de RU) de cada documento que está sendo gravado e os limites de taxa de transferência de coleção de destino.

    Dica

    maxBatchSize = taxa de transferência de coleta/(custo de RU para um documento * número de funções de trabalho do Spark * número de núcleos de CPU por trabalho)

  • Particionador do Spark do MongoDB e partitionKey: o particionador padrão usado é MongoDefaultPartitioner a partitionKey padrão é _id. O particionador pode ser alterado por meio da atribuição de valor MongoSamplePartitioner à propriedade de configuração de entrada spark.mongodb.input.partitioner. Da mesma forma, a partitionKey pode ser alterada atribuindo o nome do campo apropriado à propriedade de configuração de entrada spark.mongodb.input.partitioner.partitionKey. A partitionKey correta pode ajudar a evitar a distorção de dados (grande número de registros sendo gravados no mesmo valor de chave de fragmentação).

  • Desabilitar indexações durante a transferência de dados: para grandes quantidades de migração de dados, considere desabilitar as indexações, especialmente a indexação de caractere curinga na coleção de destino. As indexações aumentam o custo de RU para a gravação de cada documento. A liberação desses RUs pode ajudar a melhorar a taxa de transferência de dados. Você pode habilitar as indexações depois que os dados forem migrados.

Solucionar problemas

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

Você poderá ver um código de erro 50 para operações no banco de dados do Azure Cosmos DB for MongoDB. Os seguintes cenários 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.
  • Distorção de dados excessiva 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 uma limitação de taxa mesmo que tenha várias unidades de solicitação provisionadas na tabela. As unidades de solicitação são divididas igualmente entre as partições físicas e a distorção de dados pesada pode causar um gargalo de solicitações para uma única extensão. Distorção de dados significa um grande número de registros para o mesmo valor de chave de extensão.

Limitação de taxa (código de erro 16500)

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

  • Habilitar a repetição do lado do servidor: habilite o recurso SSR (repetição do lado do servidor) e permita que o servidor repita essas operações limitadas pela taxa automaticamente.

Otimização após a 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, confira o artigo Otimização pós-migração.

Recursos adicionais

Próximas etapas