当我尝试将一个火花数据帧写入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)
答案 0 :(得分:1)
就像我怀疑并在评论中提到的那样,你的数据没有被分区,因此Spark创建了一个任务来处理它。
如果不提供分区读取和写入数据不会并行化并且最终只有一个任务,则在使用jdbc源时必须小心。
您可以在我的一个火花陷阱中了解有关此主题的更多信息 - Reading data using jdbc source。
免责声明:我是该回购的共同作者。