【问题标题】:Timeseries: HBase vs OpenTSDB/KDB for range query with condition时间序列:HBase vs OpenTSDB/KDB 用于有条件的范围查询
【发布时间】:2019-01-29 17:12:04
【问题描述】:

我有大约 100,000 个用户。对于每个用户,我不断(每分钟)更改一组存储在 HBase 中的值(列)。行键看起来像userId-timestamp,其中timestamp 四舍五入到分钟。数据集不断增长,因为每分钟我都会获得另外 100,000 行。

我需要低延迟查询((userId, fromTimestamp, toTimestamp, step),其中from-to 可以包含不超过 1000 个项目。所以我使用的是 HBase 的范围查询。

棘手的部分是step 参数的值可能在 [1,5,15,60,360,1440] 中。如果step=5,查询应返回第 5、10、15、...分钟值。所以step=1440 是非常昂贵的查询。

您能否解释一下 OpenTSDB 或 KDB 在这个用例中哪个更快?为什么?

【问题讨论】:

  • 有很多问题可以问,也有很多未知数,但是是的,kdb 是为时间序列设计的,并且会针对类似时间序列的查询进行高度优化(特别是当数据经过预处理时)带有“属性” - 请参阅code.kx.com/q4m3/8_Tables/#88-attributes)。问题: 1 你是说小于 500 毫还是小于 500 微? 2. 您是否可以选择修饰传入的数据(例如,将数据预存储为 5、15、60 等步长) - 这将大大加快以后按存储桶/步进行的查询。
  • 问题 3。当您说“第 60 分钟”时,您是指从当前的 fromTime 分钟开始每隔 60 分钟,还是正好在整点(下午 1 点、下午 2 点、下午 3 点等)?

标签: time-series hbase kdb opentsdb


【解决方案1】:

为应用程序选择数据库系统取决于多种因素,因此回答您的问题并不那么简单。

但根据您提供的高级详细信息,KDB 绝对是可行的选择之一。

KDB 是一个时间序列、面向列的数据库。根据您的详细信息,您的应用程序似乎有相同的要求。

您的查询主要针对 2 列(用户 ID 和时间戳),其中一列是时间数据类型。 KDB 直接支持日期/时间数据类型,旨在为此类数据提供更好的性能。

一般来说,在这些情况下,面向列的数据库会比面向行的数据库执行得更好,因为它们读取的数据更少,并且可以更有效地管理和查询数据,因为数据是列的统一类型,因此它们可以应用其他优化。

DataSize:每分钟 100000 = 每小时 600 万。从 KDB 的角度来看,我想说的是一个中等大小的表。如果系统设计得当,KDB 查询不会在该大小的表上花费太多执行时间。

属性:KDB 还支持表上的属性,如排序、唯一、分组和分区。属性有助于查询更好地执行。例如,您可以存储按用户 ID 排序的数据,然后按每个用户 ID 的时间戳排序。排序属性将使查询使用二进制搜索而不是线性搜索。同样,其他属性也有其他有用的功能。

查询语言:查询语言是任何数据库系统的重要组成部分。 KDB 使用“Q”语言。它是一种功能强大的向量语言,具有很好的对向量进行操作的函数集合。

同样,您可以在 KDB 中轻松查询您的步骤。但正如您所提到的,这可能是获得目标延迟的一个棘手部分。但是有多种方法可以设计您的系统以提高此用例的性能。

KDB 中还有其他有用的功能来管理数据,例如将数据分发到多个节点、设置不同的进程和进程间通信。

这一切都取决于您如何设计系统以及如何将数据组织到表格中。

正如我一开始所说,选择数据库取决于多种因素。我建议在你的机器上设置 KDB(它非常简单)并对一小组数据进行测试以获得这个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2017-08-21
    • 1970-01-01
    • 2010-12-16
    • 2021-08-17
    • 2015-06-06
    • 2021-05-14
    相关资源
    最近更新 更多