Wie können große Zeitreihendaten effizient gespeichert werden?

27

Ich muss einige sehr große Mengen von Zeitreihendaten speichern und abfragen können.

Eigenschaften der Daten sind wie folgt:

  • Anzahl der Serien: rund 12.000 (zwölftausend)
  • Anzahl Datenpunkte, weltweit: rund 500.000.000 pro Monat (fünfhundert Millionen)
  • Mischwerttypen: Die Mehrheit der Datenpunkte sind Gleitkommawerte, der Rest sind Zeichenfolgen
  • Abtastperiode: variabel zwischen Serien sowie innerhalb einer Serie
  • Zeitstempel: Millisekundengenauigkeit
  • Datenaufbewahrungsdauer: mehrere Jahre, ohne Zerfall oder Downsampling
  • Datenarchive müssen nahezu in Echtzeit erstellt werden, eine angemessene Verzögerung (~ 1 Stunde) ist jedoch akzeptabel
  • Vergangene Daten können bei Bedarf zu hohen Kosten wiederhergestellt werden
  • Manchmal, aber sehr selten, müssen einige frühere Daten aktualisiert werden

Eigenschaften der geplanten Abfragen:

  • Bei den meisten Abfragen zu den Daten handelt es sich um zeitstempelbasierte Abfragen. von einem Tag bis zu mehreren Monaten / Jahren. Über 90% werden die neuesten Daten abgefragt

Andere Vorraussetzungen:

  • Die Lösung muss frei sein wie im Freibier und vorzugsweise Open Source

Mein erster Gedanke war, PyTables / Pandas mit HDF5-Dateien als Speicher für das Backend anstelle einer SQL-Datenbank zu verwenden.

Fragen :

  1. Angenommen, PyTables / Pandas ist die "beste" Route. Wäre es besser, die Daten in mehrere HDF-Dateien zu unterteilen, die sich jeweils über einen bestimmten Zeitraum erstrecken, oder alles in eine einzige Datei zu packen, die dann riesig werden würde?

  2. Soll ich das feste oder das Tabellenformat bevorzugen? Für mich sieht das feste Format in Ordnung aus, wenn ich eine HDF-Datei pro Monat behalte, da auf diese Weise wahrscheinlich eine ganze Reihe in den Arbeitsspeicher passt und ich den Arbeitsspeicher in Scheiben schneiden kann, ohne einen Tabellenformatindex zu benötigen. Hab ich recht ?

Und wenn dies nicht der beste Ansatz ist, wie sollte ich diesen Datenspeicher strukturieren oder welche Technologien sollte ich in Betracht ziehen? Ich bin nicht der erste, der sich mit dem Speichern großer Mengen von Zeitreihendaten befasst. Wie wird diese Herausforderung im Allgemeinen gelöst?


Andere Ansätze, die ich in Betracht gezogen habe:

  • Array-Datenbanken: Sie eignen sich hervorragend für Zeitreihen mit konstanter Abtastperiode, da Sie dann nur Start- und Endzeit sowie Abtastperiode des Arrays speichern müssen und dann nur Werte im Array selbst und die Indizierung einfach ist. Aber mit variablen Abtastperioden innerhalb der Serien selbst muss ich ein engeres Zeitstempel-Wert-Verhältnis beibehalten, das meiner Ansicht nach nicht so gut für Array-DBMS geeignet ist.
  • Standard-SQL-Datenbank mit Zeitstempel, Parameter-ID und Wert als Spalten, aber aufgrund ihrer Art fordern sie für jede Abfrage eine Menge Festplatten-E / A an
flyingmig
quelle
Sie sollten Array-Datenbanken in Betracht ziehen - de.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS . Ich sage nicht, dass einer von ihnen die richtige oder sogar die beste oder sogar eine gute Antwort wäre, nur dass sie in deine Gedanken eingehen sollten. Neben den Einträgen in dieser Liste gibt es das kdb-System ( kx.com ), obwohl es alles andere als kostenlos ist.
High Performance Mark
Danke für deinen Beitrag. Ich habe Array-Datenbanken in Betracht gezogen, aber das Problem dabei ist, dass sie sich hervorragend für Zeitreihen mit konstanter Abtastperiode eignen , da Sie dann nur Start- und Endzeiten und Abtastperiode des Arrays speichern müssen und dann nur Werte in Das Array selbst und die Indizierung sind einfach. Aber mit variablen Abtastperioden innerhalb der Serien selbst muss ich eine engere Zeitstempel-> Wertbeziehung einhalten, die meiner Ansicht nach nicht so gut für Array-DBMS geeignet ist. Vor diesem Hintergrund würde ich mich freuen, wenn ich das Gegenteil beweisen könnte.
Flyingmig
Bearbeitungsfrage, um hinzuzufügen, was ich bisher betrachtet habe
flyingmig
Frage: Müssen Sie alle Daten speichern? Können die Daten mit der Zeit abnehmen und / oder gibt es ein akzeptables Maß an Präzision für die floatbasierte Serie?
J Trana
1
@ moinuddin-quadri Am Ende habe ich pandas DataFrame-Objekte verwendet, die mit monatlichen HDF5-Dateien im Tabellenformat gesichert wurden. Das System läuft seit mehr als einem Jahr und hat sich als sehr stabil und schnell erwiesen, auch wenn keine SSD-Festplatten verwendet werden. Ich werde versuchen, das alles als Antwort aufzuschreiben, wenn ich Zeit habe. Ansonsten kannst du mich gerne kontaktieren.
Flyingmig

Antworten:

5

Vielleicht möchten Sie einen Blick auf Carbon und Whisper werfen , die Teil des Graphitprojekts sind . Carbon kann sehr große Mengen von Zeitreihendaten verarbeiten. Obwohl ich jetzt die Dokumente lese (es ist ein paar Jahre her, seit ich sie benutzt habe), sind es nur numerische Daten. Sie sagten, Sie haben auch String-Daten, so dass Sie dies möglicherweise nicht nützlich finden. Möglicherweise können Sie sich jedoch ein Bild davon machen, wie sie große Datenmengen schnell verarbeiten können.

Um Ihnen eine Vorstellung davon zu geben, wie gut es skaliert, als Graphit bei Orbitz erstmals in Produktion ging, wurden 160.000 Metriken pro Minute verarbeitet .

Bryan Oakley
quelle
Vielen Dank für den Vorschlag, aber nach meinem Verständnis passt das Flüstern nicht, weil es die zweite Genauigkeit ist, bei der Millisekundengenauigkeit erforderlich ist, und wie Sie zu Recht betont haben, habe ich auch Zeichenfolgendaten, die dort nicht gespeichert werden können.
Flyingmig
1
@flyingmig Schreibe Flüstern nicht so schnell ab. Die Zeitstempel sind Werte aus der Unix-Epoche. Und die "String-Daten", die Sie in der Frage beschrieben haben, klingen eher nach Aufzählungen, und diese werden normalerweise als kleine Ganzzahlen gespeichert.
Ross Patterson
Sears verwendet Carbon / Graphit / Ceres, um mehr als 4 Millionen Datenpunkte pro Minute zu speichern. Es ist nicht perfekt und erfordert Graphit-Clustering und SSDs, aber es funktioniert. Alle anderen Lösungen sind nicht auf dieses Niveau skalierbar, das wir gefunden haben, aber wenn Sie Ideen haben, können Sie sich
Kevin J. Rice
3

InfluxDB ist eine Open-Source-Datenbank, die in Go geschrieben wurde. Es wurde speziell für den Umgang mit Zeitreihendaten geschrieben und sie veröffentlichten Benchmarks, die eine weitaus bessere Leistung im Vergleich zu Cassandra zeigen :

InfluxDB übertraf Cassandra in allen drei Tests mit einem 4,5-fach höheren Schreibdurchsatz, 10,8-fach weniger Speicherplatz und bis zu 168-fach kürzeren Antwortzeiten für getestete Abfragen.

Dan Dascalescu
quelle
2

Möglicherweise möchten Sie spaltenorientierte Datenbanken auschecken. Ich bin nicht sicher, was Sie mit Array-Datenbanken meinen, aber mit meinem vorgeschlagenen Ansatz können Sie eine dynamische Anzahl von Werten pro Zeitrahmen haben. Sie können auch mehrere Werte für denselben Zeitstempel angeben. Der interessante Teil ist, dass Sie bei Werten, die zum gleichen Zeitpunkt gemessen wurden, diese als zusätzliche Spalten speichern können (z. B. einen Sensor, der Temperatur und Luftfeuchtigkeit misst, den Börsenkurs und die Größe eines Handels, ...). Aufgrund der Spaltenorientierung können Sie Tabellen mit 100 Spalten haben. Wenn Ihre Abfrage jedoch nur auf fünf Spalten zugreift, liest die Datenbank nur die Daten der fünf Spalten.

Ich habe eine Reihe über das Erstellen einer eigenen Zeitreihendatenbank geschrieben. Vielleicht möchten Sie sich diese ansehen:

hellomichibye
quelle