当前位置: 首页 > 知识库问答 >
问题:

HBase表键设计与重复和区域服务器热点检测

卫弘懿
2023-03-14

我需要存储由用户ID标识的用户生成的事件。每个用户都属于由CompanyID标识的公司。我在HBase中提出了一个表的设计,如下所示:

行键:

column-family:info(封装事件属性集,如下所示)

列: , ....

我知道这种密钥设计将方便以后通过使用部分密钥扫描在companyId和/或userId上查询数据。说到这里,我有一些问题和关切,想要得到一些想法。

1-如果我们有一个读取用例,在给定的时间范围内读取所有数据,那么在当前的设计中,我们将无法使用行键。相反,我们必须在时间戳字段(作为attr列之一单独维护)上进行全扫描和筛选行,我在这里是不是完全离谱了?

2-如何处理重复?我知道HBase在这种情况下会创建一个新版本的行,但它会允许以后根据1中提到的读取使用酶进行读取吗?我知道您可以在查询时控制版本,但这是一个好的设计还是不正确地重载本机功能?

3-这是关于区域服务器热点检测。我们没有单片密钥,但我们仍然可以运行到这个问题,如果说,一个特定的公司或用户是非常活跃的。基于服务器数量的散列和桶式处理在这种情况下不起作用吗?如果我们对timestamp字段进行哈希,并将其附加到行键而不是原始值,那就可以了?但问题是无法扫描密钥的时间戳组件。我们必须在一个列中有一个单独的列(attr)来捕获它。有什么建议吗?

非常感谢任何输入(评论,链接,书籍,想法),可以提供。

共有1个答案

华献
2023-03-14

1:阅读用例

这取决于您的用例:

>

  • 如果您希望在给定的时间范围内为一个组织获取每个用户的数据,那么您所获得的数据在我看来是正确的,您必须对所有的组织数据进行扫描。

    如果您希望读取给定的所有数据,您当前的键设计似乎很好。虽然我会翻转组织和用户id位置,生成新的密钥(rowkey:userId-companyId-timestamp)。这将是因为来自独立用户的数据是不相交的,这些数据现在不需要耦合在一起。

    如果您在顶部按下时间戳(rowkey:timestamp-companyId-userId),您可能能够对所有orgs/all users信息运行扫描,扫描结束于时间范围定义的位置(跳过全表扫描)

    2:重复

    注意:Hbase默认情况下最多记录一个单元格的3个版本(也不要将这些版本时间戳与您的行键上的时间戳混淆)。您可以增加这个限制并从不同的版本中提取结果,但是不建议将这个版本计数设置为高值。

    如果您打算重写以前保存的值,我建议不要依赖于查找以前保存的版本(尽管有实现这一点的方法)。如果您必须能够保存/提取所有以前记录的数据,您也可以使用新列来存储新值。

    3:热点地区

    >

  • 如果公司非常活跃,可以将companyId-userId的哈希添加到行键中。这将在任何组织上分发写的内容。

    如果一个用户非常活跃,并且有一个用例可以以最优的方式取回它的所有数据,那么我不确定对密钥或时间戳进行散列是一个好的解决方案。您肯定希望将用户的数据保存在一起,但我不确定这里的更好解决方案是什么。

    根据我对问题的理解,我可能会将行键设计为HASH(companyId-UserId)-companyid-userid-timestamp

  •  类似资料:
    • 我正在尝试配置一个 hbase 客户端来连接到在泊客容器中运行的 HBase。鉴于它是出于集成测试目的,我们可以将主服务器和区域服务器硬编码(将它们全部放在同一个地址)。 我们使用云集分布,但我想这应该是一样的。我已经在组织.apache.hadoop.conf.configuration中定义了“hbase.master”。

    • 我最近安装了hadoop-2.4.0和hbase-0.95.18

    • 贡献者:Raymondcode 关于各种非 RDBMS 数据存储建模的优缺点,可以在 Ian Varley 的硕士论文 No Relation: The Mixed Blessings of Non-Relational Databases 中找到。虽然有点过时,但是如果你想了解 HBase schema 的建模方式和 RDBMS 的实现方式有什么区别的话,可以当做背景知识阅读一下。另外,阅读 k

    • Bigtable是区域服务还是区域服务?我读到Bigtable是一个区域服务,然后我看到Bigtable的区域复制现在已经在GA中了。Bigtable和Datastore的区别是什么,我看到Bigtable是一种IaaS,数据存储是完全管理的,谁能解释一下这两者之间的区别,有点混乱。谢谢

    • Java编译器特性、服务缓存以及一些初始化操作,使服务一般在刚启动时响应较慢。所以服务端启动时如果不想在注册完成后,立即被调用端按照配置权重打入流量,则可以通过设置预热时间让流量慢慢进来,从而减少因服务节点启动带来的耗时长引发失败率可能变高的问题。 实现方式是服务端将预热时间写入注册中心,调用端在服务发现后根据预热时间和服务节点启动时间计算出当前时刻的权重,随着时间的增长线性增加该节点的权重,由此

    • 本文向大家介绍C#全局热键设置与窗体热键设置实例,包括了C#全局热键设置与窗体热键设置实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#全局热键设置与窗体热键设置,分享给大家供大家参考。具体实现方法如下: 1、窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyD