Wie speichere ich große Mengen strukturierter Daten?

9

Die Anwendung sammelt kontinuierlich (ungefähr jede Sekunde) den Standort der Benutzer und speichert sie.

Diese Daten sind strukturiert. In einer relationalen Datenbank würde es gespeichert als: | user | timestamp | latitude | longitude |

Es gibt jedoch zu viele Daten. Täglich werden 60 × 60 × 24 = 86.400 Datensätze pro Benutzer erstellt. Selbst bei 1000 Benutzern bedeutet dies 86.400.000 Datensätze täglich.

Und es sind nicht nur 86.400.000 Datensätze täglich. Weil diese Datensätze verarbeitet werden und die verarbeiteten Versionen davon ebenfalls gespeichert werden. Multiplizieren Sie diese Zahl also mit ungefähr 2.

Wie ich die Daten verwenden möchte

Im Wesentlichen plane ich, gröbere Versionen von Standortdaten zu erstellen, um den Verbrauch zu vereinfachen. Das ist:

  1. Sortieren Sie die empfangenen Daten nach Zeitstempeln.
  2. Stellen Sie anhand dieser Liste der Reihe nach fest, ob sich der Standort erheblich geändert hat (indem Sie überprüfen, um wie viel sich der Breiten- und Längengrad geändert hat).
  3. Stellen Sie die nicht signifikanten Standortänderungen als einen einzelnen Eintrag in der Ausgabe dar (daher ist die Ausgabe eine gröbere Version der Standortdaten).
  4. Iterieren Sie diesen Prozess auf der Ausgabe, indem Sie eine noch größere Änderung des Breiten- und Längengrads für eine signifikante Änderung erfordern. Daher ist die Ausgabe, die aus der vorherigen Ausgabe erzeugt werden soll, noch grobkörniger.
  5. Iterieren Sie den gesamten Prozess so oft wie nötig.
  6. Sammeln Sie eine Reihe von Auflösungen und senden Sie sie an Benutzer. Speichern Sie außerdem alle Auflösungen der Daten für den späteren Verbrauch.

Womit soll ich diese Daten speichern? Sollte ich eine relationale Datenbank oder eine NoSQL-Lösung verwenden? Welche anderen Dinge sollte ich beim Entwerfen dieser Anwendung beachten?

Utku
quelle
3
Solche 2000 Datensätze pro Sekunde werden eine aktuelle SQL-Engine wahrscheinlich nicht stören. Ein einfacher Kapazitätstest wäre, ein Konsolenprogramm dazu zu bringen, einige zufällige Dateien zu schreiben, die in großen Mengen geladen werden.
Caleth
1
@ Caleth Aber ist es skalierbar? Was ist, wenn die Benutzerbasis 100-mal wächst?
Utku
3
Messen Sie, was Ihre Hardware derzeit verarbeiten kann. Der Engpass ist wahrscheinlich entweder die "Verarbeitung" der Werte durch die CPU oder die Geschwindigkeit der Rohplatte. Was wollen Sie zu tun , mit all diesen Daten? Das sollte
bestimmen,
3
Caleth hat absolut recht. Millionen von Datensätzen beeinträchtigen ein modernes Datenbanksystem nicht. NoSQL-Stores sind sehr gut darin, sehr schnell große Datenmengen zu schreiben , aber letztendlich möchten Sie etwas tun, bei dem Sie die Dinge erneut lesen müssen . Wie viel Lesen Sie häufig benötigen, hängt davon ab, welche Art von Geschäft Sie verwenden sollten.
Kilian Foth
3
Um eine gute Antwort zu geben, müssen wir wissen, wie Sie diese Daten verwenden möchten. Eine Datenbank ist möglicherweise eine gute Wahl, wenn Sie Ad-hoc-Abfragen wünschen, während eine dateibasierte Lösung wahrscheinlich besser für die Analyse des gesamten Datensatzes geeignet ist. Abstimmung zum Schließen.
kdgregory

Antworten:

9

Einige Alternativen zum Speichern dieser Daten:

  1. Nachrichtenwarteschlange (möglicherweise verteilt), wie Apache Kafka

Dies wird für das Schreiben und Lesen eines Datenstroms optimiert. Es ist ideal zum Sammeln von Datenströmen in einem einfach zu verarbeitenden Format, kann jedoch normalerweise nur durch Auslesen des gesamten Streams abgefragt werden. Dies wäre also entweder zu Archivierungszwecken oder ein Zwischenschritt auf dem Weg zu einer Verarbeitungsschicht.

  1. Relationale Datenbanken)

Sie können es einfach in die Datenbank schreiben. Wenn das Volume die Kapazität der zu verarbeitenden Datenbank überschreitet, können Sie die Datenbank sharden (= mehrere Teilmengen der Daten befinden sich auf verschiedenen Datenbankservern). Vorteil: Sie können eine relationale Datenbank verwenden und müssen nichts Neues lernen. Nachteil: Jeder Code, der sich mit der Datenbank befasst, muss wissen, auf welchem ​​Shard welche Daten leben. Aggregierte Abfragen müssen in der Anwendungssoftware durchgeführt werden.

  1. Verteilte NoSQL-Datenbank wie Cassandra.

Sie schreiben Ihre Daten in eine verteilte NoSQL-Datenbank, die die Daten automatisch für Sie zersplittert. Mit Cassandra können Sie Abfragen im gesamten Cluster ausführen, wobei weniger Anwendungscode erforderlich ist, um wieder auf die Daten zurückzugreifen. Vorteil: natürlicher geeignet für große Datenmengen, Nachteil: Erfordert spezifisches Fachwissen und ein tiefes Verständnis der Funktionsweise dieser Systeme, um eine gute Leistung zu erzielen und die Daten gemäß Ihren Anforderungen abfragbar zu machen. NoSQL ist kein magischer Performance-Fix, sondern eine Reihe von Kompromissen, die verstanden werden müssen, um navigiert zu werden.

  1. Hadoop / Datei

Die Daten werden an Dateien angehängt, die von der Hadoop-Plattform automatisch auf die Server verteilt, auf diesen Servern mit Tools wie M / R oder Apache Spark verarbeitet und schließlich (als Datei) mit einer Hadoop SQL-Engine wie Hive oder Impala abgefragt werden.

Welche soll ich wählen?

Die Kompromisse zwischen diesen Alternativen sind komplex und hängen sehr stark von Ihren Schreib- und Lesemustern ab. Die einzige Person, die über diese Kompromisse entscheiden kann, sind Sie. Wenn Sie nicht die Zeit haben, ein tiefes Verständnis für diese Alternativen aufzubauen, verwenden Sie einfach eine relationale Datenbank und finden Sie im Laufe der Zeit eine Sharding-Lösung heraus. Höchstwahrscheinlich YAGNI .

Joeri Sebrechts
quelle
Ich habe weitere Details dazu angegeben, wie ich die Daten verwenden möchte. Möchten Sie angesichts dieser Informationen etwas hinzufügen?
Utku
Mir ist immer noch nicht ganz klar, was Sie unter "Auflösung" verstehen. Möchten Sie auf geografischer Ebene (Stadt, Bundesland, ...) oder auf einem Koordinatensystem wie einem Geohash aggregieren? Oder interessieren Sie sich für die Höhe des Deltas, weil Sie Benachrichtigungen basierend auf Bewegungsschwellen erstellen möchten? Kurzum: Wofür ist das alles?
Joeri Sebrechts
Es dient zur Verfolgung von Benutzern. Benutzer verfolgen sich gegenseitig, und ich zeichne grafisch auf, wo sich die Benutzer, die sie verfolgen, in den letzten 5 Stunden auf den Geräten befunden haben. Je feiner gemasert, desto besser. Mobile Geräte verfügen jedoch nur über einen begrenzten Speicherplatz. Daher können Sie die Daten nicht senden, ohne die Auflösung zu verringern. Nehmen wir an, Benutzer A verfolgt Benutzer B, C und D. Wenn ich einfach die Standortdaten, die ich von B, C und D erhalte, an A weiterleiten kann, ohne sie auf der Serverseite zu verarbeiten, wird der Speicher des Geräts von Benutzer A sehr schnell voll . Daher muss ich etwas verarbeiten.
Utku
Wenn ich das erstellen würde, was Sie beschreiben, würde ich es als eine Reihe von Kafka-Protokollen erstellen, die über Funken-Streaming verbunden sind, wobei die Positionen über Fenster im Funken-Stream integriert sind und das endgültige Ausgabe-Kafka-Protokoll als Pull- und bereitgestellt wird Push-Web-APIs an die Kunden. Allerdings ... das ist eine Menge sehr spezieller Technologie, und abhängig von Ihrem Hintergrund und der verfügbaren Zeit können diese Entscheidungen für Sie falsch sein.
Joeri Sebrechts
Vielen Dank. Ich werde das berücksichtigen, aber nach dem YAGNI-Prinzip plane ich, vorerst eine relationale Datenbank zu verwenden. Wenn es nötig ist, werde ich zu etwas wechseln, das besser zur Anwendung passt. Bitte zögern Sie nicht, Informationen in Ihrer Antwort zu bearbeiten, wenn Sie möchten.
Utku
6

Schauen Sie sich Ihre Anforderungen etwas genauer an. Es gibt eine Möglichkeit, jede Sekunde die Illusion einer Verfolgungsposition zu erzeugen.

Wenn Sie eine App haben, die Ihren aktuellen GPS-Standort kennt und in eine Datenbank schreibt, warum sollten Sie den Standort dann weiter schreiben, wenn er sich nicht ändert? Selbst wenn Sie die Daten benötigen und der Benutzer 7 Stunden lang geschlafen hat, können Sie die fehlenden Zeitfenster programmgesteuert mit einem doppelten Speicherort ausfüllen, um Ihre Berechnungen oder Zuordnungen durchzuführen, oder was auch immer Sie sonst noch tun müssen.

Wenn Sie den Standort jede Sekunde verfolgen, müssen Sie diese Daten für immer speichern? Sie können die Datensätze in einer anderen Datenbank archivieren, um zu verhindern, dass die aktuelle Tabelle zu groß wird. Oder Sie können einfach die Aufzeichnungen aufbewahren, in denen sich die Position ändert. Dies ist in Data Warehouses üblich.

JeffO
quelle
2

Ihre Daten sind eine Reihe von Zeitreihen. Sie haben Sätze von Zahlen angegeben (zwei pro Benutzer), die sich mit der Zeit entwickeln. Normalerweise suchen Sie KEINEN relationalen Speicher, sondern einen RRD-Speicher. Dieser Speicher konzentriert sich stark auf die Reduzierung der E / A-Arbeit zahlreicher kleiner Schreibvorgänge durch Pufferung.

Relationale Speicherung ist eine Häresie für dieses Volumen von Zeitreihen. Seien Sie jedoch gewarnt, dass die Entwicklung von RRD in Bezug auf programmierbare Exploits nicht so gut unterstützt wird wie SQL. Sie möchten wahrscheinlich ernsthafte Integrationsarbeiten durchführen, die jedoch angesichts Ihrer Anforderungen kaum zu vermeiden sind.

Arthur Havlicek
quelle