首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hbase行键以跟踪实体的状态并避免全表扫描

Hbase行键以跟踪实体的状态并避免全表扫描
EN

Stack Overflow用户
提问于 2016-02-09 21:21:17
回答 1查看 258关注 0票数 1

我需要在架构设计方面的帮助。

我有数十亿的实体,每个实体都有一个静态的生命周期。这意味着一个实体通过州S1->S2->S3->S4毕业;其中S1是开始,S4是结束。

一个典型的查询是:显示Sn-1中的记录,而不是Sn中的记录。Sn-1中的大多数实体最终将到达Sn。我得到一个事件,每次实体更改状态。

我的设计的问题是,我必须做一个全表扫描来响应查询。

是否有行键设计以避免全表扫描?

或者,我可以将我的密钥更改为:entityId-State

但这不会有帮助..。

另一种选择是为每个国家创建一个表格,然后我可以做以下工作:

  • 对于实体E1 -接收事件-转换到-s1:->将实体放在表-s1中
  • 对于实体E1 -接收事件-转换到-s2:->从表-s1中删除实体并将实体添加到表-s2

这样,当他们查询时,向我显示S1中的所有事件,而不是S2中的事件,我只会在表-S1中显示所有的内容。

这种方法的问题在于它不是幂等的。如果系统中发生了什么事情,而我把事情弄得乱七八糟,我会遇到问题。

EN

回答 1

Stack Overflow用户

发布于 2016-02-09 22:33:21

对于查询Sn-1 ,在中显示记录,但不显示

更新更新,按任何顺序到达

使行键State-entityId。然后,列数据可以是转换日期。为状态转换编写行时:

  • 检查该实体的所有后续状态是否存在,如果存在,请放弃更新
  • 为所有以前的状态发出删除命令(以处理无序更新)
  • 加上新的。

在这样的解决方案中,必须考虑同时更新。有各种处理策略,但要充分考虑需要更多地了解体系结构的客户端。是否有可能同时对同一实体进行状态更新?想必,否则他们就不能扰乱秩序了。如果是这样,所有的检查、删除和更新都可以按任何顺序进行。然后,如果没有某种类型的外部锁定,上面的方案就无法工作,而这种锁在数十亿行中是不可能可行的。

我假设州的数量很小(对许多州来说意味着大量的删除)。由于entityId在行键中,您可能会避免热点。

然后,可以根据所需的状态进行前缀范围扫描。由于删除了以前的状态,您知道对Sn的扫描将(通常)没有状态Sn+1中的记录。由于无法以原子方式执行删除和添加操作,因此将出现小窗口。但是,假设您的查询是从更新异步执行的(而且它们可能是无序的),所以无论如何,您都不能保证查询执行完全一致的固定时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35302412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档