0

Ich muss Daten aus einem AWS Kinesis-Stream verarbeiten, der Ereignisse von Geräten erfasst. Die Verarbeitungsfunktion muss jede Sekunde mit allen in den letzten 10 Sekunden empfangenen Ereignissen aufgerufen werden.Was sind die Optionen zum Verarbeiten von Zeitreihendaten aus einem Kinesis-Stream


Sagen wir, ich habe zwei Geräte A und B, die Ereignisse in den Stream schreiben. Mein Verfahren hat den Namen von MyFunction und nimmt die folgenden params:

  • DeviceId
  • Array von Daten für einen Zeitraum

Wenn ich die Verarbeitung bei 10.00.00 beginnen (und haben bereits angesammelt Veranstaltungen für Geräte A und B für die letzten 10 Sekunden) dann muss ich zwei Anrufe:

  • MyFunction (А, {Veranstaltungen für Gerät A von 09.59.50 bis 10.00.00})
  • MyFunction (B, {Event für Gerät B 9.59.50 bis 10.00.00})

in der nächsten Sekunde, bei 10.00.01

  • MyFunction (А, {Event für Gerät A 9.59.51 bis 10.00.01})
  • MyFunction (B, {Event für Gerät B vom 09.59.51 bis 10: 00:01})

und so weiter.


Sieht aus wie der einfachste Weg, um alle Daten von Geräten empfangen zu akkumulieren ist es nur speichern Speicher in einem temporären Puffer (die letzten 10 Sekunden nur, natürlich), so möchte ich diese zuerst versuchen .

Und die bequemste Möglichkeit, einen solchen speicherbasierten Puffer zu behalten, ist, eine Java Kinesis Client Library (KCL) basierte Anwendung zu erstellen.

Ich habe auch AWS Lambda-basierte Lösung berücksichtigt, aber sieht aus wie es unmöglich ist, Daten im Speicher für Lambda zu halten. Eine weitere Option für Lambda ist es, 2 Funktionen zu haben, die erste muss alle Daten in DynamoDB schreiben, und die zweite, die jede Sekunde aufgerufen wird, um Daten zu verarbeiten, die aus db geholt werden, nicht aus dem Speicher. (Also diese Option ist viel komplizierter)

Also meine Fragen ist: Was können andere Optionen sein, um eine solche Verarbeitung zu implementieren?

Antwort

1

Also, was Sie tun, heißt "Fensterbetrieb" (oder "Fensterberechnung"). Es gibt mehrere Möglichkeiten, um das zu erreichen, wie Sie sagten, Pufferung ist die beste Option.

  • Im Cache-Speicher-Systemen: Ehcache, Hazelcast

akkumulieren Daten in einem Cache-System und wählen Sie die richtige Bereinigungsrichtlinie (10 Minuten in Ihrem Fall). Führen Sie dann eine Gruppierungssummation durch und berechnen Sie die Ausgabe.

  • In Memory-Datenbank: Redis, VoltDB

Genau wie ein Cache-System, können Sie eine Datenbank-Architektur verwenden. Redis könnte hilfreich und Stateful sein. Wenn Sie VoltDB oder ein solches SQL-System verwenden, wäre der Aufruf einer Operation "sum()" oder "avg()" einfacher.

Es ist möglich, Funken zu verwenden, das Zählen zu tun. Sie können Elastic MapReduce (EMR) ausprobieren, damit Sie im AWS-Ökosystem bleiben und die Integration einfacher wird.

Verwandte Themen