gpt4 book ai didi

hadoop - Hbase rowkey 用于跟踪实体的状态并避免全表扫描

转载 作者:可可西里 更新时间:2023-11-01 15:30:09 27 4
gpt4 key购买 nike

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

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

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

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

有没有为了避免全表扫描而设计rowkey?


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

但这并不能真正帮助...


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

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

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

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

最佳答案

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

更新以任何顺序到达

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

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

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

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

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

关于hadoop - Hbase rowkey 用于跟踪实体的状态并避免全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35302412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com