i有一个mongodb实例中的 150m文档 mongodb集合。每个文档都是产品。产品具有价格和类别。即:
{
category: "shoes",
price: 20,
.
.
.
}
我想揭露一种REST API方法,以对此集合进行同步查询。即:给定类别X。
的所有产品的平均价格是多少到目前为止,我试图以两种不同的方式实施它 - 两者似乎都太慢了,无法公开同步服务(客户必须等待太久):
使用本机MongoDB聚合器:使用本机MongoDB聚合器时,当要汇总的产品数确实很大时,似乎太慢了。
mongodb Spark SQL :使用过滤向下按下以获取给定类别的产品并处理Spark群集节点内的平均价格。这种方法需要太长时间加载到产品集合集群中。(在AWS EMR群集中,带有1个主人和2个奴隶的AWS EMR群集花了13分钟的时间)
所以我的问题是:
a)应该处理#2工作吗?这种方法应该足够快,所以我做错了什么?
b)实现这一目标的最佳方法是什么?从架构的角度来看,最佳解决方案是什么?
c)您将如何做?
非常感谢!
查询坐在单个服务器上的150m文档集合期望高速似乎是我的卑微意见。
关于选项A),将在集合的所有碎片上执行聚合管道(除非$match
在碎片键上)。然后,每个节点都会照顾自己的碎片中找到这些节点,从而分发工作量。这应该提供更快的响应时间(以及其他并发查询的CPU时间,如果有)。
关于选项b),如果我正确理解,您最终将通过Spark流式传输150m的记录。我不确定您从这种方法中看到的优势在哪里。
因此,关于c),tl; dr是 sharded Collection 。