Mongodb Hbase数据应如何用于快速查询响应?

Mongodb Hbase数据应如何用于快速查询响应?,mongodb,hadoop,cassandra,hbase,Mongodb,Hadoop,Cassandra,Hbase,我有以下规则的情况: 用户一次只能在一个地点。如果用户A在场馆X报到,然后在 场地Y,他们不再在场地X 办理登机手续最多只能“持续”3小时。如果用户A在场馆X报到,然后 3个小时内什么都没有,他们已经不在X场地了 数据将使用Kafka和spark流解析成HBase 我想使用HBase,TTL为3小时,版本控制为1,满足上述条件。问题是,我不知道如何在HBase中组织数据以实现更快的查询响应,我应该使用带有场馆名称或场馆名称的单个列作为不同的列名吗 哪一个是更好的选择?为什么 需要执行的查询包括:

我有以下规则的情况:

  • 用户一次只能在一个地点。如果用户A在场馆X报到,然后在 场地Y,他们不再在场地X
  • 办理登机手续最多只能“持续”3小时。如果用户A在场馆X报到,然后 3个小时内什么都没有,他们已经不在X场地了
  • 数据将使用Kafka和spark流解析成HBase

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

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

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

    最有效的查询是基于HBase表的行键。 我会使用用户名作为行键,以便能够快速获取特定用户所在位置的信息。每行需要一列-地点


    显然,要收集所有数据(查询2:在场馆X的用户是什么),您需要扫描整个(部分)表。所以它不会很有效率。如果您面临此类查询的性能问题,请查看HBase的二级索引。

    最有效的查询基于HBase表的行键。 我会使用用户名作为行键,以便能够快速获取特定用户所在位置的信息。每行需要一列-地点


    显然,要收集所有数据(查询2:在场馆X的用户是什么),您需要扫描整个(部分)表。所以它不会很有效率。查看HBase的二级索引—如果您在此类查询中遇到性能问题。

    因此,为了解决上述情况,我建议使用两个表:

  • 第一个表的行键将是userID(我还建议添加一些shard键,如(userID%HBase区域数),以均匀分布数据并避免热点)。此表将提供映射userID->vention,并检查特定用户将在哪里使用O(1)
  • 第二个表的行键将是venueID+userID(也以一些shard键作为前缀)。因此,您可以使用KeyOnlyFilter和PrefixFilter(前缀为场地)获取特定场地中的所有用户。这应该很快
  • 由于您使用Kafka和Spark,因此摄取两个表不会影响您的性能


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

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

  • 第一个表的行键将是userID(我还建议添加一些shard键,如(userID%HBase区域数),以均匀分布数据并避免热点)。此表将提供映射userID->vention,并检查特定用户将在哪里使用O(1)
  • 第二个表的行键将是venueID+userID(也以一些shard键作为前缀)。因此,您可以使用KeyOnlyFilter和PrefixFilter(前缀为场地)获取特定场地中的所有用户。这应该很快
  • 由于您使用Kafka和Spark,因此摄取两个表不会影响您的性能


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

    预计有多少用户和多少场馆?什么是读写比?预计每秒有多少个请求?这是一个新的实时查询实现。目前一切都将减少,但预计每个公共场所都将成为一个场馆。预计有多少用户和多少场馆?什么是读写比?预计每秒有多少个请求?这是一个新的实时查询实现。现在一切都会变少,但希望每一个公共场所都能成为一个场所。这是一个不错的方法。但是你认为它值得两个表吗?这种非规范化的主要开销是更新。但据我所知,在您的案例中,更新是在测试期间同时进行的。因此,您可以在两个表中保持数据同步。所以,我认为这应该行得通。很好的方法。但是你认为它值得两个表吗?这种非规范化的主要开销是更新。但据我所知,在您的案例中,更新是在测试期间同时进行的。因此,您可以在两个表中保持数据同步。所以,我认为这应该行得通。