关于我之前的问题(如何快速构建大规模分析服务器? )我现在将我的分析数据提供给 MongoDB - 每个事件(带有一堆元数据)在视图集合中都有自己的文档。
但是,现在我遇到了下一个障碍:既然插入已完成并且分析数据正在流动,那么针对该数据运行阻力最小的路径是什么?这个想法是,一旦数据被分片,特定视图将运行 mapReduces(比如一个月前具有特定 ID 的所有事件)。
所以,我的问题是:由于我对 MongoDB 很陌生,我需要采取哪些步骤才能尽可能快地获得这些 mapReduces?我应该以不同的方式构建原始数据还是每个事件的一个文档正确?在针对每天获得数百万次插入的数据集运行时,我可以采取哪些特定于 Mongo 的技巧来使事情变得更快?
我宁愿让我的技术堆栈尽可能简单(Node.js + MongoDB),所以我更愿意在不引入额外技术的情况下完成事情(比如 Hadoop)。
事件的示例文档:
{
id: 'abc',
ip: '1.1.1.1',
type: 'event1',
timestamp: 1234,
metadata: {
client: 'client1'
}
}
所有主要聚合都将以 ID 为中心,分析所述 ID 中的事件,最常用的是获取上个月具有所述 ID 的所有事件。次要聚合将使用元数据对事物进行分组(使用客户端 1 与客户端 2 的百分比等)。所有聚合都将由系统定义,因此至少此时用户无法自行设置它们。因此,据我了解,分片应该通过 ID 完成,因为大多数聚合将以 ID 为中心?此外,这应该意味着任何给定 ID 上的最新事件始终在内存中,因为 Mongo 将最新内容保存在内存中,并且只会将溢出转储到磁盘。
此外,实时不是必需的。虽然,ofc会很好。:P
编辑:添加示例数据
编辑:标题应该是“...每天”而不是“...每页”+关于聚合集的更多规范