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 :
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?
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
quelle
Antworten:
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 .
quelle
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 :
quelle
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:
quelle