Bigtable 行键场景避免热点?

Posted

技术标签:

【中文标题】Bigtable 行键场景避免热点?【英文标题】:Bigtable row key scenario to avoid hotspotting? 【发布时间】:2018-12-22 00:53:21 【问题描述】:

一家公司需要您在 Google Bigtable 中创建一个架构,以便对过去 2 年的记录进行历史分析。传入的每条记录每 15 分钟发送一次,并包含设备的唯一标识符和数据记录。最常见的查询是针对给定设备在给定日期的所有数据。您应该使用哪种架构?

A.行键:date#device_id,列数据:data_point 乙。 Rowkey:日期,列数据:device_id,data_point C. Rowkey: device_id, Column data: date, data_point D. Rowkey: data_point, Column data: device_id, date E.行键:date#data_point,列数据:device_id

上面的最佳选择是什么?

【问题讨论】:

这是一道作业题吗?请参阅How do I ask and answer homework questions? 了解更多信息。如果是这样,请对其进行注释。你认为它应该是什么,为什么?您看过有关 Bigtable 架构设计的文档吗? 谢谢。是的,我知道大表文档中的规范。但是这个问题的答案选项令人困惑。 如果你已经阅读了模式设计文档,你应该能够从列表中消除一些明显不好的选择,留下一些,然后你可以从剩下的集合中决定哪个是最好的,给定您想要运行的最频繁的查询类型——对于每个模式和每个查询(这里只有 1 个这样的查询),考虑如何实现这样的查询,并查看哪个模式提供了这样一个查询的最有效的实现.希望这会有所帮助。 是的,它不能是A,B,E,因为它以Date开头,这可能导致字典排序填充每个节点。我在这里对 C 或 D 选项感到困惑。只是 deviceid 可能会导致日期和数据点出现多个版本的 Column 数据。将 data_point 作为行键,我不确定这是否真的可以查询。您能否提供 C 或 D 中哪个是最佳选择的输入。 [我知道 deviceid#date 的行键将是这里的最佳选择,但想从上面的可用选项中了解最佳选择] Bigtable 具有内置的单元格版本控制:列中的每个值都有一个关联的 64 位时间戳,因此您可以在单行中为单列写入多个数据点,按时间键控.这有帮助吗? 【参考方案1】:

根据Bigtable schema documentation:

行按行键按字典顺序排序。

这意味着为了避免热点,普通查询应该返回连续的行结果。

本质上,您希望查询具有给定日期和设备 ID 的行。 Google Cloud Bigtable 允许您通过特定的行键前缀查询行。由于最常见的是查询给定设备和日期的所有数据,因此设备和日期需要成为行前缀查询的一部分,并且必须是行键中的前两个条目。

【讨论】:

the device and data need to be part of the row prefix query, 应该是the device and date,而不是data?我认为,如果您正在查询,您有设备和日期,以便您可以计算行键。 你说得对——我本来打算写日期。刚刚编辑了帖子。 :)【参考方案2】:

您有两种解决方案。 Big Table 使用执行组织的行键制作词典

1 - 在每个行键(前缀)之前添加一个字母,以强制大表创建一个词典索引,将您的行分布在字母表中,并避免在 i/o 期间发生冲突。这种技术称为盐渍表。

例如

123 456 789 101112 131415

a123 a456 b789 b101112 c131415

2- 您可以使用 MD5 哈希,避免在拥有之前重复前缀,这样可以保证各种前缀,并且大表将行键分布在实例的磁盘上。

【讨论】:

以上是关于Bigtable 行键场景避免热点?的主要内容,如果未能解决你的问题,请参考以下文章

BigTable:有没有更好的方法从部分行键中获取唯一值?

在不知道确切行键的情况下在 Bigtable 中查找最新时间戳

如果我正在设计一个应该搜索标签/列的应用程序,我将如何在 Bigtable 中设计一个行键?

Bigtable python客户端:如何检索大于给定值的最小行键

我的 BigTable 架构会导致热点吗?

如何从 bigtable 获取最近的数据?