在Bigtable衍生产品中存储海量有序时间序列数据

39

我正在尝试弄清楚这些新型数据存储(如bigtable、hbase和cassandra)到底是什么。

我处理大量的股市数据,数十亿行价格/报价数据,每天可能会增加数百GB的数据量(尽管这些文本文件通常可以压缩至少一个数量级)。这些数据基本上只包含一些数字、两三个短字符串和一个时间戳(通常是毫秒级别)。如果我必须为每一行选择一个唯一的标识符,我将不得不选择整行数据(因为同一毫秒内,一个交易所可能会为同一股票产生多个值)。

我认为将此数据映射到bigtable(我包括其派生产品)的最简单方法是按照股票名称和日期进行映射(这可能会返回一个非常大的时间序列,超过一百万个数据点并不罕见)。从阅读它们的描述来看,这些系统似乎可以使用多个键。而且,我假设小数不适合作为键。

其中一些系统(例如Cassandra)声称能够执行范围查询。我是否能够高效地查询出某天11:00 am至1:30 pm之间所有MSFT的值呢?

如果我想在所有符号中搜索给定日期的价格在10美元到10.25美元之间的所有符号(因此我正在搜索值,并希望返回键作为结果),该怎么做?

如果我想获取两个时间序列,将一个序列从另一个序列中减去,并返回这两个时间序列及其结果,那么我是否必须在自己的程序中执行此逻辑?

阅读相关论文似乎表明,这些系统并不非常适合用于大规模的时间序列系统。然而,如果像谷歌地图这样的系统都是基于它们构建的,我认为时间序列应该也能很好地工作。例如,把时间看作x轴、价格看作y轴、符号看作命名位置——突然间,bigtable应该是时间序列的理想存储方式(如果可以存储整个地球、检索和缩放注释,那么股票市场数据应该是微不足道的)。

有没有专家可以指点我正确的方向或澄清任何误解。

谢谢

6个回答

21

我不是专家,但我已经玩了几天Cassandra,对你有一些答案:

  1. 不要担心数据量,如果你有$$$购买大型硬件集群,像Cassandra这样的系统中都是无关紧要的。

这些系统(例如Cassandra)中的一些声称能够执行范围查询。我能有效地查询在某一天中11:00am和1:30 pm之间的MSFT的所有值吗?

当你知道如何处理键时,Cassandra非常有用。它可以迅速地跨越键。因此,要搜索11:00 到1:30 pm之间的MSFT,你需要像这样键入行:

MSFT-timestamp,GOOG-timestamp,...等等 然后,您可以告诉Cassandra查找以MSFT-now开头并以MSFT-now+1小时间隔结束的所有键。

如果我想在给定日期搜索所有符号,并请求所有价格在$10和$10.25之间的符号(因此我正在搜索价值,并希望返回键作为结果),该怎么办?

我不是专家,但到目前为止我意识到Cassandra根本不会按值进行搜索。因此,如果您想要执行上述操作,则必须创建另一个专门用于此问题的表,并设计适合该情况的模式。但与我上面描述的并没有太大区别。这一切都关乎命名您的键和列。Cassandra可以非常快地找到它们!

如果我想获得两个时间序列,从一个中减去另一个,并返回两个时间序列及其结果,我是否必须在自己的程序中执行此逻辑?

正确,所有逻辑都在您的程序内部完成。这不是MySQL。这只是一个存储引擎。(但我相信下一个版本将提供这些功能)

请记住,我是一个新手,如果我错了,请随意纠正我。


1
当你说“你可以告诉Cassandra查找所有以MSFT-now开头并以MSFT-now+1小时结尾的键”时,你是指RowSlice查询吗?我的意思是,如果我要求Cassandra给我在t1和t2之间的所有行键,其中t是时间戳,这是否有效率?我听说在Cassandra中,行切片不如列切片高效? - Peter

13

12

我尊敬的某位人士推荐了Open Time Series Database,特别是他所见过的模式设计最好。

http://opentsdb.net/


1
OpenTSDB非常不错,但遗憾的是不适用于金融数据,特别是如果您试图存储具有超过一秒分辨率的tick数据(OpenTSDB目前仅支持秒级分辨率)。 - Datageek

2

我正在面对同样的问题。我的主要问题是无法在结果集上获取流,例如迭代器。

我已经查阅了文档和网络,但仍然没有找到解决方法。

由于数据量非常大,我无法获取所有键并获取行。


刚遇到了同样的问题。我希望有一种简单的方法来创建一个查询结果流。我可以快速地浏览它们,但不能一次性将它们全部放入内存中...你找到任何解决方案了吗? - em70

1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接