Ich habe eine Frage zur Verarbeitung größerer Daten mit dem Hazelcast-In-Memory-Datenraster. Ich habe es nicht geschafft, eine konkrete Antwort über die Verwendung dieser Technologie für das folgende Szenario zu finden, also habe ich mich hier um Hilfe gedreht. Wir werden zwei Arten von Vorgängen für diese Daten ausführen: Zunächst werden wir eine strukturierte SQL -Abfrage von einem Benutzer abnehmen. Diese Abfrage kann sehr komplexe Zusammenhänge, Filter-, Aggregationsvorgänge und analytische Funktionen umfassen (wie diejenigen, die Oracle unterstützt). Das Ergebnis wird die Erstellung neuer Tabellen sein, die wir in Zieldatenbanken schreiben werden. Dies kann die gleichen wie die Quellen oder verschiedene DBs in verschiedenen Maschinen sein. Die zweite Art von Operationen umfasst die Ausführung von Berechnungs -schweren Algorithmen für die Daten, die wir aus dem Quell -DBS gelesen haben, beispielsweise die Ausführung eines Gradientenabstich -Algorithmus zur Optimierung eines statistischen Modells, das wir mit den Daten aus Quelldbds als Trainingsdaten erstellen. Das Ergebnis wird hauptsächlich eine neue Tabelle sein, die die Modellparameter oder Testdatenbewertungen enthält. Ich kann die Daten in verteilte Karten oder Multimaps laden, die Berechnungslast zwischen Clusterknoten verteilen und die Ergebnisse unter Verwendung eines MapReduce -Paradigmas sammeln. Ich befasse mich hauptsächlich mit unserer ersten Art von Problem, bei der komplexe strukturierte SQLs beteiligt sind. Ich habe die folgenden Fragen, für die ich im Allgemeinen keine zufriedenstellenden Antworten gefunden habe. Alle Hilfe oder Zeiger sind sehr willkommen. In diesem Fall denke ich, dass es keine praktikable, vielleicht sogar mögliche Sache ist, alle in den verteilten Speicher von Hazelcast zu laden, RAM ist im Vergleich zum Speicher Speicher immer noch sehr teuer und unser Cluster sollte aus Rohstoffmaschinen bestehen. Wie sollten wir uns dann diesem Problem angehen?
Ich denke an eine verteilte zentrale DB -Schicht, zum Beispiel wie die Apache Cassandra, in die alle heterogenen Quellen gelesen werden. Anschließend werden die strukturierten SQL-Abfragen in dieser zentralen Datenbank unabhängig von In-Memory-Berechnungsschritten ausgeführt. < /p>
2) Wie sollte die Festplatte in einem In-Memory-Raster mit Hazelcast bereitgestellt werden? Zum Beispiel lesen wir eine große DB -Tabelle in den Speicher (vorausgesetzt, sie passt in den Speicher) in eine von Hazelcast bereitgestellte Kartenstruktur. Dann haben wir diese Daten irgendwie im Speicher aktualisiert. Wie soll dieses Update die Festplattenkopie der tatsächlichen Tabelle widerspiegeln? Kommt der JCache hier ins Spiel, beispielsweise mit der JCache-API, die Kohärenz zwischen Festplatte und Speicher automatisch oder sollten wir manuelle Routinen schreiben, die garantieren, dass die Festplatte und in Speicherdaten immer konsistent sind? Aber ist es weiter möglich, dass wir eine vollständig native SQL -Befehlszeichenfolge schreiben und diese in Speicherobjekten mit ihnen verteilt haben? Ich meine so etwas wie: < /p>
Code: Select all
string sqlCommand = "SELECT A.Col1,B.Col2 FROM TABLE A LEFT JOIN TABLE B ON A.IdCol = B.IdCol WHERE A.FilterCol='X' AND B.FilterCol='Y'";
ImagineryHazelcastSqlCommandObject o = new ImagineryHazelcastSqlCommandObject (sqlCommand);
data = ImagineryHazelcastSqlCommandObject.Execute();