【问题标题】:How should the Hbase data should be for fast query response?Hbase数据应该如何快速查询响应?
【发布时间】:2017-11-12 18:34:28
【问题描述】:

我有以下规则的情况:

  1. 用户一次只能在一个场所。如果用户 A 在场地 X 登记,然后在 地点 Y,他们不再在地点 X。
  2. 签到最多只能“持续”3 小时。如果用户 A 在场地 X 签到,然后签到 3小时内什么都没有,他们已经不在X场地了。

数据将使用 Kafka 和 spark-streaming 解析到 HBase。

我想使用 HBase,TTL 为 3 小时,版本控制为 1,满足上述条件。问题是我很困惑如何在 HBase 中组织数据以获得更快的查询响应,我应该使用带有场地名称或场地名称的单个列作为不同的列名吗?

哪个是更好的选择,为什么?

需要执行的查询是: 1. 用户 A 现在在哪里? 2. X 场馆现在有哪些用户?

【问题讨论】:

  • 预计有多少用户和多少场地?什么是读写比?预计每秒有多少请求?
  • 这是实时查询的新实现。目前一切都会减少,但希望每个公共场所都成为一个场所。

标签: mongodb hadoop cassandra hbase


【解决方案1】:

最高效的查询是基于HBase表的row key。 我会使用用户名作为行键,以便能够快速获取特定用户在哪里的信息。每行都需要一列 - 场地。

显然,要收集所有数据(查询 2:地点 X 有哪些用户),您需要扫描整个(部分)表。所以效率不会很高。如果您遇到此类查询的性能问题,请查看 HBase 的二级索引。

【讨论】:

    【解决方案2】:

    所以,为了解决上述情况,我建议有两个表:

    1. 第一个表的行键将是 userID(我还建议添加一些分片键,例如 (userID % number of HBase region) 以均匀分布数据并避免热点)。该表将提供映射用户 ID -> 场地,并检查特定用户将在哪里使用 O(1)。
    2. 第二个表的行键将是场地ID + 用户ID(也以一些分片键为前缀)。因此,您可以使用 KeyOnlyFilter 和 PrefixFilter(前缀是场所)来获取特定场所中的所有用户。这应该很快。

    由于您使用 Kafka 和 Spark,摄取到两个表应该不会影响您的性能。

    如果您需要更多详细信息,请告诉我。

    【讨论】:

    • 不错的方法。但是你觉得值两张桌子吗?
    • 这种非规范化的主要开销是更新。但据我了解,在您的情况下,更新是在注入期间同时完成的。因此,您可以使两个表中的数据保持同步。所以,我认为这应该可行。
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2010-11-21
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多