Freigeben über


Migrieren von Daten von MongoDB zu einem Azure Cosmos DB for MongoDB-Konto mithilfe von Azure Databricks

GILT FÜR: MongoDB

Dieser Migrationsleitfaden ist Teil einer Reihe zum Migrieren von Datenbanken von MongoDB zur Azure Cosmos DB-API für MongoDB. Die wichtigen Migrationsschritte umfassen die Migrationsvorbereitung, die Migration und die Migrationsnachbereitung, wie nachfolgend dargestellt.

Diagramm der Migrationsschritte

Datenmigration mithilfe von Azure Databricks

Azure Databricks ist ein PaaS-Angebot (Platform as a Service) für Apache Spark. Es bietet eine Möglichkeit, Offlinemigrationsvorgänge für ein umfangreiches Dataset durchzuführen. Sie können Azure Databricks für die Offlinemigration von Datenbanken von MongoDB zu Azure Cosmos DB for MongoDB verwenden.

In diesem Tutorial lernen Sie Folgendes:

  • Bereitstellen eines Azure Databricks-Clusters

  • Hinzufügen von Abhängigkeiten

  • Erstellen und Ausführen eines Scala- oder Python-Notebooks

  • Optimieren der Migrationsleistung

  • Beheben von Problemen bei der Ratenbegrenzung, die während der Migration auftreten können

Voraussetzungen

Für dieses Tutorial benötigen Sie Folgendes:

Bereitstellen eines Azure Databricks-Clusters

Nutzen Sie die Anweisungen zum Bereitstellen eines Azure Databricks-Clusters. Wir empfehlen die Auswahl der Version 7.6 der Databricks-Runtime, die Spark 3.0 unterstützt.

Diagramm der Erstellung eines neuen Databricks-Clusters

Hinzufügen von Abhängigkeiten

Fügen Sie dem Cluster die MongoDB-Connectorbibliothek für Spark hinzu, um eine Verbindung mit nativen MongoDB-Endpunkten sowie mit Endpunkten von Azure Cosmos DB for MongoDB herzustellen. Wählen Sie in Ihrem Cluster Bibliotheken>Neue installieren>Maven aus, und fügen Sie dann org.mongodb.spark:mongo-spark-connector_2.12:3.0.1 als Maven-Koordinaten hinzu.

Diagramm des Hinzufügens von Databricks-Clusterabhängigkeiten

Wählen Sie Installieren aus, und starten Sie den Cluster nach Abschluss der Installation neu.

Hinweis

Starten Sie den Databricks-Cluster neu, nachdem die MongoDB-Connectorbibliothek für Spark installiert wurde.

Danach können Sie ein Scala- oder Python-Notebook für die Migration erstellen.

Erstellen eines Scala-Notebooks für die Migration

Erstellen eines Scala Notebooks in Databricks. Stellen Sie sicher, die richtigen Werte für die Variablen einzugeben, bevor Sie den folgenden Code ausführen:

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)

Erstellen eines Python-Notebooks für die Migration

Erstellen Sie ein Python-Notebook in Databricks. Stellen Sie sicher, die richtigen Werte für die Variablen einzugeben, bevor Sie den folgenden Code ausführen:

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()

Optimieren der Migrationsleistung

Die Migrationsleistung kann mithilfe der folgenden Konfigurationen angepasst werden:

  • Anzahl von Workern und Kernen im Spark-Cluster: Mehr Worker bedeuten auch mehr Servershards zum Ausführen von Tasks.

  • maxBatchSize: Der maxBatchSize-Wert steuert die Rate, mit der Daten in der Azure Cosmos DB-Zielsammlung gespeichert werden. Wenn maxBatchSize für den Sammlungsdurchsatz jedoch zu hoch ist, kann dies zu Fehlern durch Ratenbegrenzungen führen.

    Sie müssen die Anzahl der Worker und maxBatchSize an die Anzahl der Executors im Spark-Cluster, ggf. an die Größe (und damit die RU-Kosten) der einzelnen geschriebenen Dokumente und an die Durchsatzgrenzwerte der Zielsammlung anpassen.

    Tipp

    maxBatchSize = Sammlungsdurchsatz / (RU-Kosten für 1 Dokument * Anzahl von Spark-Workern * Anzahl von CPU-Kernen pro Worker)

  • MongoDB-Spark-Partitionierer und partitionKey: Standardmäßig wird als Partitionierer MongoDefaultPartitioner verwendet, und der Standardwert für partitionKey lautet „_id“. Den Partitionierer können Sie ändern, indem Sie der Eingabekonfigurationseigenschaft spark.mongodb.input.partitioner den Wert MongoSamplePartitioner zuweisen. Ebenso kann partitionKey geändert werden, indem der Eingabekonfigurationseigenschaft spark.mongodb.input.partitioner.partitionKey der entsprechende Feldname zugewiesen wird. Ein geeigneter partitionKey kann dazu beitragen, Datenschiefe zu vermeiden (große Anzahl von geschriebenen Datensätzen für denselben Shardschlüsselwert).

  • Deaktivieren von Indizes während der Datenübertragung: Erwägen Sie bei großen Datenmengen die Deaktivierung von Indizes während der Migration, insbesondere Platzhalterindizes für die Zielsammlung. Indizes erhöhen die RU-Kosten für das Schreiben der einzelnen Dokumente. Durch das Freigeben dieser RUs kann die Datenübertragungsrate verbessert werden. Sie können die Indizes aktivieren, nachdem die Daten migriert wurden.

Problembehandlung

Timeoutfehler (Fehlercode 50)

Möglicherweise wird der Fehlercode 50 für Vorgänge mit der Azure Cosmos DB for MongoDB-Datenbank angezeigt. Timeoutfehler können in folgenden Szenarien auftreten:

  • Der zugeordnete Durchsatz der Datenbank ist zu niedrig: Stellen Sie sicher, dass der Zielsammlung ein ausreichender Durchsatz zugewiesen ist.
  • Übermäßige Datenschiefe bei großen Datenmengen. Wenn Sie sehr viele Daten in eine bestimmte Tabelle migrieren müssen, aber eine erhebliche Schiefe in den Daten vorliegt, kann es trotzdem zu einer Ratenbegrenzung kommen, selbst wenn Sie mehrere RUs (Anforderungseinheiten) in Ihrer Tabelle bereitgestellt haben. Anforderungseinheiten werden gleichmäßig auf die physischen Partitionen verteilt, und eine starke Datenschiefe kann einen Engpass bei Anforderungen an einen einzelnen Shard verursachen. Datenschiefe bedeutet, dass eine große Anzahl von Datensätzen denselben Shardschlüsselwert aufweist.

Ratenbegrenzung (Fehlercode 16500)

Möglicherweise wird der Fehlercode 16500 für Vorgänge mit der Azure Cosmos DB for MongoDB-Datenbank angezeigt. Hierbei handelt es sich um Ratenbegrenzungsfehler, die bei älteren Konten auftreten können oder bei Konten, bei denen die Funktion für serverseitige Wiederholungen deaktiviert ist.

  • Aktivieren der serverseitigen Wiederholung: Sie können die Funktion für serverseitige Wiederholungen (Server-Side Retry, SSR) aktivieren, damit der Server Vorgänge mit Ratenbegrenzungsfehlern automatisch wiederholt.

Optimierung nach der Migration

Nach der Migration der Daten können Sie eine Verbindung mit Azure Cosmos DB herstellen und die Daten verwalten. Sie können nach der Migration auch weitere Schritte ausführen und beispielsweise die Indizierungsrichtlinie optimieren, die Standardkonsistenzebene aktualisieren oder die globale Verteilung für Ihr Azure Cosmos DB-Konto konfigurieren. Weitere Informationen finden Sie im Artikel zur Optimierung nach der Migration.

Zusätzliche Ressourcen

Nächste Schritte