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.
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á:
- Concluir as etapas de pré-migração, como estimar a taxa de transferência e escolher uma chave de extensão.
- Criar uma conta do Azure Cosmos DB for MongoDB.
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.
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
.
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 entradaspark.mongodb.input.partitioner
. Da mesma forma, a partitionKey pode ser alterada atribuindo o nome do campo apropriado à propriedade de configuração de entradaspark.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
- Tentando fazer um planejamento de capacidade para uma migração para o Microsoft Azure Cosmos DB?
- Se você sabe apenas o número de vCores e servidores no cluster de banco de dados existente, leia sobre como estimar unidades de solicitação com vCores ou vCPUs
- Se souber as taxas de solicitação típicas da carga de trabalho do banco de dados atual, leia sobre como estimar unidades de solicitação usando o planejador de capacidade do Azure Cosmos DB