¿Cómo almacenar eficientemente datos de series de tiempo grandes?

27

Necesito almacenar y poder consultar datos de series temporales de cantidades muy grandes.

Las propiedades de los datos son las siguientes:

  • Número de series: alrededor de 12.000 (doce mil)
  • Número de puntos de datos, globalmente: alrededor de 500.000.000 por mes (quinientos millones)
  • tipos de valores mixtos: la mayoría de los puntos de datos son valores de punto flotante, el resto son cadenas
  • período de muestreo: variable entre series y dentro de una serie
  • marcas de tiempo: precisión de milisegundos
  • período de retención de datos: varios años, sin descomposición ni disminución de resolución
  • los archivos de datos deben construirse casi en tiempo real, pero un retraso razonable (~ 1 hora) es aceptable
  • los datos pasados ​​se pueden reconstruir si es necesario, pero a un alto costo
  • a veces, pero muy raramente, algunos datos pasados ​​necesitan ser actualizados

Propiedades de las consultas previstas:

  • la mayoría de las consultas contra los datos serán consultas basadas en marca de tiempo; que van desde un día hasta varios meses / años. Más del 90% serán consultas sobre los datos más recientes

Otros requerimientos:

  • la solución debe ser libre como en cerveza gratis y preferiblemente de código abierto

Mi pensamiento inicial fue usar PyTables / Pandas con archivos HDF5 como almacenamiento de backend en lugar de una base de datos SQL.

Preguntas:

  1. Suponiendo que PyTables / Pandas es la "mejor" ruta, ¿sería mejor dividir los datos en varios archivos HDF, cada uno abarcando un período de tiempo determinado, o poner todo en un solo archivo que luego se volvería enorme?

  2. ¿Debo ir y preferir el formato fijo o el formato de tabla? Para mí, el formato fijo se ve bien si mantengo un archivo HDF por mes, ya que de esta manera toda una serie probablemente cabe en la RAM y puedo cortar en la memoria sin necesidad de un índice de formato de tabla. Estoy en lo correcto ?

Y si ese no es el mejor enfoque, ¿cómo debería estructurar este almacén de datos o qué tecnologías debería considerar? No soy el primero en abordar el almacenamiento de grandes conjuntos de datos de series temporales, ¿cuál es el enfoque general para resolver este desafío?


Otros enfoques que he considerado:

  • bases de datos de matriz: son ideales para series de tiempo con un período de muestreo constante, ya que solo necesita almacenar las horas de inicio y finalización y el período de muestreo de la matriz, y luego solo los valores en la matriz en sí y la indexación es fácil. Pero con períodos de muestreo variables dentro de las propias series, necesito mantener una relación de marca de tiempo más cercana-> valor, que en mi opinión no es tan buena para la matriz DBMS.
  • base de datos SQL estándar con marca de tiempo, paramID, valor como columnas pero, por su naturaleza, solicitan una gran cantidad de E / S de disco para cualquier consulta
Flyingmig
fuente
Debe considerar las bases de datos de matriz: en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS . No estoy diciendo que una de ellas sea la respuesta correcta, o incluso la mejor o incluso la suficiente, solo que deberían entrar en tus pensamientos. Además de las entradas en esa lista, existe el sistema kdb ( kx.com ), aunque está lejos de ser gratuito.
Alto rendimiento Mark
Gracias por su aporte. He considerado las bases de datos de la matriz, pero el problema que encuentro con estas es que son ideales para series temporales con un período de muestreo constante , ya que solo necesita almacenar las horas de inicio y finalización y el período de muestreo de la matriz, y luego solo los valores en La matriz en sí y la indexación es fácil. Pero con períodos de muestreo variables dentro de las propias series, necesito mantener una relación de marca de tiempo más cercana-> valor, que en mi opinión no es una buena opción para el DBMS de matriz. Dicho esto, estaría feliz de que me demuestren que estoy equivocado.
flyingmig
pregunta de edición para agregar lo que he considerado hasta ahora
flyingmig
Pregunta: ¿necesita almacenar todos los datos? ¿Pueden los datos decaer con el tiempo y / o hay algún nivel aceptable de precisión para las series basadas en flotantes?
J Trana
1
@ moinuddin-quadri Terminé usando objetos Pandas DataFrame respaldados por archivos HDF5 mensuales con formato de tabla. El sistema ha estado funcionando durante más de un año y se ha mostrado muy estable y rápido, ni siquiera utilizando discos SSD. Intentaré redactar todo eso como respuesta cuando tenga tiempo. Siéntase libre de enviarme un mensaje privado.
flyingmig

Respuestas:

5

Es posible que desee echar un vistazo al carbono y al susurro , parte del proyecto de grafito . El carbono puede manejar grandes cantidades de datos de series temporales. Sin embargo, ahora que leí los documentos (han pasado algunos años desde que lo he usado), es solo para datos numéricos. Dijiste que también tienes datos de cadena, por lo que es posible que no te resulte útil. Sin embargo, es posible que pueda obtener cierta sabiduría sobre cómo pueden procesar grandes cantidades de datos rápidamente.

Para darle una idea de qué tan bien escala, cuando el grafito se puso en producción por primera vez en Orbitz, manejaba 160,000 métricas por minuto .

Bryan Oakley
fuente
Gracias por la sugerencia, pero, según tengo entendido, el susurro no encaja porque su precisión es la segunda cuando necesito una precisión de milisegundos y, como acertadamente señaló, también tengo datos de cadena que no se pueden almacenar allí.
flyingmig
1
@flyingmig No escribas susurros tan rápido. Sus marcas de tiempo son valores de época Unix. Y los "datos de cadena" que describió en la pregunta suenan más como enumeraciones, y generalmente se almacenan como valores enteros pequeños.
Ross Patterson
Sears está utilizando carbono / grafito / ceres para almacenar 4 millones de puntos de datos únicos por minuto. No es perfecto y requiere agrupación de grafito y SSD, pero funciona. Todas las otras soluciones no son escalables a este nivel, que hemos encontrado, pero si tiene ideas, no dude en intervenir.
Kevin J. Rice el
3

InfluxDB es una base de datos de código abierto escrita en Go. Se ha escrito especialmente para manejar datos de series temporales, y publicaron puntos de referencia que muestran un rendimiento mucho mejor frente a Cassandra :

InfluxDB superó a Cassandra en las tres pruebas con un rendimiento de escritura 4.5 veces mayor, al usar 10.8 veces menos espacio en disco y entregar tiempos de respuesta hasta 168 veces más rápidos para consultas probadas.

Dan Dascalescu
fuente
2

es posible que desee consultar bases de datos orientadas a columnas. No estoy seguro de lo que quiere decir con bases de datos de matriz, pero con mi enfoque sugerido puede tener un número dinámico de valores por marco de tiempo. También puede tener múltiples valores para la misma marca de tiempo. La parte interesante es que si tiene valores medidos en la misma marca de tiempo, puede guardarlos como columnas adicionales (por ejemplo, un sensor que mide la temperatura y la humedad, el precio de cotización y el tamaño de una transacción, ...). Debido a la naturaleza orientada a columnas, puede tener tablas con 100 columnas, pero si su consulta solo accede a cinco columnas, la base de datos solo lee los datos de las cinco columnas.

Escribí una serie sobre cómo crear su propia base de datos de series de tiempo, es posible que desee echarle un vistazo:

hellomichibye
fuente