使用Spark将数据写入MongoDB

时间:2017-11-10 05:04:54

标签: mongodb apache-spark pyspark

当我尝试将一个火花数据帧写入mongodb时,我发现spark只创建了一个任务来完成它。这会导致性能下降,因为即使在作业中分配了许多执行程序,实际上只有一个执行程序正在运行。

我的部分pyspark代码:

df.write.format("com.mongodb.spark.sql.DefaultSource") \
    .mode("append") \
    .option("spark.mongodb.output.uri", connectionString) \
    .save()

在这种情况下可以激发多个任务吗?谢谢

Spark提交:

spark-submit --master yarn --num-executors 3 --executor-memory 5g --jars $JARS_PATH/mongo-java-driver-3.5.0.jar,$JARS_PATH/mongodb-driver-core-3.5.0.jar,$JARS_PATH/mongo-spark-connector_2.11-2.2.1.jar spark-mongo.py

我找到了包含此INFO的日志

INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0, linxtd-itbigd04, executor 1, partition 0, PROCESS_LOCAL, 4660 bytes)
INFO BlockManagerMasterEndpoint: Registering block manager linxtd-itbigd04:36793 with 1458.6 MB RAM, BlockManagerId(1, linxtd-itbigd04, 36793, None)
INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on linxtd-itbigd04:36793 (size: 19.7 KB, free: 1458.6 MB)
INFO TaskSetManager: Finished task 0.0 in stage 0.0 (TID 0) in 17364 ms on linxtd-itbigd04 (executor 1) (1/1)

1 个答案:

答案 0 :(得分:1)

就像我怀疑并在评论中提到的那样,你的数据没有被分区,因此Spark创建了一个任务来处理它。

如果不提供分区读取和写入数据不会并行化并且最终只有一个任务,则在使用jdbc源时必须小心。

您可以在我的一个火花陷阱中了解有关此主题的更多信息 - Reading data using jdbc source

免责声明:我是该回购的共同作者。