使用 spark sql 超过 1.5 亿 mongodb 集合的同步服务的最佳方法?

Best approach for a sync service over a 150Millions mongodb collection with spark sql?

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

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

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

到目前为止,我已尝试以两种不同的方式实现它——但对于公开同步服务而言,这两种方式似乎都太慢(客户端将不得不等待太久):

  1. Using native MongoDB aggregators:当要求和的产品数量非常大时,使用 native MongoDB aggregators 似乎太慢了.

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

所以我的问题是:

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

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

c)你会怎么做?

非常感谢!

在我看来,查询位于期望高速的单个服务器上的 150M 文档集合似乎是一个太多的问题。

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

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

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