【问题标题】:Writing data into MongoDB with Spark使用 Spark 将数据写入 MongoDB
【发布时间】:2017-11-10 05:04:54
【问题描述】:

当我尝试将 spark 数据帧写入 mongodb 时,我发现 spark 只创建一个任务来执行此操作。这会导致性能不佳,因为即使在作业中分配了许多执行器,实际上也只有一个执行器在运行。

我的部分 pyspark 代码:

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

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

火花提交:

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

【问题讨论】:

  • 问题是?你没有问任何问题。你在这里写的是你做了什么和你“想”什么的“陈述”。你会问什么?
  • 分享您的 spark 提交命令和您的环境详细信息
  • @Barry 我们在这里讨论什么类型的任务?如果您的意思是保存数据,通常情况就是这样。瓶颈将是网络 IO 以及 mongo 在崩溃之前可以摄取多少数据。
  • @eliasah 这些任务是 Spark 作业中的 Spark 任务。我希望我可以使用 Spark 将我的数据从 MSSQL 导入 MongoDB,并在我的集群中进行分布式处理(因为我有 10 多亿条记录)。但我发现 Spark 只创建一个任务和一个任务并在一个节点上运行。这是我的问题。

标签: mongodb apache-spark pyspark


【解决方案1】:

正如我所怀疑的,并且在 cmets 中提到,您的数据没有分区,因此 Spark 创建了一个任务来处理它。

在使用 jdbc 源时必须小心,如果您不提供分区,则读写数据不会被并行化,并且最终只能完成一项任务。

您可以在我的一个 spark 陷阱 - Reading data using jdbc source 中阅读有关此主题的更多信息。

免责声明:我是该回购协议的合著者之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多