使用 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 集合进行同步服务的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章