Java Task basiertes Cluster/Cloud System
by admin on Jul.19, 2009, under Allgemein
Der Anfang:
Die anfänglich Idee war eigentlich einen Webcrawler zu programmieren welcher Seiten indiziert.
Allerdings stellte ich schnell fest, das ein Rechner mit 2x 3Ghz und 4GB Ram schon mit dem parrallelen Scannen von mehreren hundert Seiten komplett ausgelastet war. Deshalb kam mir die Idee, den Webcrawler auf verschiedenen Hosts zu verteilen, da es bei der Anzahl der Webseiten welche es gibt, (weiß nicht genau wie viele) wohl nicht ausreicht ein paar hundert auf einmal zu Indexieren.
Da aber ein Clustersoftware, welche man nur für den Webcrawler programmiert, etwas sinnlos erschien, könnte man es so programmieren das man es später vielleicht auch für andere Aufgaben benutzen kann.
Das System:
So programmierte ich ein kleines Task basiertes Cluster System. Mir stellte sich sich
gleich die Frage wie definiert man einen Task (zu deutsch Aufgabe). Ein Task hat einen Startpunkt und einen Endpunkt an dem die Aufgabe erledigt ist. Wie ich das gelöst hab verrate ich noch nicht, es gibt aber eine simple Lösung wo genau die zwei Kriterien zutreffen.
Die Archietektur ist so aufgebaut, das es eine X Anzahl von Hosts gibt. Die Knotenserver, welche die Aufgaben an die Hosts zur Abarbeitung weitergeben,können Baumstrukturartig aufgebaut werden. Dabei ist es auch möglich, dass ein Host von mehreren Knotenservern Aufgaben erhält. Außerdem hab ich darauf geachtet, das sowohl die Clients als auch die Knotenserver, einen Puffer haben, in welchem Sie Aufgaben ablegen können, wenn gerade die maximale Anzahl der parallel abzuarbeitenden Aufgaben erreicht ist.
Theorie und Praxis:
Da ich leider nur 2 Rechner und 2 Server habe, konnte ich trotz einiger auf KVM virtualisierten Hosts noch nicht wirklich abschätzen wie skalierbar das ganze wirklich ist. Außerdem wurde beim Webcrawler Test, das ganze durch meine DSL-Anbindung limitiert. Jedenfalls klappte das Verteilen und Abarbeiten von Aufgaben mit 10 Hosts und 2 Knotenserver jedenfalls problemlos.
Monitoring:
Um etwas den Überblick zu haben, was auf welchem System gerade abgearbeitet wird, hab ich eine ziemlich einfache Webmonitoringoberfläche gemacht. Leider funktioniert der Serverseitige push/refresh noch nicht richtig, deshalb gibt es noch einen Refresh Button.
Anbei folgt ein Screenshot davon:
Zur Zukunft:
Leider ist das ganze alles noch ewtas rudimentär.Außerdem hab ich noch unzählige Ideen wie ich das ganze noch Verbessern und Ausbauen könnte.
Da ich das ganze privat Programmiere und ich neben dem Beruf nicht soviel vor dem Rechner sitzen will, gerade im Sommer bei schönem Wetter, wird sich zeigen wie sich das ganze weiter entwickelt. Wenn es etwas ausgereifter ist, gibt es das ganze evtl als Open Source.
März 13th, 2010 on 16:38
Hi,
nach genau so etwas, habe ich gesucht. Wie weit ist denn der Arbeitsstand momentan? Ich bin kein Informatiker und fange erst an, mich in die Materie einzuarbeiten. Daher wäre für mich wichtig zu wissen, welchen Schwierigkeitsgrad die Programmierung dieser Anwendung hat. Wo würdest Du Sie auf einer Skala von 1(kann jeder) bis 100(Genies vorbehalten) einordnen?
gruß
riswan
März 13th, 2010 on 18:27
Hi riswan,
zum Arbeitsstand: Leider bin ich noch nicht viel weiter.
Ich hab allerdings vor 2 Monaten einen Webcrawler Task geschrieben. Nichts kompliziertes, halt nur die Website zu druchsuchen und weiterführende Links in einen Datenbank aufzunehmen.
Die Frage nach dem Schwierigkeitsgrad, um die Anwendung zu verstehen, ist nicht so einfach zu beantworten. Generel sollte man z.b. verstehen, wie man mit Java Sockets arbeitet bzw was evtl wichtiger wäre, wie Java Threads arbeiten. Auch wäre etwas Wissen über das Casten von Objekten hilfreich.
Im letzten Blogeintrag (http://www.itflow.de/myblog/?p=558) hab ich etwas SourceCode geposted. Falls du diesen durschaust, sollte der Quellcode für den Task Cluster kein Problem mehr für dich darstellen.
März 13th, 2010 on 18:42
Also ich durchschau es noch nicht, aber die Begriffe sind kein Buch mit 7 Siegeln.
Casten von Objekten? Ich erinnere mich dunkel an QuickBasic, da gab es die “call” und “callsub” Funktion, mit der man Ergebnisse innerhalb des Quellcodes von einem anderen Codeblock innerhalb oder mit Hilfe eines extern abgelegtenen Codes verarbeiten und ausgeben lassen konnte. Aber das ist schon locker 15 Jahre her
Werde erstmal versuchen, mein Java-Buch durchzuarbeiten, damit ich endlich mal wieder was zeitgemäßes programmieren kann