使用 spark sql 对 1.5 亿个 mongodb 集合进行同步服务的最佳方法?

Posted

技术标签:

【中文标题】使用 spark sql 对 1.5 亿个 mongodb 集合进行同步服务的最佳方法?【英文标题】:Best approach for a sync service over a 150Millions mongodb collection with spark sql? 【发布时间】:2017-10-02 22:10:55 【问题描述】:

我在单个 MongoDB 实例中有一个 150M 文档 MongoDB 集合。 每个文件都是一个产品。产品有价格和类别。 即:


  category: "shoes",
  price: 20,
  .
  .
  .
 

我想公开一个 rest API 方法来对此集合进行同步查询。即:给定类别 X 的所有产品的平均价格是多少。

到目前为止,我已经尝试以两种不同的方式实现它——对于公开同步服务来说,两者似乎都太慢了(客户端必须等待太久):

    使用原生 MongoDB 聚合器:当要求和的产品数量非常大时,使用原生 MongoDB 聚合器似乎太慢了。

    MongoDB + Spark SQL:使用过滤下推获取给定类别的产品,并处理 spark 集群节点内的平均价格。这种方法将产品集合加载到集群内存中需要很长时间。 (在具有 1 个主设备和 2 个从设备的 AWS EMR 集群中收集 80k 产品需要 13 分钟)

所以我的问题是

a) 方法 #2 是否可行?这种方法是否应该足够快,所以我做错了什么?

b) 实现这一目标的最佳方法是什么?从架构的角度来看,实现这一目标的最佳解决方案是什么?

c)你会怎么做?

非常感谢!

【问题讨论】:

【参考方案1】:

在我的拙见中,查询位于单个服务器上的 150M 文档集合并期望高速似乎是一个过分的问题。

关于选项 a),聚合管道将在集合的所有分片上执行(除非$match 在分片键上)。然后,每个节点将负责在自己的分片中找到那些节点,从而分配工作负载。这应该会提供更快的响应时间(以及其他并发查询的 CPU 时间,如果有的话)。

关于选项 b),如果我理解正确,您最终将通过 Spark 流式传输 150M 记录。我不确定您从这种方法中看到的优势在哪里。

因此,关于 c),TL;DR 是分片集合上的聚合

【讨论】:

这是我所期望的,我的意思是,我认为只有一个 MongoDB 实例不可能很快。感谢您的回答!

以上是关于使用 spark sql 对 1.5 亿个 mongodb 集合进行同步服务的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

Spark 1.5 to 2.1.X

如何将字符串 - 1year 6mon 转换为数字 1.5?

Apache Spark SQL 上下文删除重复项

PySpark 1.5 & MSSQL jdbc

Spark Sql 作业优化

分布式存储 Ceph部署详解