【问题标题】:Accumulo: How to index data for efficient queries?Accumulo:如何索引数据以进行高效查询?
【发布时间】:2016-05-10 15:29:57
【问题描述】:

我需要一个高效的索引架构来存储警报。每个警报都有以下属性:

  • alertId
  • 时间戳
  • 类型
  • 位置

我需要执行以下查询:

  • 在定义的日期范围内创建了多少警报?
  • 在定义的日期范围内创建了多少个 X 类型的警报?
  • 在定义的日期范围内创建了多少来自位置 Y 的警报?

我最初的想法是索引以下内容:

ROWID -> alertId_timestamp,
CF -> attribute (type, location),
CQ -> value

但是,我认为对于我的 #2 和 #3 查询用例,查询性能会很差。我应该如何索引我的数据?

【问题讨论】:

  • 您需要多大的日期范围来支持搜索?您对 3 个查询中每个查询的运行速度有何期望?
  • 日期范围不应超过 30 天。我希望每个查询都能在 3 秒内返回。
  • 还有一个问题:每天有多少警报,警报数量和平均警报大小(计算每天的总字节数)。
  • 每天有数十万条警报。平均警报大小约为 30 字节。

标签: accumulo


【解决方案1】:

如果您知道这些将是您唯一的查询,则可以这样插入数据:

RowID     |  CF    |  CQ    | Value 
Timestamp | "TYPE" | <type> | alertID
Timestamp | "LOC"  | <loc>  | alertID

是的,您正在插入数据 2x,但这是“大数据”,对,所以存储空间不应该是一个大问题。您的所有查询都是基于时间的,并且只是进行计数,因此您应该将时间戳作为您的 RowID,以便您可以在行上执行 Range 并使用 fetchColumnFamily 或在 CF/CQ 上过滤您想要的内容。如果您知道您只会寻找特定的类型/位置,您也可以尝试将 CF/CQ 组合在一起,例如“TYPE_Foo”和“LOC_Boston”,但如果您尝试查找,这将限制您所有/范围的类型/位置。请注意,您可能还想使用某种迭代器来进行服务器端聚合Does Accumulo support aggregation?

【讨论】:

  • 感谢您的反馈!鉴于您的建议,我将如何使用迭代器来汇总给定时间戳(或时间戳范围)的警报总数?
猜你喜欢
  • 2019-07-27
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2014-09-05
  • 2011-06-30
  • 2014-01-31
相关资源
最近更新 更多