Mongodb 火花Mongo接头,MongoSharedPartitioner不工作

Mongodb 火花Mongo接头,MongoSharedPartitioner不工作,mongodb,apache-spark,pyspark,sharding,mongodb-cluster,Mongodb,Apache Spark,Pyspark,Sharding,Mongodb Cluster,出于测试目的,我配置了一个4节点集群,每个集群都有一个Spark Worker和一个MongoDB碎片。详情如下: 四台Debian 9服务器(名为visa0、visa1、visa2、visa3) 4个节点上的Spark(v2.4.0)群集(visa1:主节点,visa0..3:从节点) MongoDB(v3.2.11)分片群集con 4节点(在visa1..3上配置服务器副本集,在visa1上配置mongos,分片服务器:visa0..3) 我使用的MongoDB Spark连接器安装了“S

出于测试目的,我配置了一个4节点集群,每个集群都有一个Spark Worker和一个MongoDB碎片。详情如下:

  • 四台Debian 9服务器(名为visa0、visa1、visa2、visa3)
  • 4个节点上的Spark(v2.4.0)群集(visa1:主节点,visa0..3:从节点)
  • MongoDB(v3.2.11)分片群集con 4节点(在visa1..3上配置服务器副本集,在visa1上配置mongos,分片服务器:visa0..3)
  • 我使用的MongoDB Spark连接器安装了“Spark shell--软件包” org.mongodb.spark:mongo-spark-connector_2.11:2.4.0“
使用
MongoSharedPartitioner
配置SparkSession时,从数据库加载的每个数据帧都是空的,尽管数据帧架构已正确获取

这可以通过在SparkSession builder中的
spark defaults.conf
文件中进行配置或使用
.config(“spark.mongodb.input.partitioner”、“mongoSharedPartitioner”)
进行复制

使用
MongoSharedPartitioner
,df.count()==0:

但无需指定分区器即可正常工作:

./pyspark --master "spark://visa1:7077" --packages "org.mongodb.spark:mongo-spark-connector_2.11:2.4.0"

...

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.5.3 (default, Sep 27 2018 17:27:03)
SparkSession available as 'spark'.
>>> spark2 = SparkSession \
...   .builder \
...   .appName("myApp") \
...   .getOrCreate()
>>> 
>>> df2 = spark2.read.format("com.mongodb.spark.sql.DefaultSource") \
... .option("uri", "mongodb://visa1/email.emails") \
... .option("pipeline", '[ {"$match": {"mailbox": /^\/root\/pst_export\/albert_meyers_000_1_1.export/}} ]') \
... .load()
2019-01-07 22:7:33 WARN  Utils:66 - Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
>>> 
>>> df2.count()
1162  
问题:

  • 如何知道默认情况下配置了哪个分区器
  • 如何在此场景中使用
    MongoSharedPartitioner
提前谢谢

2019年1月13日:建议的解决方法

如下所述,
mongosharedpartitioner
似乎不支持将散列索引作为碎片索引。但是,我需要一个散列索引来将块均匀地分布在我的节点上,与时间无关(我想使用_id将按时间顺序分布)

我的解决方法是在数据库中创建一个新字段,使用计算出的日期桶md5散列,对其进行索引(作为普通索引),并将其用作碎片索引

现在,代码运行良好:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.5.3 (default, Sep 27 2018 17:25:39)
SparkSession available as 'spark'.
>>> 
>>> 
>>> spark2 = SparkSession \
...   .builder \
...   .appName("myApp") \
...   .config("spark.mongodb.input.partitioner" ,"MongoShardedPartitioner") \
...   .config("spark.mongodb.input.partitionerOptions.shardkey", "datebuckethash") \
...   .getOrCreate()
>>> 
>>> 
>>> df2 = spark2.read.format("com.mongodb.spark.sql.DefaultSource") \
... .option("uri", "mongodb://visa1/email.emails") \
... .option("pipeline", '[ {"$match": {"mailbox": /^\/root\/pst_export\/albert_meyers_000_1_1.export/}} ]') \
... .load()

2019-01-13 11:19:31 WARN  Utils:66 - Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
>>> 
>>> df2.count()
1162   

很抱歉,jose听到您的连接器出现问题

如何知道默认情况下配置了哪个分区器

有关分区器的信息可在上找到。如果你觉得有什么遗漏或不清楚的地方,请在中提交一张罚单,这真的可以帮助未来的用户

默认的分区器是一个围绕分区的薄包装器。它根据集合的统计抽样将集合拆分为大小不同的分区

如何在此场景中使用
MongoSharedPartitioner

使用
shardKey
生成分区。默认情况下,它将使用
\u id
作为键。您可能需要配置该值

注意:散列shardkey不受
mongoshardpartitioner
支持,因为目前无法根据散列值查询集合-因此检索分区时将无法返回结果。我已经添加了更新文档


您的设置中似乎存在问题,
MongoSharedPartitioner
未能按预期对集合进行分区,并返回0个结果。模式推断仍然有效,因为它查询集合的方式不同。如果不是配置/哈希shardkey问题,请在中提交一个bug,我可以帮助确定原因并为您发布修复程序。

非常感谢您提供这方面的见解。我同意您的观点,在文档中应该注意到MongoSharedPartitioner不支持哈希索引,因为当您希望spark任务均匀分布在节点上时,这种类型的索引非常有用。我已经解决了这个问题,在mondoDB中创建了一个新字段,使用日期桶的md5散列值,对其进行索引(普通索引),并将其用作碎片索引,所以我得到了我想要的一切。再次感谢。@Ross我们在这里遇到了一个类似的问题,我们有一个20亿文档的分片集合,其中有一个id字段上的散列分片,并试图使用spark job和MongoSharedPartitioner配置从Mongo DB集合转储数据。我甚至尝试在不添加“MongoSharedPartitioner”配置的情况下获取转储,但该作业一直运行得非常慢,我无法成功生成集合的转储。另外,在我的情况下,我无法更改分片策略,是否有一个解决方案,我可以在这里应用,使用spark jobs从Mongo DB读取数据?
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.5.3 (default, Sep 27 2018 17:25:39)
SparkSession available as 'spark'.
>>> 
>>> 
>>> spark2 = SparkSession \
...   .builder \
...   .appName("myApp") \
...   .config("spark.mongodb.input.partitioner" ,"MongoShardedPartitioner") \
...   .config("spark.mongodb.input.partitionerOptions.shardkey", "datebuckethash") \
...   .getOrCreate()
>>> 
>>> 
>>> df2 = spark2.read.format("com.mongodb.spark.sql.DefaultSource") \
... .option("uri", "mongodb://visa1/email.emails") \
... .option("pipeline", '[ {"$match": {"mailbox": /^\/root\/pst_export\/albert_meyers_000_1_1.export/}} ]') \
... .load()

2019-01-13 11:19:31 WARN  Utils:66 - Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
>>> 
>>> df2.count()
1162