Ich habe eine Klasse von Berechnungen, die natürlich eine Graphenstruktur zu haben scheint. Der Graph ist weit davon entfernt, linear zu sein, da es mehrere Eingänge gibt, sowie Knoten, die sich ausbreiten, und Knoten, die das Ergebnis mehrerer anderer Knoten erfordern. Bei all diesen Berechnungen gibt es möglicherweise auch mehrere Senken. Keine Zyklen sind jedoch jemals vorhanden. Die Eingangsknoten werden aktualisiert (nicht notwendigerweise einzeln) und ihre Werte fließen durch den (in diesem Punkt rein konzeptionellen) Graphen. Die Knoten behalten den Status bei, wenn sich die Eingänge ändern, und die Berechnungen müssen sequenziell in Bezug auf die Eingänge ausgeführt werden.
Da ich solche Berechnungen ziemlich häufig schreiben muss und ich jedes Mal nicht bereit bin, Ad-hoc-Code zu schreiben, habe ich versucht, eine kleine Bibliothek zu schreiben, um solche Berechnungen durch Schreiben von Klassen für die verschiedenen Knoten einfach zusammenzusetzen. Mein Code ist jedoch ziemlich unelegant, und die Parallelstruktur dieser Berechnungen wird nicht ausgenutzt. Während jeder Scheitelpunkt normalerweise leicht ist, können Berechnungen ziemlich komplex und "weit" werden. Um das Problem noch komplizierter zu machen, werden die Eingaben für diese Berechnungen sehr häufig in einer Schleife aktualisiert. Zum Glück sind die Probleme klein genug, dass ich sie auf einem einzigen Knoten behandeln kann.
Hat jemand jemals etwas Ähnliches behandelt? Welche Ideen / Ansätze / Tools würden Sie empfehlen?
Das klingt nach einem Problem, für das Apache Storm (Open Source) perfekt wäre: Ссылка
Bei Apache Storm handelt es sich um Echtzeit-Streaming-Berechnungen, bei denen einzelne Tupel (Datenpunkte) einzeln verarbeitet werden. Storm garantiert, dass jedes Tupel mindestens einmal bearbeitet wird. Mit Storm Trident können Sie Storm weiter abstrahieren und genau einmal Semantiken erhalten.
Apache Storm ist eine freie und Open-Source-verteilte Echtzeit Berechnungssystem. Storm macht es einfach, unbegrenzt zuverlässig zu verarbeiten Datenströme, die für die Echtzeitverarbeitung von Hadoop getan werden Stapelverarbeitung.
Meine Firma und ich arbeiten seit einigen Jahren mit Apache Storm und es ist eine der ausgereiftesten Big-Data-Technologien. Big-Data-Technologie ist eine Technologie, die horizontal verteilt (auf billiger Hardware) läuft.
Die Haupt-API ist für Java, aber es gibt Adapter für Ruby, Python, Javascript, Perl. Sie können jedoch jede Sprache verwenden: Ссылка
Die Dokumentation ist gut (obwohl JavaDoc einige weitere Details verwenden könnte): Ссылка
Storm verfügt über Spouts, mit denen Sie Daten in Ihre so genannte Topologie einlesen können. Die Topologie ist dieser Graph, den Sie beschrieben haben. Wenn neue Tupel in die Tüllen eintreten, werden sie durch die Topologie gesendet. Jeder der Knoten ist einer der Sturmbolzen.
Storm hat viele Anwendungsfälle: Echtzeit-Analyse, Online-maschinelles Lernen, kontinuierliche Berechnung, verteilter RPC, ETL und mehr. Sturm ist schnell: Ein Benchmark taktete bei über einer Million verarbeiteten Tupeln pro Sekunde pro Knoten. Es ist skalierbar, fehlertolerant und garantiert Ihre Daten verarbeitet und ist einfach einzurichten und zu betreiben.
Tags und Links stream control-flow-graph dataflow