【问题标题】:Hbase rowkey to keep track of an entity's state and avoid full table scansHbase rowkey 跟踪实体的状态并避免全表扫描
【发布时间】:2016-02-09 21:21:17
【问题描述】:

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

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

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

我的设计问题是我必须进行全表扫描才能响应查询。

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


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

但这并没有真正的帮助......


另一种选择是为每个州创建一个表,然后我可以执行以下操作:

  • 对于实体 E1 - 接收 event-transition-to-s1:-> 将实体放入 Table-S1
  • 对于实体 E1 - 接收 event-transition-to-s2:-> 从 Table-S1 中删除实体并将实体添加到 Table-S2

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

这种方法的问题在于它不是幂等的。如果系统中发生某些事情并且我将事件弄乱了,我会遇到问题。

【问题讨论】:

  • 非生命周期数据有多大?还是只是实体键和状态?状态可以存储为字节 1,2,3,4 吗?
  • @MartinSerrano 是的,状态可以存储为位图中的数字或位。我打算存储转换的日期,但我不必将这些数据保存在 HBase 中
  • 还有其他疑问吗?您对磁盘空间利用率有多敏感?一些解决方案涉及以多种方式存储数据。
  • @MartinSerrano - 让我们只专注于那个查询。
  • 真的只有 4 个州还是有时更多?

标签: hadoop mapreduce hbase


【解决方案1】:

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

更新以任何顺序到达

制作行键State-entityId。然后,列数据可以是过渡日期。为状态转换写一行时:

  • 检查此实体的所有后续状态是否存在,如果存在,则放弃更新
  • 为所有以前的状态发出删除(以处理乱序更新)
  • 添加新的。

在这样的解决方案中,必须考虑同时更新。有多种处理策略,但全面考虑需要对架构的客户端有更多了解。状态更新是否有可能同时到达同一个实体?大概,或者他们不能乱序。如果是这样,所有检查、删除和更新都可以按任何顺序进行。如果没有某种类型的外部锁定,上述方案将无法工作,而这种外部锁定对于数十亿行来说是不可能的。

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

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

【讨论】:

  • 谢谢,我想在您输入此内容时,我用替代方法更新了问题。在您的解决方案中,我如何解释消息无序到达的情况(对不起,我知道这不是原始问题陈述的一部分)。
  • 我现在有一个部分解决方案,我再想一想,我需要上车!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2019-07-17
  • 2015-12-04
  • 2014-02-07
相关资源
最近更新 更多