Mongo-Spark连接器的工作逻辑是什么?

时间:2017-12-15 15:34:30

标签: mongodb apache-spark pyspark

我一直试图了解mongo-spark连接器是如何在引擎盖下工作的,但我仍然没有完全了解它背后的整个工作原理。

详情: 我试图使用Mongo-Spark来运行一个主要针对MongoDB集合执行文本搜索的spark作业。 Spark和MongoDB在两个不同的集群上运行

所以我创建了以下Spark-mongo数据框:

entity_df = sqlContext.read.format("com.mongodb.spark.sql.DefaultSource") \
                        .option("spark.mongodb.input.database", "WikiData") \
                        .option("spark.mongodb.input.collection", "entities_slim") \
                        .load()

entity_df.cache()
df = entity_df.filter(entity_df['id'] == "Q2834810").show()

第一条指令是否意味着将entities_slim集合从MongoDB集群复制到spark集群并表示为Spark DataFrame?

如果是,这是否意味着连接器只是一个只在MongoDB和Spark之间读/写数据的工具?

如果是,有没有办法创建MongoDB引擎运行MongoDB quires的spark作业?类似的东西:

import pymongo
from pyspark import SparkContext

spark_rdd.map(lamda x: entities.find_one( {'id': best} ))

请注意,执行语句entity_df.filter(entity_df['id'] == "Q2834810").show()的运行速度比使用pymongo直接查询MongoDB要慢得多

2 个答案:

答案 0 :(得分:1)

  

如果是,这是否意味着连接器只是一个只在MongoDB和Spark之间读/写数据的工具?

在某种程度上,但它并不意味着

  

正在从MongoDB集群中复制entities_slim集合。

选择(过滤器)are converted to aggregation pipelines

  

当使用带有DataFrames或Spark SQL的过滤器时,底层的Mongo Connector代码构造一个聚合管道来过滤MongoDB中的数据,然后再将其发送到Spark

此类行为通常适用于数据源API - 如果可能,会将投影和选择下推到源。

回到你的担忧:

  

请注意,执行语句entity_df.filter(entity_df [' id'] ==" Q2834810")。show()运行速度比使用pymongo直接查询MongoDB要慢得多

这是可以预料的。 Apache Spark和MongoDB聚合管道都不是针对低延迟单项查询而设计的。两者都用于大规模批量处理。如果您需要快速单项访问,请不要首先使用Apache Spark - 这就是您拥有的数据库。

最后如果运行

  

主要针对MongoDB集合执行文本搜索的作业。

内置的MongoDB文本搜索功能(尽管它们不完美)可能是更好的选择。

答案 1 :(得分:1)

  • 使用mongodb和spark连接器,您可以将MongoDB数据加载到spark中,以利用一系列API( Spark SQL,Spark流,机器学习和图形API )来对您的mongodb数据执行丰富的聚合
  • 这使您可以利用 spark的功能来分析您的数据卸载到Spark
  • 这是双向连接器,您可以将mongodb数据加载到spark并将RDD重新加载回MongoDB
  

第一条指令是否表示entities_slim集合   从MongoDB集群复制到spark集群和   表示为Spark DataFrame?

  

如果是,这是否意味着连接器只是一个工具   在MongoDB和Spark之间读/写数据?

  

如果是,是否有办法创建运行MongoDB quires的spark作业   MongoDB引擎?

您可能需要在mongodb本身查询mongodb中的数据?您可以将数据处理为spark并将其存储回mongodb