Wie kann man die Arbeit auf ein Computernetzwerk aufteilen?

11

Stellen Sie sich ein Szenario wie folgt vor: Nehmen wir an, Sie haben einen zentralen Computer, der viele Daten generiert. Diese Daten müssen verarbeitet werden, was leider länger dauert als die Generierung. Damit die Verarbeitung mit Echtzeit Schritt hält, schließen wir weitere Slave-Computer an.

Darüber hinaus müssen wir die Möglichkeit berücksichtigen, dass Slaves während des Jobs aus dem Netzwerk ausscheiden und zusätzliche Slaves hinzugefügt werden. Der Zentralcomputer sollte sicherstellen, dass alle Jobs zu seiner Zufriedenheit beendet werden und dass von einem Slave abgelegte Jobs an einen anderen zurückgegeben werden.

Die Hauptfrage lautet: Welchen Ansatz sollte ich verwenden, um dies zu erreichen?

Aber vielleicht hilft mir Folgendes, eine Antwort zu finden: Gibt es einen Namen oder ein Entwurfsmuster für das, was ich versuche zu tun?

Welchen Wissensbereich benötige ich, um das Ziel zu erreichen, dass diese Computer miteinander kommunizieren? (zB wird eine Datenbank, über die ich etwas weiß, ausreichen oder handelt es sich um Sockets, über die ich noch nichts weiß?)

Gibt es Beispiele für ein solches System? Die Hauptfrage ist etwas allgemein gehalten, daher wäre es gut, einen Startpunkt / Referenzpunkt zu haben.

Hinweis Ich gehe von Einschränkungen von C ++ und Windows aus, sodass Lösungen, die in diese Richtung weisen, willkommen wären.

Morpork
quelle
1
Suchen Sie nach Warteschlangen- oder Workflow-Systemen, Beispiele: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue usw. Das Warteschlangensystem kann sich um die Verteilung, Überprüfung und Neuzuweisung kümmern.
Luc Franken
2
Der Begriff, den Sie suchen, ist Parallelisierung . Bevor Sie diese Straße des Kopf nach unten, stellen Sie sicher , kann Ihr Problem tatsächlich parallel gelöst werden (zB das Ergebnis für das Element n hängt nicht von dem Ergebnis für das Element n-1 ).
Blrfl
Schauen Sie sich boinc
@Blrfl Ich denke, Parallelisierung ist normalerweise nicht damit verbunden. Parallelisierung ist normalerweise mit Multithread- oder Multiprozessausführung auf einem einzelnen Computer unter Verwendung mehrerer Kerne / Prozessoren oder gleichzeitiger Ausführung auf demselben Computer verbunden. Verteiltes Rechnen ist das, worauf er sich bezieht, und in seiner Beschreibung gibt es keine Garantien für Parallelität, sondern nur Garantien für Asynchronität (dh nicht deterministische Ausführung, die gleichzeitig, synchron oder in der Warteschlange verzögert sein kann)
Jimmy Hoffa
3
Ich bin überrascht, dass niemand Hadoop erwähnt hat.
Kevin

Antworten:

12

Gibt es Beispiele für ein solches System?

Ja. Dieses Muster wird als verteiltes Rechnen bezeichnet (oder verteiltes Programmieren oder was auch immer für ein cooles Wort Sie nach dem Verteilen setzen möchten). Mein Vorschlag wird sein, dieses nicht im eigenen Haus zu bauen, bevor ich mir andere Lösungen anschaue. In dieser Frage zum Stapelüberlauf finden Sie verschiedene Optionen. Und dann kalkulierte Entscheidung treffen.

Manoj R.
quelle
3
Vergessen Sie nicht das neue Lieblingswort dafür: die Wolke ! oder Cloud Computing. Wenn Sie dies mit Ihren eigenen Computern tun, nennen die Leute sie eine persönliche Cloud oder Mini- Cloud . Unsinn vermarkten, das ist, wie Sie sagten, seit Jahren als verteiltes Computing bekannt, nur damit das OP weiß, wo er über Cloud-Sachen liest, über die es genau spricht.
Jimmy Hoffa
3
@JimmyHoffa: Das Wort "Cloud" wird genauso oft verwendet, um anzuzeigen, dass sich Ihre Daten sowie die Software, mit der Sie arbeiten, irgendwo im Internet befinden und nicht auf Ihrem lokalen Computer. In anderen Fällen bedeutet dies, dass Sie eine virtuelle Maschine verwenden, die auf einem Cluster und nicht auf einem einzelnen monolithischen VM-Host ausgeführt wird. Der offensichtliche Vorteil sind transparente Failover ohne Ausfallzeiten.
tdammers
2
@tdammers stimmt, aber dennoch ist der vom OP beschriebene Systemtyp einer der vielen, die den Marketing-Moniker der Cloud verwenden, zusammen mit praktisch allem anderen. Das ist es, was es zu einem Schlagwort macht. Es wurde ohne Definition erfunden, also haben die Leute es auf Tonnen verschiedener Dinge angewendet, damit es effektiv alles und nichts bedeutet. Hurra für Schlagworte.
Jimmy Hoffa
1
@ JimmyHoffa: Es ist auch das, was die Erwähnung des Wortes "Wolke" hier völlig unkonstruktiv macht.
tdammers
3
Es könnte ein gutes Wort gegen das Management sein. "Was ist Ihre Lösung für dieses Datenverarbeitungsproblem?" "Nun, wir könnten es an ein Netzwerk von Computern verteilen und parallel berechnen." LEERER BLICK. "Wir können eine Mini-Cloud bauen." "OKAY CARRY ON"
Morpork
4

Wie aus anderen Antworten hervorgeht, ist dieses Gebiet als verteiltes Rechnen , Grid-Computing , Cluster-Computing und Hochleistungs-Computing bekannt .

Lassen Sie mich den Unterschied hinzufügen, dass ein System, dessen Größe nach dem Start an die Arbeitslast angepasst werden kann, als " elastisch " bezeichnet wird und sich vom herkömmlichen Grid-Computing unterscheidet. Dies ist einer der (nicht marketingbezogenen) Gründe für den Begriff " Cloud Computing ": Der Benutzer muss keine Kapazität einplanen, und die Anzahl und der Standort der Maschinen, die die Berechnung durchführen, bleiben ihm als Cloud unberührt.

Außerdem wird Ihre Anforderung, dass der Master fehlgeschlagene Aufgaben neu plant, als " Fehlertoleranz " -Eigenschaft dieses Systems bezeichnet. (Obligatorischer Link zu diesem Cartoon )

Welchen Ansatz sollten Sie verwenden, um Ihre eigene private Cloud zu erstellen? In meiner Bestellung oder Präferenz:

  1. Erstellen Sie keine eigene Cloud , sondern nutzen Sie die von anderen bereitgestellte Infrastruktur. Amazon nennt diese Virtual Private Cloud , Rackspace nur Private Cloud . Ich bin sicher, Sie können andere Angebote finden und vergleichen.

  2. Erstellen Sie keine eigene verteilte Computer-Engine , sondern verwenden Sie die von anderen bereitgestellte Engine. Wenn Sie darauf bestehen, Ihre Maschinen zu verwenden, verwenden Sie mindestens so viel Software wie möglich, die von anderen bereitgestellt und getestet wird. Sie können Hadoop von C ++ über die Pipes-Schnittstelle oder von jeder ausführbaren Datei über die Streaming-API verwenden . Es gibt eine ähnliche Streaming-Oberfläche für Spark .

  3. Codieren Sie nicht alle Komponenten von Grund auf neu , sondern verwenden Sie Komponenten aus der Community. Wenn Sie aus irgendeinem Grund bisher gelesen haben und Ihre eigenen Cloud-Komponenten bereitstellen möchten, beginnen Sie nicht mit der Standardbibliothek von C ++. Die Hauptkomponenten, die Sie benötigen, sind:

    • ein Warteschlangensystem, wie in einem Kommentar angegeben , um Aufgaben vom Master an die Verarbeitungsknoten zu senden und Ergebnisbestätigungen von den Verarbeitungsknoten an den Master zu senden
    • ein verteiltes Dateisystem, damit Verarbeitungsknoten auf die Daten zugreifen können, mit denen gearbeitet werden soll.

    Für beide gibt es viele Alternativen. Für die Warteschlange verfügt RabbitMQ ebenso wie ZeroMQ über ein Windows-Installationsprogramm . Für verteilte Dateisysteme habe ich wirklich nicht genug Erfahrung mit Windows: Es sieht so aus, als könnten Sie SMB-Freigaben in einer DFS organisieren , aber ich kann Ihnen hier keinen Hinweis geben. Sie könnten, wie in einer anderen Antwort erwähnt, denken, eine verteilte Datenbank wie MongoDB für die Daten zu verwenden. Es läuft unter Windows .

Sie können auch über die Verwendung von MPI nachdenken (normalerweise die OpenMPI-Implementierung , normalerweise über den Boost-Wrapper ). Beachten Sie jedoch, dass MPI-Programme an sich weder elastisch noch fehlertolerant sind. Sie müssen sich selbst darum kümmern (zumindest bieten sie einige Mechanismen, um dies zu erreichen ). Aus diesem Grund würde ich Ihnen empfehlen, zunächst ein Framework für die Verteilung zu evaluieren, das solche Eigenschaften aufweist.

logc
quelle