HBase二级索引和备用查询路径
你也可以将本节的标题理解为“如果我的表 rowkey 看起来像这样,但我也希望我的查询表这样。” dist-list 上的一个常见示例是 row-key 格式为“user-timestamp”格式,但对于特定时间范围内的用户活动有报告要求。因此,用户选择容易,因为它处于密钥的主导位置,但时间不是。
没有一个最好的方法来解决这个问题的答案,因为它取决于:
- 用户数量
- 数据大小和数据到达率
- 报告要求的灵活性(例如,完全特定的日期选择与预先配置的范围)
- 期望的查询执行速度(例如,对于临时报告来说90秒可能是合理的,而对于其他情况来说可能太长)
而且解决方案也受到集群规模和解决方案所需的处理能力的影响。常见的技巧在下面的部分中介绍。这是一个全面但并非详尽的方法清单。
二级索引需要额外的集群空间和处理并不令人惊讶。这正是 RDBMS 中发生的情况,因为创建备用索引的操作需要更新空间和处理周期。RDBMS产品在这方面更加先进,可以处理替代索引管理。但是,HBase 在更大的数据量下可以更好地扩展,所以这是一项功能交换。
实施这些方法时请注意 Apache HBase 性能调整。
另外,请参阅在这个 dist-list 线程 HBase,mail#user – Stargate + hbase 中的 David Butler 响应。
HBase过滤查询
根据具体情况,使用客户端请求过滤器可能是适当的。在这种情况下,不会创建二级索引。但是,请不要在应用程序(如单线程客户端)上对这样的大表进行全面扫描。
HBase定期更新二级索引
可以在另一个表中创建二级索引,通过 MapReduce 作业定期更新。该作业可以在一天内执行,但要取决于加载策略,它可能仍然可能与主数据表不同步。
HBase双写二次索引
另一种策略是在将数据发布到集群时构建二级索引(例如,写入数据表,写入索引表)。如果这是在数据表已经存在之后采取的方法,那么对于具有 MapReduce 作业的二级索引将需要引导。
HBase汇总表
在时间范围非常广泛的情况下(例如,长达一年的报告)以及数据量大的地方,汇总表是一种常见的方法。这些将通过 MapReduce 作业生成到另一个表中。
HBase协处理器二级索引
协处理器行为类似于 RDBMS 触发器。这些在 0.92 增加。