这部分也可以标题为“如果我的表 rowkey 看起来像 _ 这个 _,但我也想像 _ 那样查询我的表 _。” dist-list 上的一个常见示例是行密钥的格式为“user-timestamp”,但对于某些时间范围的用户活动有报告要求。因此,用户选择很容易,因为它处于键的引导位置,但时间不是。
关于处理这个问题的最佳方法没有一个答案,因为它取决于......
用户数量
数据大小和数据到达率
报告要求的灵活性(例如,完全临时日期选择与预配置范围)
期望的查询执行速度(例如,对于某些特定报告,90 秒可能是合理的,而对于其他人来说可能太长)
并且解决方案也受到群集大小以及解决方案需要多少处理能力的影响。常用技术在下面的小节中。这是一个全面但并非详尽无遗的方法清单。
二级索引需要额外的集群空间和处理应该不足为奇。这正是 RDBMS 中发生的情况,因为创建备用索引的行为需要更新空间和处理周期。在这方面,RDBMS 产品更先进,可以开箱即用地处理备用索引管理。但是,HBase 在更大的数据量下可以更好地扩展,因此这是一项功能权衡。
在实施任何这些方法时,请注意 Apache HBase 性能调整。
另外,请看这个 dist-list 线程中的 David Butler 响应 HBase,mail#user - Stargate + hbase
根据具体情况,使用客户端请求过滤器可能是合适的。在这种情况下,不会创建二级索引。但是,不要尝试从应用程序(即单线程客户端)对这样的大型表进行全扫描。
可以在另一个表中创建二级索引,该表通过 MapReduce 作业定期更新。该作业可以在日内执行,但根据加载策略,它仍可能与主数据表不同步。
有关详细信息,请参阅 mapreduce.example.readwrite 。
另一种策略是在向集群发布数据时构建二级索引(例如,写入数据表,写入索引表)。如果在数据表已经存在之后采用这种方法,那么使用 MapReduce 作业的二级索引将需要自举(参见 secondary.indexes.periodic )。
如果时间范围非常宽(例如,一年的报告)并且数据量很大,则汇总表是一种常用方法。这些将通过 MapReduce 作业生成到另一个表中。
有关详细信息,请参阅 mapreduce.example.summary 。
协处理器就像 RDBMS 触发器一样。这些是在 0.92 中添加的。有关更多信息,请参阅协处理器