如何有效地存储大时间序列数据?


27

我需要存储并能够查询一些非常大的时间序列数据。

数据的属性如下:

  • 系列数:约12.000(1.2万)
  • 全球数据点数量:每月约5000亿(五亿)
  • 混合值类型:大多数数据点为浮点值,其余为字符串
  • 采样周期:系列之间以及系列内的变量
  • 时间戳:毫秒精度
  • 数据保留期:数年,无衰减或下采样
  • 数据存档需要近乎实时地构建,但是可以接受合理的延迟(〜1小时)
  • 如果需要,可以重建过去的数据,但是成本很高
  • 有时(但很少),需要更新一些过去的数据

预想查询的属性:

  • 针对数据的大多数查询将是基于时间戳的查询;从一天到几个月/年不等。90%以上将是对最新数据的查询

其他需求:

  • 解决方案必须像免费啤酒一样免费,最好是开源的

我最初的想法是将带有HDF5文件的 PyTables / Pandas 用作存储后端,而不是SQL数据库。

问题:

  1. 假设PyTables / Pandas是“最佳”途径,将数据拆分成多个HDF文件,每个文件跨越一个给定的时间,还是将所有内容都放入一个单独的文件中,然后再变得庞大会更好吗?

  2. 我应该选择固定格式还是表格格式?对我来说,如果我每月保留一个HDF文件,则固定格式看起来还可以,因为这样一来,整个系列就可以放入RAM中,并且可以在内存中切片而不需要表格式索引。我对么 ?

如果那不是最好的方法,那么我应该如何构造该数据存储或应该考虑哪些技术?我不是第一个处理存储大量时间序列数据的人,解决此难题的一般方法是什么?


我考虑过的其他方法:

  • 数组数据库:它们非常适合具有恒定采样周期的时间序列,因为您只需要存储数组的开始和结束时间以及采样周期,然后只需要数组本身中的值和索引即可。但是,由于序列本身具有可变的采样周期,因此我需要保持更紧密的timestamp-> value关系,我认为这不太适合数组DBMS。
  • 标准SQL数据库,其中带有时间戳,paramID,值作为列,但根据其性质,它们为任何查询都请求大量磁盘I / O

您应该考虑使用数组数据库-en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS。我并不是说其中之一是正确的答案,甚至是最好甚至足够好的答案,只是他们应该输入您的想法。除了该列表中的条目之外,还有kdb系统(kx.com),尽管它远非免费。
高性能Mark

谢谢您的意见。我考虑过数组数据库,但是我发现的问题是它们非常适合具有恒定采样周期的时间序列,因为您只需要存储数组的开始和结束时间以及采样周期,然后只存储值即可。数组本身和索引很容易。但随着可变采样周期一系列的自己,我需要保持更紧密的timestamp->价值关系,在我看来是没有这样一个很好的适合阵列DBMS。话虽如此,我很高兴被证明是错误的。
flyingmig 2015年

编辑问题以添加我到目前为止所考虑的内容
flyingmig 2015年

问题:是否需要存储所有数据?数据是否会随时间衰减和/或基于浮点数的序列有某种可接受的精度水平?
J特拉纳2015年

1
@ moinuddin-quadri我最终使用了熊猫DataFrame对象,该对象由使用表格式的每月HDF5文件支持。该系统已经运行了一年多,并且显示出非常稳定和快速,甚至没有使用SSD磁盘。有时间的时候,我会尝试将所有内容写出来作为答案。否则,随时欢迎我。
flyingmig '16

Answers:


5

您可能想看看石墨项目的一部分耳语。Carbon可以处理大量时间序列数据。不过,现在我阅读了文档(使用以来已经有几年了),但是它仅用于数字数据。您说您也有字符串数据,所以您可能觉得这没有用。但是,您也许可以收集一些关于它们如何快速处理大量数据的智慧。

为了让您了解缩放的程度,当石墨在Orbitz首次投入生产时,它每分钟处理160,000个指标


谢谢您的建议,但根据我的理解,耳语不适合,因为当我需要毫秒精度时,耳语的精度是第二位,并且如您所正确指出的那样,我还有无法存储在那里的字符串数据。
flyingmig 2015年

1
@flyingmig不要这么快就写悄悄话。它的时间戳是Unix-epoch值。您在问题中描述的“字符串数据”听起来更像枚举,它们通常存储为较小的整数值。
罗斯·帕特森

Sears正在使用Carbon / Graphite / Ceres每分钟存储4M +个唯一数据点。它不是完美的,它需要石墨簇和SSD,但是可以工作。其他所有的解决方案在那里没有扩展到这个水平,我们已经找到,但如果你有想法,在随意附和。
凯文J.赖斯


2

您可能想检出面向列的数据库。我不确定阵列数据库的含义,但是通过我建议的方法,您可以在每个时间范围内获得动态数量的值。对于同一时间戳,您还可以具有多个值。有趣的是,如果您在同一时间戳下测量了值,则可以将它们另存为其他列(例如,测量温度和湿度,股票交易价格和交易规模的传感器...)。由于面向列的性质,您可以拥有包含100列的表,但是如果查询仅访问五列,则数据库仅读取五列的数据。

我写了有关创建自己的时间序列数据库的系列文章,您可能想看看它:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.