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.
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:
- Conclua as etapas de pré-migração , como estimar a taxa de transferência e escolher uma chave de estilhaço.
- Crie uma conta do Azure Cosmos DB para MongoDB.
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.
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.
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
à propriedadespark.mongodb.input.partitioner
de configuração de entrada. Da mesma forma, partitionKey pode ser alterado atribuindo o nome de campo apropriado à propriedadespark.mongodb.input.partitioner.partitionKey
de 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
- Tentando fazer o planejamento de capacidade para uma migração para o Azure Cosmos DB?
- Se tudo o que você sabe é o número de vcores e servidores em seu cluster de banco de dados existente, leia sobre como estimar unidades de solicitação usando vCores ou vCPUs
- Se você souber as taxas de solicitação típicas para sua carga de trabalho de banco de dados atual, leia sobre como estimar unidades de solicitação usando o planejador de capacidade do Azure Cosmos DB