如何借助Azure Databricks高效将MongoDB迁移到Azure CosmosDB
本地MongoDB迁移至Mongo API版Azure Cosmos DB(Databricks方案)优化指南
186GB数据低停机迁移速率提升方案
- 提前预配目标端资源:迁移前临时将Cosmos DB的RU/s上调到账号最高可用配额,关闭自动索引策略,仅保留业务必须的唯一索引,迁移完成后再调整回常规规格并重建非必要索引,可避免写入时的吞吐量瓶颈,实测能提升40%以上写入效率。
- 网络层优化:将Azure Databricks工作区部署到和Cosmos DB相同的Azure区域,本地MongoDB到Azure的链路优先用ExpressRoute专线,避开公网传输的带宽限制和抖动,跨环境传输速率至少能提升30%。
- Spark读写参数调优:
- 源端读取配置
spark.mongodb.input.partitioner为MongoSamplePartitioner,分区数设置为Spark执行器总核心数的2~3倍,避免单分区数据量过大导致的任务倾斜 - 目标端写入开启批量模式,配置
spark.cosmos.write.bulk.enabled为true,spark.mongodb.output.batchSize根据单文档大小设置为1000~5000,减少请求开销
- 源端读取配置
- 全量+增量分阶段迁移:先执行全量同步任务,同时记录本地MongoDB的oplog起始位点,全量同步完成后启动增量同步任务追平oplog,业务切流前仅需停服同步最后几秒的增量数据,可将停机时间压缩到分钟级。
注意:如果你的单文档平均大小超过1MB,建议把batchSize调低到100~200,避免触发Cosmos DB的单请求大小限制。
Azure Databricks使用建议
- 迁移集群选型:优先选择内存优化型集群,工作节点选8vCore/64GB内存的规格,执行器数量根据Cosmos DB的RU配额调整,一般10~15个执行器即可跑满100万RU/s的写入吞吐量,不需要盲目堆节点造成资源浪费。
- 依赖包配置:集群预装两个Maven包即可适配场景:
org.mongodb.spark:mongo-spark-connector_2.12:10.1.1、com.azure.cosmos.spark:azure-cosmos-spark_3-2_2-12:4.18.0,不要使用旧版本连接器,读写效率低且容易出现数据一致性问题。 - 任务容错配置:设置
spark.task.maxFailures为4、spark.stage.maxConsecutiveAttempts为2,同时开启Databricks任务自动重试,避免偶发网络抖动导致整个迁移任务失败重跑。 - 迁移校验参考:同步完成后可通过简单的Spark任务快速校验一致性,示例代码如下:
# 统计源端MongoDB集合行数 source_count = spark.read.format("mongodb") \ .option("uri", source_mongo_uri) \ .option("collection", collection_name) \ .load().count() # 统计目标端Cosmos DB集合行数 target_count = spark.read.format("cosmos.oltp") \ .option("spark.cosmos.accountEndpoint", cosmos_endpoint) \ .option("spark.cosmos.accountKey", cosmos_access_key) \ .option("spark.cosmos.database", target_db_name) \ .option("spark.cosmos.container", collection_name) \ .load().count() print(f"源端行数:{source_count}, 目标端行数:{target_count}")
- 日常使用注意:如果后续将Databricks用于常规数据处理,优先选择Databricks Runtime的最新LTS版本,开启集群自动缩放和闲置自动终止,可减少30%以上的资源闲置成本。
内容的提问来源于stack exchange,提问作者Jithin Variyar
相关产品推荐
相关产品推荐

