我正在为处理大量实体的系统设计 AWS 上的云架构。我希望这是针对此问题的正确 StackExchange(SO 对我来说似乎不合适 - 请随意迁移问题)。
问题描述
我有大量(假设n = 1 000 000对于此场景) 数据库中实体 (可通过其键访问的对象 - 基本上是 noSQL DB)。我有一个算法,它能够获取两个对象并生成一个表示其相似性的值 (假设计算大约需要 10ms)。
系统应该能够将任意实体与我的数据库中的所有实体进行比较,也能够识别我的数据库中的所有重复项(这意味着将每个实体与其他实体进行比较!)。
设计
- DynamoDB(或用于我的实体的类似 noSQL 存储)
- 处理器 - 在 EC2 上运行的主要服务,它将加载所有实体键并将计算请求放入可扩展队列 (SQS) - 为其他工作者分配工作负载
- 工作负载队列——计算请求队列
- 工作者 - 部署到 ElasticBeanstalk 的服务,连接到工作负载队列。工作者连接到数据库,获取要比较的实体并运行算法
- ResultsDB - 包含来自工作人员的结果的关系型或非关系型数据库
我把它写在纸上并做了一些基本的估计(有合理数量的工作人员,每个工作人员使用多个线程),并发现执行重复识别需要太多时间 - 对于“一对多”的比较来说它相当好,但尝试执行 1000000^2 个操作就太多了。
我正在考虑将 Hadoop 与 MapReduce 结合使用,但似乎我必须为每一次“一对多”的比较启动一项新作业(而且运行百万个作业听起来不是很快)。
因此,我非常乐意听到任何关于如何改进我的设计并克服这些缺陷的建议。此外,这项任务(每个与每个比较)是否可行,而无需运行数百个强大的实例(价格也是一个限制)。
答案1
如果您正在寻找“重复项”,并且您的度量标准是欧几里得,那么您可能不需要知道远距离物体之间的距离。谷歌搜索“高效 knn”之类的内容可能会让您找到答案。
直观的类比:如果你在希腊寻找某人 50 公里范围内的邻居,不要花很多时间计算与美国所有人的距离。这些距离对于寻找邻居来说永远不重要。