Adaptives High Throughput Computing in Scavenging Grids

Transcription

Adaptives High Throughput Computing in Scavenging Grids
Fachhochschule Wiesbaden
Fachbereich Design Informatik Medien
Diplomarbeit
zur Erlangung des akademischen Grades
Diplom-Informatiker (FH)
Adaptives High Throughput Computing
in Scavenging Grids
Vorgelegt von:
Datum:
Referent:
Korreferentin:
Bertram Beyer
13. Dezember 2006
Prof. Dr. Ulrich Schwanecke
Margaryta Shramko M.A.
ii
Erklärung
Ich versichere hiermit, dass ich die vorliegende Diplomarbeit selbstständig und ohne unerlaubter fremde Hilfe angefertigt habe und dass ich alle von anderen Autoren
wörtlich übernommenen Stellen wie auch die sich an die Gedankengänge anderer
Autoren eng anlehnenden Ausführungen meiner Arbeit besonders gekennzeichnet
und die Quellen zitiert habe.
Mainz, 13. Dezember 2006
Ort,Datum
Unterschrift
Verbreitung
Hiermit erkläre ich mein Einverständnis mit den im folgenden aufgeführten Verbreitungsformen dieser Diplomarbeit:
Verbreitungsform
Einstellung der Arbeit in die Bibliothek der FHW
Veröffentlichung des Titels der Arbeit im Internet
Veröffentlichung der Arbeit im Internet
Ja
X
X
X
Nein
Mainz, 13. Dezember 2006
Ort,Datum
Unterschrift
iii
Inhaltsverzeichnis
Abbildungsverzeichnis
v
Tabellenverzeichnis
vii
1 Motivation
1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Aufbau der Diplomarbeit . . . . . . . . . . . . . . . . . . . . . . . .
2 Grundlagen
2.1 Was ist Grid Computing? . . . . . . . .
2.2 Die Geschichte des Grid Computing . . .
2.3 Klassifizierung von Grid-Systemen . . . .
2.4 Anwendungsgebiete von Grid Computing
2.5 Der Vergleich mit Peer-To-Peer . . . . .
3 Standards und Marktführer
3.1 Open Grid Forum . . . . . .
3.2 Die Globus Alliance . . . . .
3.3 Sun N1 Grid Engine . . . .
3.4 Condor . . . . . . . . . . . .
3.5 BOINC . . . . . . . . . . .
3.6 Auswertung und Beurteilung
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
3
4
.
.
.
.
.
6
6
7
9
11
14
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
18
18
19
22
24
27
29
4 Filesharing Protokolle als Data Grid
4.1 Die Idee der Datenverteilung . . . . . .
4.2 Verteilte Hashtabellen . . . . . . . . .
4.3 p2p Implementierungen . . . . . . . . .
4.4 Auswertung und Beurteilung . . . . . .
4.5 Beschreibung des BitTorrent Protokolls
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
31
31
33
34
37
37
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Konzeption
51
5.1 Rollenverteilung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.2 Nodeverwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.3 Datenverteilung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
iv
5.4
Arbeitsablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6 Implementierung des Grid-Systems
6.1 Modul- und Klassendefinitionen . .
6.2 Aufgabendeklaration . . . . . . . .
6.3 Kommunikationskanäle . . . . . . .
6.4 Benutzerschnittstellen . . . . . . .
7 Testszenario
7.1 Test 1: Verteilung . . . . . . .
7.2 Test 2: Aufwandssteigerung .
7.3 Test 3: Leistungssteigerung . .
7.4 Beurteilung und Fehleranalyse
8 Fazit und Ausblick
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
64
65
74
79
84
.
.
.
.
87
89
90
93
95
98
Literatur
100
Weblinks
104
Inhalt der CD-ROM
106
Glossar
107
Stichwortverzeichnis
110
v
Abbildungsverzeichnis
3.1
3.2
Das Globus Grid Schichtenmodell [Foster u. a., 2001] . . . . . . . . 20
Das BOINC Modell [University of California, 2006] . . . . . . . . . 28
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
BitTorrent Nutzdaten Kommunikation .
BitTorrent Tracker Kommunikation . . .
Beispiel einer .torrent Datei . . . . . .
Dekodierung vom Listening in Abbildung
Konsolenausgabe der Metainformationen
dung 4.3 . . . . . . . . . . . . . . . . . .
Beispiel eines GET Requests . . . . . . .
Beispiel einer Tracker-Antwort . . . . . .
Beispiel einer Peer Kommunikation . . .
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
Use Case Diagramm: Rollenverteilung . . . . . . . . . .
Interne Verknüpfung der Nodes im Beispiel . . . . . . .
Dienste und Kommunikation . . . . . . . . . . . . . . .
Struktur persistenter Daten . . . . . . . . . . . . . . .
Zustandsdiagramm: NodeManager Nachrichtenempfang
Zustandsdiagramm: NodeManager Hauptschleife . . . .
Zustandsdiagramm: JobScheduler Hauptschleife . . . .
Zustandsdiagramm: JobServer Initialisierung . . . . . .
Zustandsdiagramm: JobServer Metadatenaustausch . .
Zustandsdiagramm: ExecutionNode Taskbearbeitung .
.
.
.
.
.
.
.
.
.
.
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
Communication Package . . . . .
NodeRepresentation Package . . .
Auxiliary Package . . . . . . . . .
Paketauswahl BitTorrent API . .
Klassendiagramm ExecutionNode
Klassendiagramm GridManager .
Klassendiagramm JobServer . . .
manifest.xml . . . . . . . . . . . .
metainfo.dtd . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
. . .
4.3 .
vom
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
Listening in
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . .
. . . .
. . . .
Abbil. . . .
. . . .
. . . .
. . . .
.
.
.
.
38
38
41
43
.
.
.
.
44
44
46
50
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
54
56
57
58
59
60
61
62
63
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
66
68
69
70
72
73
75
77
78
vi
7.1
7.2
7.3
7.4
Gerendertes Bild, Auflösung: 1024x768 . . . . . .
Laufzeit bei variabler Menge von Task . . . . . .
Laufzeit bei variabler Menge von ExecutionNodes
Testszenario manifest.xml . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
88
92
95
97
vii
Tabellenverzeichnis
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
ExecutionNode Nachrichtenobjekt . . . . .
NodeManager Nachrichtenobjekt . . . . .
Statusbyte der ExecutionNodes . . . . . .
JobServer/JobScheduler Nachrichtenobjekt
Wertebereich Nachrichtenobjekte . . . . .
ExecutionNode Befehle . . . . . . . . . . .
JobServer Befehle . . . . . . . . . . . . . .
GridManager Befehle . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
80
80
81
81
82
85
85
86
7.1
7.2
7.3
7.4
Testrechner . . . . . . . . . . . . . . . .
Scheduler update . . . . . . . . . . . . .
Aufwand zur Zeit bei gleicher Kapazität
Leistung zur Zeit bei gleichem Aufwand
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
87
90
91
93
.
.
.
.
1
1 Motivation
Die Rechenleistung moderner Privatrechner ist enorm und sie wächst stetig. In
einer nicht nur für den Laien erstaunlichen Häufigkeit werden auf dem Markt neue
Prozessorgenerationen mit immer höherer Taktfrequenzen sowie mit immer raffinierteren und fortgeschritteneren Technologien angeboten, die sich in ihrer Leistungsfähigkeit permanent übertreffen. Ebenso steigen die Bandbreiten privater Internetanbindungen in Dimensionen, die vor wenigen Jahren noch kaum vorstellbar
waren. Im Gegensatz hierzu sind die Preise für die Hardware auf ein Niveau gesunken, welches es größer werdenden Konsumentenkreisen ermöglicht, immer den
technisch aktuellen Stand halten zu können. Viele Haushalte besitzen schon oft
mehr als nur einen Computer. Die Internet Service Provider bieten ihre Dienstleistungen zu günstigen Pauschalpreisen an, weshalb nicht selten Rechner 24 Stunden
am Tag online sind.
Dieses geballte Potential wird allerdings nur selten genutzt. Zu den wenigen Anwendungen, mit welchen Privatanwender die Leistung ihres PCs ausschöpfen, gehören Spiele oder auch der Videoschnitt. Textverarbeitungen, Webbrowser, Emailclients, Instant Messenger und ähnliche Programme benötigen nur einen Bruchteil
dessen, was der Rechner an Leistung zu bieten hat. Vergleichbar mit einem leistungsstarken Porsche in einer verkehrsberuhigten Zone, bleibt es ihm verwehrt zu
zeigen, was in ihm steckt. Währe so ein Computer ein sensibles intelligentes Wesen,
liefe er wegen permanenter Unterforderung Gefahr, Opfer chronischer Depressionen zu werden.
Auch mit dem Internet mit all seinen Möglichkeiten stehen diese Maschinen nur in
einer sehr einseitigen Beziehung. Sie nutzen lediglich Dienste, die über das Netz-
2
werk offeriert werden, stellen aber selbst für das Netz keinen Nutzen dar.
Grid Computing wird in diesem Zusammenhang allerdings zu einem hochinteressanten Anwendungsgebiet. In ihm beschäftigt man sich mit dem gemeinsamen
Nutzen untereinander vernetzter Ressourcen. Wendet man dies auf den zuvor beschriebenen Zustand moderner Privatrechner an, so kann Grid Computing als Bündelung freier Kapazitäten verstanden werden, welche dann für aufwandsintensive
Berechnungen zur Verfügung stehen. Gelingt es, dieses Potential zu erschließen
und nutzbar zu machen, öffnen sich Türen zu Leistungsfähigkeiten, die zuvor nur
von Supercomputern erreicht wurden.
Ähnliche Anwendungen gab es schon zuvor, aber es gab keine, die in dem besagten
Umfeld eine universelle Plattform bot: Nämlich eine Möglichkeit, die Rechenleistung beliebig vieler Teilnehmer für einen wahlfreien Verwendungszweck zu nutzen.
Deshalb, um mitzuhelfen, diese nach wie vor bestehende Lücke zu verkleinern,
wurde im Rahmen dieser Diplomarbeit aktuelle Techniken auf ihre Tauglichkeit
für eine solche Plattform untersucht und darauf folgend eine erste Testimplementierung eines solchen Grids erstellt.
Letzteres bietet dem Anwender die Funktionalität, parallelisierbare Aufgaben von
beliebig vielen Rechnern ausführen zu lassen. So ist zum Beispiel das Rendern einer
3D Animation eine solche Aufgabe. Jedes Bild einer derartigen Animation kann
zum gleichen Zeitpunkt erstellt werden, da keine Abhängigkeiten zwischen den
Einzelbildern bestehen. Eine Besonderheit hierbei ist, dass vorhandene Software,
die nicht speziell für das Grid entwickelt wurde, weiterhin benutzt wird. Auf das
Beispiel bezogen, wäre dies ein gewöhnlicher Renderer, der mit wenig Mehraufwand
in das Grid integriert werden kann.
Ein wichtiger Aspekt dabei ist, wie die Ressourcenspender in das Grid integriert
werden können, also wie man den Besitzer einer solchen Maschine dazu bewegt,
sich die benötigte Software zu installieren und diese dann auch tatsächlich laufen
zu lassen.
Die erfolgversprechendste Idee dürfte wohl sein, das Programm als Plugin für einen
1.1. Aufgabenstellung
3
Instant-Messenger zu vertreiben. Über diesen Weg gelangt man an eine große Klientel, die prädestiniert für ein solches Produkt wäre, da die Wahrscheinlichkeit der
Akzeptanz, sowie der benötigten Vorraussetzungen für einen erfolgreichen Einsatz
in diesem Fall als sehr hoch einzuschätzen ist.
1.1 Aufgabenstellung
Die Aufgabenstellung der Diplomarbeit bestand daher in der Entwicklung eines adaptiven Scavenging Grids zur Realisierung eines High Trougput Computing (HTC)
Systems. HTC bedeutet, dass die Ausführungsgeschwindigkeiten langläufiger Berechnungen maximiert werden. Hiermit ist nicht die Optimierung zu einer möglichst kurzen Antwortzeit eines Prozesses gemeint. Dies wäre das Aufgabengebiet
von High Performance Computing (HPC). Ein Scavenging Grid beschreibt ein System, welches die brachliegende Rechenzeit vernetzter und ungenutzter Rechner in
Anspruch nimmt, um ferngesteuert Aufgaben an diese zu verteilen und ausführen
zu lassen. Ein Beispiel hierzu wären die Workstations einer Firma, die den Tag
über von den Mitarbeitern genutzt werden, und nachts für Simulationsberechnungen in Anspruch genommen werden. Die Adaptivität bezieht sich darauf, dass
der Einsatzbereich des Grids um die benötigte Funktionalität erweitert wird. Ein
häufiges Entscheidungskriterium, ob ein Teilnehmer eines Grids eine Aufgabe zugewiesen bekommt, ist die auf ihm installierte Software. Sich von dieser Vorstellung
zu trennen und jeden Teilnehmer universal einsetzbar zu betrachten, war ein Teil
der Aufgabe. Die notwendige Software, welche zur Lösung der Aufgaben benötigt
wird, muss also modular verteilt werden. Um diese Verteilung möglichst effizient
zu gestalten, galt es, die Idee zu verfolgen, diese über Filesharing-Protokolle zu
verteilen.
Da die Gridsoftware in einer späteren Implementierung als Plugin über den goober1 Instant-Messender verteilt werden soll, wurden hierdurch die Vorraussetzungen des Systems spezifiziert. Da der Messenger ein Windows Programm ist, müssen
1
http://www.goober.de
4
1.2. Aufbau der Diplomarbeit
auch die zu verteilenden Module windowslauffähig sein. Im Regelfall wird dieser
Messenger über einen zur Zeit durchschnittlichen Internetzugang an das Netz angebunden sein. Die Verfügbarkeit des Systems kann nicht garantiert werden und ist
als instabil zu bewerten, da der Anwender jederzeit die Verbindung unterbrechen
kann.
Der ersten Schritt der Arbeit beruhte in der Aufgabe, gängige Grid Implementierungen und im zweiten Schritt die verbreitesten Filesharing-Protokolle zu analysieren und auf ihre Einsatzmöglichkeit für das geplante System zu prüfen. Nach der
Auswahl geeigneter Komponenten stand dann die Implementierung eines Testsystems auf dem Plan. Letztendlich musste die Lauffähigkeit des Programms anhand
eines konkreten Beispieles demonstriert und bewertet werden.
1.2 Aufbau der Diplomarbeit
Die vorliegende Arbeit unterteilt sich in acht Kapitel. Das erste und gegenwärtige
Kapitel erläutert die zugrundeliegende Motivation, nennt die Aufgabenstellung
und beschreibt die Struktur der Diplomarbeit.
Kapitel zwei gibt einen Einstieg in die Thematik des Grid Computing. Hierzu
gehören ein kurzer historischer Rückblick auf die Entwicklung, sowie die Definition
und die Anwendungsgebiete von Grid Computing. Der letzte Teil dieses Kapitels
beschäftigt sich dann mit der Peer-To-Peer Technologie, beschreibt dieselbe und
setzt sie in Relation zur Grid Technologie.
Das dritte Kapitel nennt kursorisch die aktuellen Marktführer, Trendsetter und
Standards jener Technologie, sowie deren Kernbestandteile und wägt ab, inwiefern
diese für die vorliegende Arbeit von Interesse sind.
Im vierten Kapitel wird die Entscheidung begründet, weshalb ein Filesharing Protokoll den Datentransfer im geplanten Grid übernehmen soll. Drauf folgt eine Einführung in die Materie des Filesharings und eine Beschreibung der populärsten
Implementierungen. Anschließend wird erklärt, warum die Entscheidung auf das
1.2. Aufbau der Diplomarbeit
5
BitTorrent Protokoll fiel, welches danach vollständig beschrieben wird.
Die Konzeption des Grids ist Thema des fünften Kapitels. Dort wird definiert, in
welche Rollen die Gridteilnehmer zu differenzieren sind, wie Aufgaben im Grid
verteilt werden und nach welcher Struktur die Arbeitsabläufe vor sich zugehen
haben.
Kapitel sechs beschreibt die Implementierung. Hierfür zeigt es die Unterteilung
des Systems in Module und Klassen. Darauf aufbauend wird die Umsetzung der
Aufgabenverteilung erläutert. Als Nächstes erfolgt die Erklärung der Kommunikation unter Gridteilnehmern, und zum Schluss werden die Benutzerschnittstellen
zu Applikationen beschrieben.
Thema des siebten Kapitels ist die Prüfung des Systems anhand mehrerer Testsituationen. Zu diesem Zweck diente ein hierfür entwickeltes Szenario, welches mit
unterschiedlichen Parametern durchgeführt wurde. Jeder Test beinhaltet eine Erklärung und Analyse der Ergebnisse.
Das letzte Kapitel bietet eine kompakte Zusammenfassung dieser Arbeit. Sodann
nennt es sinnvollen Ergänzungen und potentiell interessanten Techniken, die für
eine Weiterentwicklung des Systems näher untersucht werden müssten.
Die Formatierung der Diplomarbeit hält sich an die gängigen Konventionen. Als
Besonderheiten sind dabei zu nennen: Begriffe, die einem implementierten System entnommen sind, dazu zählen zum Beispiel Dateinamen, Variablen und auch
Quellcodelistings, werden durch eine nicht proportionale Schrift hervorgehoben.
Ist zu einer Institution, einem Projekt oder einem Produkt ein Weblink bekannt,
wird dieser als Fußnote angegeben.
6
2 Grundlagen
Definitionen von Grid-Computing gibt es zuhauf. Ursachen hierfür resultieren aus
dem rasant angestiegenen Umfang dieses Themenfeldes, an den Überschneidungen
vieler Sachgebiete und den unterschiedlichen dazugekommenen Anwendungsgebieten, bei denen es bald schwierig werden dürfte, den Überblick zu behalten. Hier
soll nun ein Einstieg in die noch recht junge Thematik ermöglicht werden, indem
erklärt wird, welche Ideen hinter der Technologie stecken, woher diese stammen,
und wie sie zu dem wurden, was sie heute sind.
2.1 Was ist Grid Computing?
Mit Grid Computing bezeichnet man im allgemeinen Techniken, die mehrere Computer miteinander verknüpfen und die über den reinen Informationsaustausch, wie
es im Internet der Fall ist, weit hinausgehen.
Hierdurch sollen die Ressourcen eines einzelnen Rechners, als da wären: Speicherkapazität, Rechenkapazität, Applikationen oder auch Spezialhardware mit den
Ressourcen anderer Rechner verbunden werden. Auf diese Weise kann man zum
Beispiel aus mehreren einzelnen Computern virtuelle Supercomputer schaffen.
Genau das war die Idee, die Wissenschaftler schon in den Zeiten des Internetaufbaus hatten. Diese standen vor immer größeren und umfassenderen Problemen,
welche sich mit den Kapazitäten gängiger Computer nicht lösen ließen. Da Supercomputer Mangelware waren, entstand so die Vorstellung von der Verknüpfung
bestehender Ressourcen.
2.2. Die Geschichte des Grid Computing
7
Der Fachterminus „Grid“ hat seinen Ursprung in der englischen Bezeichnung für
Stromnetz, nämlich „electric power grid“. In diesem werden auch eine beliebige
Anzahl von Kraftwerken miteinander verbunden, welche die Kapazitäten stellen.
Über ein standardisiertes Netz ist es so möglich, jeden Haushalt mit Strom zu
versorgen. Der Verbraucher muss hierbei nicht wissen, wer seinen Strom wie und
wo produziert und wie er letztendlich zu seinem Toaster gelangt. Äquivalent hierzu
soll der Konsument im Grid Dienstleistungen zur Verfügung gestellt bekommen,
deren Zusammensetzung und Ursprung von der Verwendung dieser gekapselt sind
[Foster und Kesselman, 2003].
2.2 Die Geschichte des Grid Computing
Das erste große Netzwerk, welches Computer und technische Instrumente miteinander verband, war in den 50er Jahren das SAGE Netzwerk der USA. Es diente
als militärisches Frühwarnsystem zum Schutz vor russischen Bombern. SAGE verband mehrere Ortungssysteme, Militärflughäfen und Flugzeuge miteinander. In
einer späteren Phase des Projekts konnten dann durch Auswahl eines bestimmten Zieles automatisch die Autopiloten der Flugzeuge auf dieses Objekt angesetzt
werden [FAS, 1999].
Die allererste große Software zum Zusammenschluss und zum parallelen Lösen von
Aufgaben war PVM1 (Parallel Virtual Machine). Dessen ursprüngliche Version
stammte aus dem Jahre 1989. Durch sie konnten erstmals in Netzwerken die freien
Ressourcen für Batch Jobs verwendet werden.
1992 entstand das MPI2 Message Passing Interface. Über dieses können Prozesse,
welche parallel auf unterschiedlichen Rechnern gestartet wurden, direkt miteinander kommunizieren.
Im Jahr 1993 errichteten Wissenschaftler der UC Berkeley auf Basis von PVM und
1
2
http://www.csm.ornl.gov/pvm/
http://www-unix.mcs.anl.gov/mpi/
8
2.2. Die Geschichte des Grid Computing
MPI das erste Cluster, das es in die Top-500-Liste der schnellsten Computer der
Welt schaffte.
1994 bauten Techniker der NASA dann das berühmte Beowulf Cluster auf. Donald Becker and Thomas Sterling installierten damals aus 16 DX4 Rechnern auf
Basis von PVM und MPI den ersten Prototypen des Unix basierten Beowulf Clusters. Die Besonderheit bestand hierbei darin, dass die Komponenten, so genannte
COTS (Commodity Off The Shelf), als kostengünstige Massenware bezogen werden konnten. [Merkey, 2004].
1996 gründeten Dr. Ian Foster und Dr. Carl Kesselman zusammen mit Dr. Steve
Tuecke das Globus Project. Danach, im Juli 1998, veröffentlichten Foster und
Kesselman das Standardwerk „The Grid“. Im Oktober 1998 folgte dann das Globus
Toolkit in der Version 1.0. Dieses Globus Toolkit ist Open Source und wurde der
de facto Standard für Gridcomputing.
1999 trat zum ersten Mal das Global Grid Forum (GGF) zusammen. Vergleichbar
mit dem IETF für das Internet, wurde das GGF zum Standardisierungsgremium
für das Grid.
Im Mai 1999 erfolgte von der UC Berkeley im Rahmen ihres SETI Projekts die
Freigabe des Programms SETI@home zum Download. Hierdurch konnte jeder, der
wollte, die Rechenzeit seines Computers zur Analyse von Radioteleskopdaten bereitstellen, um sich so an der Suche nach außerirdischem Leben aktiv zu beteiligen.
In Deutschland gründete 1990 Dr. Wolfgang Gentzsch, Professor für Mathematik
und Informatik, in Regensburg seine Firma Genias Software. Dort wurde die Software Codine entwickelt, eine erste Managementsoftware für verteilte Ressourcen.
Von 1995 bis 1999 entwarf Genias dann zusammen mit Unicore, Autobench, Medusa, Julius, und Eroppa erste Gridprojekte. 1999 wurde die Firma in Gridware
umbenannt und arbeitete an Schnittstellen zu Globus, Legion, Punch, und Cactus
[Sun Microsystems, Inc., 2002].
Sun Mircosystems übernahm Gridware im July 2000 und konzipierte fortan Codine
2.3. Klassifizierung von Grid-Systemen
9
unter dem Namen Sun Grid Engine3 weiter. Wolfgang Gentzsch ging nach Amerika
und avancierte bei Sun zum Grid-Verantwortlichen [Sun Microsystems, Inc., 2002],
[Meyer, 2005].
Von Seiten der Industrie wurde im April 2004 die Enterprise Grid Alliance mit
der Aufgabe ins Leben gerufen, die seither als Standardisierungsgremium für den
Einsatz von Gridtechnologien im Unternehmensbereich dient. Die Gründer dieses Forums waren EMC, Fujitsu Siemens Computers, HP, Intel, NEC, Network
Appliance, Oracle und Sun Microsystems, AMD, Ascential Software, Cassatt, Citrix, Data Synapse, Enigmatec, Force 10 Networks, Novell, Optena, Paremus und
Topspin [EGA, 2004].
Im September 2005 startete die von der Bundesregierung geförderte D-Grid Initiative4 . Sie dient vorallem dem Zweck, eine nachhaltige Grid-Infrastruktur in
Deutschland aufzubauen. Hierzu kam dann Wolfgang Gentzsch als Koordinator
des D-Grid wieder nach Deutschland zurück.
Im Juni 2006 vereinten sich schließlich das Global Grid Forum und die 2004 gegründete Enterprise Grid Alliance zum Open Grid Forum5 .
2.3 Klassifizierung von Grid-Systemen
Die Aufgabenfelder, in denen man Grid-Computing anwenden kann, umschließen
ein gewaltiges Spektrum. Hierbei ist eine klare Abgrenzung zwischen den einzelnen
Feldern kaum möglich, denn die Grenzen sind fließend und Mischformen sind keine Seltenheit. Dieser Umstand erschwert die Klassifizierung von Grids. Es haben
sich aber mittlerweile in der Literatur drei Gruppierungen von Grids herauskristallisiert, welche deutlich voneinander abgesetzt sind. Die Definitionen stammten
ursprünglich von IBM und werden inzwischen von der Grid-Gemeinde so akzeptiert
[Bart, 2003].
3
http://gridengine.sunsource.net/
https://www.d-grid.de/
5
http://www.ogf.org/
4
10
2.3. Klassifizierung von Grid-Systemen
Computional Grid: Das Anwendungsgebiet dieses Grids liegt in der Bereitstellung von Rechenleistung. Hierbei handelt es sich bei den Maschinen meist um
Hochleistungsserver.
Scavenging Grid: Scavenging bedeutet auf Deutsch eigentlich Plünderung. Damit ist aber die Ausnutzung brachliegender Rechenleistungen von gewöhnlichen
Desktop-PCs gemeint, wenn diese vom Anwender nicht benötigt werden.
Data Grid: Diese Form des Grids ermöglicht den Verbund von Datenbanken
über Unternehmensgrenzen hinweg. So können zum Beispiel Fachbereiche mehrerer
Universitäten mit gleichen Forschungsgebieten ihre Daten zusammenschließen und
gemeinsam verwenden.
Die Definition der Anwendungsfelder sind aber nur eine Form der Klassifizierung.
Eine andere beschreibt die Entwicklung und Größenordnung von Grids [Thompson
und Clavenna, 2003].
Cluster: Unter einem Cluster versteht man den direkten Zusammenschluss von
meist homogenen Servern am gleichen Ort. Diese Zusammenschlüsse entstehen aus
dem Bestreben, Supercomputer aus Standardkomponenten zu bauen, wie es beim
Beowulf-Cluster der NASA der Fall war. Cluster sind wohl die heute am meisten
verbreiteste Form von Grid-Systemen.
Intra-Grid: In ihm wird der Zusammenschluß von Clustern meist innerhalb von
Unternehmensgrenzen definiert, um so Rechenleistung und Datenbestände anderen
Abteilungen zugänglich zu machen. Diese können geographisch verteilt sein, und
es bedarf einer komplexeren Middelware, um Zugriffe zu koordinieren.
Extra-Grid: Diese verbinden nun Intra-Grids und Cluster über Unternehmensund Ländergrenzen hinweg miteinander. Ein solches Unterfangen stellt natürlich
2.4. Anwendungsgebiete von Grid Computing
11
große Herausforderungen an die Integrität, Authensität und Verfügbarkeit der Leistungen. Das wiederum erfordert eine hohe Abstraktion durch die Middleware, die
meist durch Webservices versucht, diesem gerecht zu werden.
Inter-Grid: Hierunter verbirgt sich die Idee von weltweit verfügbaren Grids,
welche alle bisher genannten Klassifizierungen mit einschließen. Diese sind -ähnlich
mit dem Informationsaustausch im Internet heute- jederzeit und überall verfügbar.
2.4 Anwendungsgebiete von Grid Computing
Die Entwicklung eines Grid Systems hängt von den gestellten Anforderungen ab.
Um diese besser abschätzen zu können, muss man wissen, aus welchen Gründen
Grid Systeme aufgebaut werden. Die Beschreibung der wichtigsten Befähigungen
erfolgt in diesem Abschnitt [Berstis, 2002].
Nutzen von brachliegenden Ressourcen: Der einfachste Fall von Grid Computing besteht darin, einen existierenden Auftrag auf eine andere Maschine auszulagern. Dies ist dann sinnvoll, wenn die ursprüngliche Maschine unerwartet hoch
ausgelastet ist. Um eine Aufgabe auf einer anderen Maschine im Grid auszuführen, sind zwei Bedingungen notwendig. Zunächst muss der Mehraufwand für das
ferngesteuerte Ausführen der Arbeit in einem vernünftigen Rahmen bleiben. Sodann müssen die Anforderungen, die die Aufgabe stellt, also Hardware, Software,
Speicher, etc. von der anderen Maschine erfüllt sein.
Dieser Aufwand macht natürlich nicht bei jeder Anwendung Sinn. Im optimalen
Fall braucht eine ferngesteuerte Anwendung während ihrer Laufzeit keine Kommunikation bzw. Interaktion mit der ursprünglichen Maschine. Allerdings wäre
beispielsweise die Auslagerung einer Textverarbeitung mit Sicherheit keine sinnvolle Anwendung, weil hierbei, verursacht durch die systembedingte Interaktion,
hohe Lasten und Latenzzeiten im Netzwerk zu erwarten sind.
12
2.4. Anwendungsgebiete von Grid Computing
Die Auslastung von Rechnern am Arbeitsplatz liegt meist unter 5%. Zudem gibt
es in vielen Unternehmen Server, die die meiste Zeit brachliegen. Hier lohnt der
Aufbau eines Grids, welches solche Ressourcen erkennt und diese über eine Schnittstelle zur Verfügung stellt. Doch nicht nur verfügbare Rechenleistung lässt sich
nutzen, sondern auch Spezialhardware oder Speicherplatz. Ebenso lassen sich Applikationen replizieren, um so eine Lastverteilung im Netzwerk vorzunehmen. Als
ein gutes Beispiel hierfür währe das Round Robin Prinzip von Domainservern zu
nennen.
Parallele CPU Ausnutzung: Die Verwendung von sehr vielen parallel betriebenen CPUs ist eine der interessantesten Anwendungen im Grid. Hierzu ist es
notwendig, die Arbeitsschritte in parallel ausführbare Teilaufgaben zu unterteilen. Es gibt zahlreiche Wissens- und Wirtschaftsgebiete, die dies zulassen, z.B. die
Biomedizin, die Berechnung von Finanzmodellen, die Ölforschung, die Bildverarbeitung, die Generierung von Computergrafiken und viele Bereiche mehr.
Die Teilaufgaben einer Anwendung werden dann gleichmäßig über die vorhandenen
CPUs verteilt. Theoretisch wäre so ein System mit n Prozessoren und n Aufgaben
auch n mal schneller als eine einzelne Maschine. Dies ist allerdings in der Realität
nicht der Fall, da hier noch der zusätzliche Verwaltungsaufwand hinzukommt. Denn
zum Einen müssen die Aufgabe in ihre Teilstücke zerlegt und zum Anderen die
Verteilung während deren Abarbeitung gemanagt werden.
Dabei treten eine Reihe von Hindernissen auf, die eine optimale Skalierung der
Teilaufgaben beeinträchtigen und so die Parallelisierung einschränken. Die erste
Einschränkung ist die limitierte Aufspaltung eines Algorithmus. Hierdurch wird
das erste Limit festgelegt. Die zweite Einschränkung geschieht, wenn zwei Teilaufgaben nicht vollständig unabhängig voneinander arbeiten können. Benötigen
zwei Teilaufgaben zum Beispiel Schreibzugriff auf einen Datenbestand, so ist die
Erteilung der Zugriffserlaubnis ein weiteres Hindernis. Ebenso arbeiten Netzwerkbandbreiten, Latenzen und auch Protokollsynchronisierungen gegen Echtzeitanforderungen.
2.4. Anwendungsgebiete von Grid Computing
13
Anwendungen: Es gibt einige Faktoren, welche dafür sprechen, Anwendungen
gleich mit Grid-Funktionalität auszustatten. Aber nicht alle Anwendungen können in parallelen Prozessen in einem Grid ablaufen. Es ist schwer bis unmöglich,
Anwendungen, die für einen einzelnen Rechner konzipiert wurden, in ein Grid zu
integrieren. Neue Entwicklungen mit rechenintensiven Arbeitsschritten sollten daher von Anfang an für eine Parallelisierung ausgerichtet werden.
Zusammenarbeit durch virtuelle Ressourcen und Organisationen: Grid
Computing kann ebenfalls die Zusammenarbeit eines großen Publikums ermöglichen und vereinfachen. Die Idee, die man früher unter distributed computing
verstand, ist durch Grids möglich geworden und dies mittlerweile weit über die
damaligen Vorstellungen hinaus. Hierzu können sich beliebig viele Teilnehmer zu
beliebig vielen virtuellen Organisationen zusammenschließen. In dieser virtuellen
Organisation ist es dann möglich, nun bestehende Ressourcen mit den anderen
Benutzern zu teilen.
Derartiges Teilen beginnt mit dem Data Grid. Hier können alle Teilnehmer auf
einen gemeinsamen Datenbestand zugreifen. Sie können aber auch die noch freien Kapazitäten im Grid bündeln, welche dann die potentiellen Kapazitäten eines
alleinstehenden Systems bei weitem überflügeln. Zudem können Datenstände automatisch repliziert und dadurch vor Ausfall gesichert werden. Durch parallelen
Zugriff auf redundante Daten können sodann auch noch die Zugriffszeiten optimiert werden.
Das Teilen begrenzt sich hierbei nicht nur auf die Dateien. Auch Hardware, Dienste,
Lizenzen und Ähnliches sind teilbar. Hierzu überzieht man diese Komponenten mit
einer Virtualisierungsschicht, um so den Zugriff zu standardisieren.
Resource balancing: Der Zusammenschluss vieler Maschinen in einem Grid zu
einer großen virtuellen Maschine ermöglicht ressource balancing. Hierdurch werden
ausgelastete Maschinen entlastet, indem Aufgaben auf andere Maschinen übertragen werden, die noch freie Kapazitäten haben. Aber auch load balancing ermög-
14
2.5. Der Vergleich mit Peer-To-Peer
licht, die Netzlast in einem Grid zu verteilen. Ohne eine Grid-Infrastruktur sind
solche Entscheidungen allerdings um ein Vielfaches schwerer.
Verfügbarkeit: Heute realisiert man die Verfügbarkeit und die Hochverfügbarkeit eines Systems durch Redundanz und Hot-Plugable Komponenten, die einen
Komplettausfall eines Systems verhindern sollen. In einem Grid könnte dies, unabhängig von teuer Hardware, durch reine Softwarelösungen realisiert werden, und
das wiederum unabhängig vom geographischen Standort.
2.5 Der Vergleich mit Peer-To-Peer
In den letzten Jahren haben sich zwei Ansätze entwickelt, die sich um die Problemlösung bemühen, welche unweigerlich beim Arbeiten mit großen verteilten
Rechennetzen entstehen. Diese sind Grid Computing und Peer-To-Peer (P2P).
Beide schreiten in ihrer Entwicklung mit großen Schritten voran, besitzen sehr
erfolgreiche Anwendungen und erfreuen sich immer wiederkehrender temporärer
Aufmerksamkeit der Öffentlichkeit. Was ist nun aber der Vorteil des einen Systems, wie unterscheidet er sich von dem des anderen und welche Vorteile haben sie
beide gemeinsam? Dies soll im folgenden Teil der Diplomarbeit erläutert werden.
Hierzu wird Bezug auf [Foster und Iamnitchi, 2003] und [Hauswirth und Dustdar,
2005] genommen, welche als Einstiegsliteratur zu empfehlen sind.
Was ist P2P?
Um einen abschließenden effektiven Vergleich ziehen zu können, werden zunächst
die Grundprinzipien von P2P erläutert. In diesem Zusammenhang wird sich zeigen,
dass P2P nicht gleich P2P ist und dass die meisten Implementierungen von solchen
Netzen nicht als reine P2P Netze zu bezeichnen sind.
Das Wort Peer bedeutete ursprünglich Gleichgestellter und bezieht sich in der Da-
2.5. Der Vergleich mit Peer-To-Peer
15
tenverarbeitung auf die Client-Server Funktionalität. In klassischen Netzwerken,
wie z.B. dem Internet, sind die Rollen klar verteilt. Hier gibt es Clients und Server.
Ein Server, sei es für FTP, HTTP, SMTP oder sonst ein Protokoll, bietet Dienstleistungen an, die durch einen Client in Anspruch genommen werden können. Bei
Peers fällt dieser Unterschied jedoch weg, denn jeder Peer kann Dienstleistungen
anbieten und solche aber auch bei anderen Peers nutzen. Peers werden in der
Literatur häufig auch als Nodes oder Servent bezeichnet.
Eine Besonderheit von P2P Netzen ist die Selbstorganisation, die durch autonome
Entscheidungen der einzelnen Peers zustande kommt. Dies bedeutet, dass das Verhalten des kompletten Systems das Resultat eigenständiger Entscheidungen der
Teilnehmer ist. Aus dieser Perspektive betrachtet, ist ein solches Netzwerk auch
als soziale Struktur zu sehen und bleibt somit nicht auf die rein technische Sichtweise beschränkt. So könnten eBay oder Ameisenkolonien eigentlich vom Prinzip
her ebenfalls als P2P bezeichnet werden [Hauswirth und Dustdar, 2005].
Zu den wichtigsten Aspekten von verteilten Systemen gehören deren Skalierbarkeit und Fehlertoleranz. Ein reines P2P System kann fast beliebig skalieren. Fehler,
beispielsweise der Ausfall von Peers, können bis zu einem gewissen Grad verkraftet werden. Denn das Netz verfügt über eine Art Selbstheilung und strickt sich,
wenn nötig, um die Fehlerstelle wieder neu zusammen. Um dies zu ermöglichen,
abstrahieren P2P Netze von der normalen Netzstruktur und überziehen diese mit
einer virtuellen Netzstruktur. Eine tiefergehende Erklärung bietet [Harwood und
Tanin, 2003].
Wie bereits erwähnt, sind aber nicht alle Netze mit P2P Technologie auschließlich reine P2P Netze, sondern sie bedienen sich ebenfalls anderer Techniken, wie
z.B. dem Client-Server Prinzip, weshalb man sie auch Hybridnetze nennt. Ebenso verhielt es sich seinerzeit bei Napster [Ding u. a., 2003]. Um die Komplexität
des Auffindens einer Datei zu umgehen, wurde dort ein zentraler Indexserver verwendet. Diesem Server teilte man bei Eintritt ins Netzwerk die Metadaten seines
Datenbestandes mit. Bei Suchanfragen durchsuchte der Server dann seinen Metadatenbestand und gab die Adressen der Treffer zurück.
16
2.5. Der Vergleich mit Peer-To-Peer
Was sind die Anwendungsgebiete von P2P?
Der wohl bekannteste Anwendungsfall ist das Filesharing. Hier stellen die Peers
einen ausgewählten Datenbestand den anderen Peers zur Verfügung. Darauf wird
in Kapitel 4 näher eingegangen.
Instant Messaging ist ein weiteres Gebiet, auf dem P2P Netze Verwendung finden.
In den meisten Fällen handelt es sich hierbei um Hybridnetze. Dort existieren
zentrale Server, bei denen man sich anmeldet und die die Benutzerlisten verwalten.
Groupware, wie zum Beispiel Groove6 , nutzen ebenfalls P2P. Groupeware unterstützen Teams in der Zusammenarbeit. Sie offerieren gemeinsame Kalender, Diskussionsforen, Dateiaustausch, Chat und ähnliche Features, die die Kommunikation in Arbeitsgruppen verbessern kann.
P2P versus Grid
Kommen wir nun zu einem direkten Vergleich zwischen Peer-To-Peer und Grid
Computing. Wie bereits erwähnt, verfolgen beide die Ansätze von verteilten Anwendungen und Dienstleistungen. Beide schließen über eine virtuelle Netzwerkschicht die Teilnehmer und ihre Ressourcen zu virtuellen Organisationen zusammen. Der Unterschied lässt sich in zwei Aspekte zusammenfassen:
Als erster Aspekt ist der Service zu erwähnen. Stark vereinfacht könnte man sagen: In einem Grid sind weniger Teilnehmer, die mehr Service bekommen, und
in einem P2P Netz sind mehr Teilnehmer, die weniger Service bekommen. Ein
Grid kann umfangreiche Ressourcen umfassen, wie Computer, Speicherplatz, beliebige Instrumente, Software oder Daten. Diese werden alle über das Internet
und die darüber liegenden Middelware verbunden. Letztere stellt die Ressourcen
dann abstrahiert als Dienstleistungen ins Grid. Solche Dienstleistungen sind Teil
der virtuellen Organisationen, denen auch die potentiellen Nutzer angehören. Die
Nutzer selbst können alle nur im Rahmen vorher definierter Regeln agieren. P2P
6
http://www.groove.net
2.5. Der Vergleich mit Peer-To-Peer
17
Netzwerke hingegen sind in den meisten Fällen nur auf eine Dienstleistung beschränkt. Außerdem können Ressourcen unvorhersagbar hinzukommen und auch
wieder verschwinden.
Als zweiter Aspekt gilt festzuhalten, dass ein Grid nicht komplett dezentral ist.
Es gibt zentrale Punkte, bei denen man sich registriert und die einem die zugewiesenen Rechte kontrollieren. Ressourcen gehören Besitzern, die die Rechte für
deren Verwendung reglementieren. Die Verbindung der einzelnen Ressourcen sind
in den meisten Fällen stabil. Bei P2P Netzen kommen Anwender unvorhersagbar
dazu oder verschwinden. Alle Peers unterliegen meist gleichen Rechten. Zu berücksichtigen ist weiterhin, das die Verbindungen der Peers nicht stabil sind und sie
jederzeit abbrechen können.
Als Fazit lässt sich daher sagen, dass beide Technologien ihre Vor- und Nachteile
haben. Letztendlich sind diese Verfahren Pionierleistungen auf dem Gebiet der
verteilten Systeme, nur dass das eine sein Feld sozusagen von links und das andere
seines von rechts aufrollt. Ian Foster schreibt hierzu:
Grid and P2P are both concerned with the pooling and coordinated
use of resources within distributed communities and are constructed as
overlay structures that operate largely independently of institutional
relationships. Yet despite these commonalities, there are also major
differences in communities, incentives, applications, technologies, resources, and achieved scale.
Nevertheless, we argue that the vision that motivates both Grid and
P2P computing - that of a worldwide computer within which access
to resources and services can be negotiated as and when needed - will
come to pass only if we are successful in developing a technology that
combines elements of what we today call both P2P and Grid computing.[Foster und Iamnitchi, 2003]
18
3 Standards und Marktführer
Im Bereich des Grid Computing gelten eine ganze Reihe von Standards und Implementierungen, die sich etablieren konnten. Die wichtigsten und interessantesten
hiervon wurden im Rahmen der Arbeit näher unter die Lupe genommen. Dieses
Kapitel bietet einen Überblick der gesammelten Erkenntnisse. Zum Schluss folgt
eine Beurteilung der untersuchten Implementierungen auf das Kriterium hin, inwieweit diese für das zu entwickelnde System verwendbar sind. Die Analyse führte
zu der Entscheidung, dass keiner der untersuchten Kandidaten in Betracht kam,
sondern für die vorliegende Arbeit eine Eigenentwicklung auf Basis eines Filesharing Protokolls bevorzugt wurde.
3.1 Open Grid Forum
Das Open Grid Forum (OGF), ehemals als Global Grid Forum bekannt, ist ein
Standardisierungsgremium mit Mitgliedern und Sponsoren aus Wissenschaft und
Industrie. Im Prinzip also gleichbedeutend der Internet Engineering Task Force
(IETF) für das Internet, veröffentlicht das OGF Empfehlungen zur Standardisierung des Grids.
Besagtes OGF untergliedert sich in die drei Gruppen: eSience Function, Enterprise
Function und Standards Function. eSience Function zeichnet für die Zusammenarbeit mit Wissenschaftlern, Ingeneuren und Lehrenden verantwortlich. Es versucht,
ein gemeinsames Forum für diese Gruppen zu ermöglichen, um so Anforderungen zu erkennen und den Fortschritt allen Beteiligten zugänglich zu machen. En-
3.2. Die Globus Alliance
19
terprise Function hat dieselbe funktionale Beschaffenheit für die Zielgruppe der
IT Industrie und der Software Vertreiber. Die Standards Function trägt die Verantwortung für die Entwicklung von Architekturen, Spezifikationen, Roadmaps,
Glossaren und ähnlichen Tätigkeiten, die sich mit der Standardisierung von Grid
Software beschäftigen.
Der wohl wichtigste und bekannteste Standard, den die OGF verabschiedet hat,
war die Open Grid Service Architecture (OGSA) [Foster u. a., 2002]. Das Hauptanliegen von OGSA besteht darin, alle Ressourcen als Service im Netzwerk zur
Verfügung zu stellen. So sollen Speicherressourcen, Netzwerke, Programme, Datenbanken, Instrumente etc. durch eine virtuelle Komponente als Grid Service
angesprochen werden können. Solch ein Grid Service ist ein Web Service, der die
OGSA Konventionen einhält und diverse Standardschnittstellen implementiert.
3.2 Die Globus Alliance
Die Globus Alliance1 erforscht und entwickelt Grid Technologien und Standards.
Sie besteht aus einem Zusammenschluß von mehreren Institutionen, wie dem Argonne National Laboratory, dem University of Southern California’s Information
Sciences Institute, der University of Chicago, der University of Edinburgh, des
Swedish Center for Parallel Computers, und des National Center for Supercomputing Applications (NCSA).In Fachkreisen gilt die Globus Alliance als eines der
führenden Mitglieder des Open Grid Forums.
Bei [Foster u. a., 2001] wird die Anatomie des Globus Grids ausführlich beschrieben. Diese setzt sich aus der Gliederung von Arbeitsgruppen in virtuelle Organisationen und dem Schichtenmodell für Grids, ähnlich dem ISO/OSI Modell, zusammen.
1
http://www.globus.org/alliance/about.php
20
3.2. Die Globus Alliance
Application
Collective
Application
Resource
Transport
Connectivity
Fabric
Internet
Link
Internet Protocol Architecture
Grid Protocol Architecture
Virtuelle Organisationen: Die Notwendigkeit von virtuellen Organisationen
(VO) zeigt sich darin, dass man Ressourcen, die im Grid angeboten werden, nur
einem definiertem Anwenderkreis zur Verfügung stellen möchte. Hierzu muss sich
der Anwender in derselben VO wie die Ressource befinden. Innerhalb der VOs gibt
es dann weitere Reglementierungen, die den Zugriff auf die Ressourcen steueren.
Abbildung 3.1: Das Globus Grid Schichtenmodell [Foster u. a., 2001]
Das Schichtenmodell: Wie schon erwähnt, ist dieses Modell an das ISO/OSI
Netzwerkmodell angelehnt. Jede folgende Schicht abstrahiert stets von der jeweils
darunterliegenden Schicht. Man bezeichnet das Grid Modell auch als Sanduhrenmodell, da es sich in der Mitte verjüngt. Mit diesem Begriff soll verdeutlicht werden,
dass dort die Anzahl der Collective- und Resourceprotokolle auf einen wesentlichen
Bestandteil reduziert ist.
Die Fabric ist die allerunterste Schicht. Hier befinden sich die eigentlichen Ressourcen, wie Cluster, Datenbanken oder Instumente. Auf diese Fabric Schicht kann
nur direkt lokal zugegriffen werden. Auch Internetprotokolle wie FTP oder NFS
können Ressourcen dieser Schicht sein. Sie sind allerdings nicht als Teil der Grid
Architektur zu verstehen.
Die darüber folgende Connectivity Schicht beschreibt den Kern der Authentifizierung und Kommunikation der Grid Transaktionen. Kommunikationsprotokolle
ermöglichen den Datenaustausch mit der Fabric Schicht, und Authentifizierungsprotokolle bauen auf der Kommunikation auf. Sie stellen Funktionen zur Authen-
3.2. Die Globus Alliance
21
zität und Integrität der Datenübertragung bereit.
Sodann baut die Resource- auf der Connectivity Schicht auf und bietet Protokolle, um Zugriffe auf Ressourcen zu initiieren, zu überwachen, zu steueren und
abzurechnen.
Während die Resource Schicht sich um die Interaktion mit einzelnen Ressourcen
bemüht, ist es die Aufgabe der dann folgenden Collective Schicht, sich um globale
Operationen zu kümmern, die mehr als nur eine Ressource in Anspruch nehmen.
Das heißt also, bei einer ankommenden Aufgabe ermittelt die Collective Schicht
zunächst den Bedarf an Ressourcen, findet dieselben als nächstes auf, um sie dann
ihren Aufgaben zuzuweisen.
Application bildet dann die oberste Schicht, in der die Dienste des Grids innerhalb
einer VO in Anspruch genommen werden können.
Globus Toolkit: Als zentrales Produkt der Globus Alliance fungiert die Open
Source Software Globus Toolkit2 . Sie stellt Dienste und Bibliotheken zu den Bereichen verteilte Sicherheit, Ressourcen Management, Monitoring, Resource Discovery und Datenmanagement zur Verfügung. Die aktuelle Version der Software
nennt sich GT4, welche auch Komponenten für das OGSA Framework bereit hält.
Das Globus Toolkit kann in seiner aktuellen Version 4.0.3 allerdings nur für UNIX
Betriebsysteme bezogen werden. Zwar wird eine Java Implementierung angeboten,
jedoch sagt Globus einerseits hierzu, dass die Version auf allen Betriebssystemen
laufen „könnte“ und andererseits wird nicht das vollständige Toolkit von der o.a.
Implementierung unterstützt, sondern nur Kernbestandteile davon.
2
http://www.globus.org/toolkit/about.html
22
3.3. Sun N1 Grid Engine
3.3 Sun N1 Grid Engine
Der Vertrieb der Gridsoftware von Sun läuft unter Sun N1 Grid Engine3 und liegt
zur Zeit in Version 6.0 vor. Diese Software wird als Open Source Projekt unter
SunSource.net4 zum Download bereit gestellt.
Das System funktioniert nach folgenden Schritten: Es akzeptiert Aufgaben (Jobs),
welche von außen in das System eingespeist werden. Jobs sind Benutzeranfragen
nach Ressourcen. Solche Jobs verweilen in einer Warteschlange (Queue), bis das
System sie zur Ausführung freigibt. Geschieht dies, wird der Job an die ausführende
Einheit gesendet und dort erledigt. Das System verwaltet die laufenden Jobs und
speichert die Ergebnisse beendeter Jobs ab.
Zu den Kernaufgaben des Systems gehört das Auffinden der passenden Ressourcen
zur richtigen Zeit für jede Anfrage. Hierzu ermittelt dieses System eine Priorität des
Jobs aus Parametern wie Wartezeit, Ansprüche, Dringlichkeit, Ausführungsdauer,
bevorzugter Behandlung und noch weiteren Faktoren.
Sun realisiert sein Grid in vier Komponententypen. Diese sind Master Host, Execution Host, Administration Host und Submit Host. In den folgenden Erklärungen
werden die dafür benötigten Dienste genannt, welche nachstehend noch kurz erläutert werden. [Sun Microsystems, Inc., 2005d].
Master Host ist das Zentrum der gesamten Clusteraktivität. Er besteht aus
dem Master Dienst sge_qmaster und dem Planer sge_schedd. Zusammen verwalten diese Dienste Jobs und Queues. Im Standardfall ist der Master Host auch
Administration Host und Submit Host.
Execution Hosts sind Gridnodes, die Jobs bearbeiten können. Hierfür verwaltet
jeder Node eine eigene Queue für seinen Host. Der Dienst für diesen Host ist der
3
4
http://www.sun.com/software/gridware/
http://gridengine.sunsource.net/
3.3. Sun N1 Grid Engine
23
sge_execd.
Administration Hosts haben das Recht, alle administrativen Aufgaben auszuführen, um das Grid zu steuern.
Submit Hosts berechtigen Benutzer, Jobs in das Netz zu stellen, und diese zu
konfigurieren. Hierfür gibt es bei Bedarf die grafische Oberfläche QMON.
Die Grid Engine besteht aus drei Diensten:
sge_qmaster ist Mittelpunkt der Verwaltungs- und Planungsaktivitäten. Er hält
Tabellen über die Hosts, Queues, Jobs, Systemlast und der Benutzerberechtigungen. Zudem bekommt er Entscheidungen vom sge_schedd und Anfragen von den
sge_execd Hosts.
sge_schedd ist ein Scheduling-Dienst und hat mit der Hilfe des sge_qmaster
eine Gesamtübersicht über die Aktivitäten des Grids. Er fällt die Entscheidungen,
wann ein Job wo ausgeführt wird, und wie die Daten des Jobs, inklusive seiner
Ergebnisse wem zur Verfügung gestellt werden. Diese Entscheidungen übergibt er
an den sge_qmaster.
sge_execd verwaltet eine Queue mit Jobs, die er nach und nach abarbeitet. In
regelmäßigen Abständen beliefert er den sge_qmaster mit aktuellen Statusinformationen.
Eine Windows Version der Software ist zwar in der aktuellen Version verfügbar, allerdings ist diese mit hohen Anforderungen an das Windowssystem verbunden und
beschränkt sich auf den sge_execd Dienst. Die vordringlichsten Bedingungen sind
zum einen die Installation der Microsoft Windows Services for UNIX (SFU) und
zum anderen der Verzicht auf verschlüsselte Datenübertragung [Sun Microsystems,
Inc., 2005b].
24
3.4. Condor
3.4 Condor
Condor5 ist ein Open Source System zur Lastverteilung von rechenintensiven Aufgaben in einem Netzwerk. Entwickelt wird es an der University of WisconsinMadison. Wie alle großen Systeme in diesem Segment besitzt es die Fähigkeiten,
Aufgaben in eine Warteschlange aufzunehmen, diese durch einen Planer und einem
Prioritätsschema zu bewerten, um sie dann den Ressourcen zuzuteilen. Dafür besitzt es Mechanismen zum Auffinden, Überwachen und Zuweisen von Ressourcen.
Außerdem verfügt es über spezielle Fähigkeiten, um die Rechenleistung nicht nur
von dedizierten Servern, sondern auch von Workstations mit einzubeziehen. Zu
diesem Zweck überwacht Condor permanent die Auslastung der CPU, sowie die
Eingabegeräte am Computer. Nach einer festgelegten Zeit der Inaktivität wird
die Rechenleistung für das Grid freigegeben. Sollte der Benutzer der Workstation
während der Ausführung einer Aufgabe ein Eingabegerät bedienen oder ein NichtCondor Prozess eine zu hohe Last erzeugen, wird die Aufgabe umgehend beendet.
Wenn möglich, wird diese dann auf einem freien Rechner integriert und dort weiter
ausgeführt.
Konzeptionell unterteilt sich Condor in folgende Bereiche: DAGMan, Checkpointing und Migration, Remote System Calls, die ClassAds und die Universen. Sie
werden nun unter Zugrundelegung von [Condor, 2006] erläutert.
DAGMan: Dieses Akronym steht für Directed Acyclic Graph Manager. Mit
ihm lassen sich Abhängigkeiten zwischen den Teilaufgaben einer Gesamtaufgabe
formulieren. Ein Knoten im Graphen entspricht einer Teilaufgabe. So kann man
definieren, welche Teilaufgaben wegen Abhängigkeiten seriell ablaufen müssen und
welche unabhängig parallel abgearbeitet werden können.
Checkpointing und Migration: Mittels dieser Technik ist es möglich, Prozesse auf andere Systeme zu übertragen. Wenn ein Benutzer an seine Workstation
5
http://www.cs.wisc.edu/condor/
3.4. Condor
25
zurückkehrt, wird der aktuell laufende Condor-Prozess umgehend beendet und
auf einem freien Rechner weitergeführt. Hierzu erstellt Condor in regelmäßigen
Abständen Abbilder (Checkpoints) des vom Prozess reservierten Arbeitsspeichers
her. Bei einem Abbruch des Prozesses wird sofort der letzte Checkpoint auf eine andere Maschine übertragen. Diese Abbilder werden dann in den Speicher
geladen (Migration) und können deshalb direkt weiterarbeiten. Dadurch ist das
partielle Abarbeiten einer langwierigen Aufgabe auf Workstations möglich. Eine
solche Fähigkeit wird allerdings mit schweren Einbußen erkauft. So sind zum Beispiel keine Schreibzugriffe auf Dateien erlaubt. Ebenfalls sind viele Systemaufrufe,
wie sleep() oder exec() nicht zulässig. Weiterhin dürfen Kernel-Threads oder
Netzwerkverbindungen im zu sichernden Prozess nicht auftreten. Speicherabbilder
können auch enorme Größen erreichen, die erst mal über das vorhandene Netzwerk transportiert werden müssen. Die Vorraussetzung zum Checkpointing ist,
dass man die Objektdateien des auszuführenden Programms besitzen und diese
mit Condor neu linken muss. Letztendlich kann man sagen, dass dieses Verfahren
nur unter sehr begrenzten Bedingungen eingesetzt werden kann, dann aber enorme
Geschwindigkeitsvorteile bietet.
Remote System Calls: Hierüber ist es möglich, ein Verhalten dergestalt zu
simulieren, als ob der fernaufgerufene Prozess tatsächlich auf dem eigenen Rechner
laufen würde. Dazu werden alle Systemaufrufe des Prozesses umgeleitet. Auch dies
erfordert das Neulinken der Objektdateien mittels Condor.
ClassAds: Sie sind die Grundlage der Aufgabenplanung und der Auswahl passender Ressourcen. Die Rechner im Grid senden regelmäßig Statusinformationen
an einen Server. Diese beinhalten sowohl Informationen über den verfügbaren Arbeitsspeicher, die Rechenleistung und die Auslastung als auch weiterer Daten, die
für die Vergabe von Aufgaben von Interesse sind. Wird nun eine Aufgabe ins Grid
gestellt, kann anhand von den Aufgabenanforderungen jeweils die passende Hardware ermittelt werden.
26
3.4. Condor
Universen: Das Konzept der Universen beschreibt, in welcher Laufzeitumgebung die Aufgaben arbeiten. Am häufigsten werden das Standard Universum und
das Vanilla Universum verwendet. Darüber hinaus gibt es aber noch eine Reihe
weitere Universen, von denen die wichtigsten hier nur kurz Erwähnung finden.
Das Standard Universum unterstützt Checkpointing und Remote System Calls. Bei
diesem Verfahren arbeiten die Aufgaben so, als ob sie auf dem eigenen Rechner
laufen.
Dieses Feature hat das Vanilla Universum nicht in seinem Angebot. Dafür fallen
die oben genannten Vorraussetzungen für Checkpointing und Remote System Calls
weg. Somit wird ermöglicht, dass jede beliebige Software ausgeführt werden darf.
Zuvor überträgt der aufrufende Rechner die benötigten Dateien auf den Zielrechner.
Das Grid Universum bietet eine Schnittstelle zu mehr Gridfunktionalität, die zweigeteilt ist, und zwar in Condor-C und in Condor-G . Condor-C erlaubt, Aufgaben
von der Warteschlange eines Rechners in die eines anderen zu übertragen.
Zudem ist es gegen Netzwerkausfälle ausgesprochen resistent. Eine Beispielszenario
wäre, dass man von irgendeinem Ort der Welt über einen Labtop eine Aufgabe
in einen Condor-Pool stellt, dann offline geht und irgendwann später wieder seine
Verbindung mit dem Pool aufbaut, um sich das Ergebnis abzuholen.
Condor-G wiederum ist eine Schnittstelle, die es ermöglicht, Condor-Aufgaben in
ein Globus Grid einzuspeisen und dort erledigen zu lassen.
Weiterhin gibt es auch die PVM, MPI und Java Universen, die für die Integration
der jeweiligen Technologie dienen.
Als letztes Universum bleibt noch das Scheduler Universum zu erwähnen. In ihm
werden keine Teilaufgaben verteilt, sondern die Aufgabe wird komplett auf dem
Rechner ausgeführt, der sie gestartet hat. Diese Vorgehensweise ermöglicht die
lokale Verwendung von DAGMan.
3.5. BOINC
27
Condor Umgebungen sind in sogenannten Pools organisiert. In einem solchen Pool
existieren Rechner mit verschiedenen Rollen, die hier nun kurz beschrieben werden.
Central Manager: Er hält alle ClassAd Informationen und weist freien Ressourcen passende Aufgaben zu. Je Condor Pool ist nur eine Instanz eines Central
Managers vorhanden.
Execute-Hosts: Sie sind die Arbeiter im Pool, die die zugewiesenen Aufgaben
abarbeiten.
Submit-Hosts: Diese Dienste sind die Auftaggeber im Pool. Hierüber lassen
sich Aufgaben in das Netz stellen. Für jeden Prozess, den ein Submit-Host an den
Pool abgibt, existiert auf selbigem ein Shaddow-Prozess, der als Fernbedienung
für den eigentlichen Prozess zu verstehen ist. Das Standard Universum verhält
sich dabei so, als ob der Shaddow-Prozess der tatsächliche Arbeitsprozess wäre.
Checkpoint Server: Ein solcher Server ist ein optionaler Dienst, der alle Checkpoints im Pool speichern kann. So ein Prozess stellt natürlich große Anforderungen
an Speicherplatz und Netzwerkbandbreite des verwendeten Rechners.
Die Condor Umgebung gibt es für alle gängigen Betriebssysteme, und somit ist sie
auch für heterogene Netze gut geeignet.
3.5 BOINC
Dieses Akronym bedeutet Berkeley Open Infrastructure for Network Computing6 .
Sie ist ein Open Source Framework, welches eine Plattform für Scavenging Grids
6
http://boinc.berkeley.edu/
28
3.5. BOINC
bietet. Durch den BOINC Client kann ein Rechner seine Rechenleistung an beliebige, meist wissenschaftliche Projekte zur Verfügung stellen. Welche Projekte der
Client dann unterstützt, ist abhängig von den Vorlieben des Benutzers, der sich
nämlich die Projektplugins selbst installiert.
Abbildung 3.2: Das BOINC Modell [University of California, 2006]
Ebenso ist es möglich, sein eigenes BOINC Projekt zu erstellen und bei der BOINC
Community dafür zu werben. Wie oben schon erwähnt, sind die meisten Projekte
wissenschaftlicher Natur. Es gibt aber auch anders orientierte Projekte, wie zum
Beispiel das BURP7 Projekt, welches sich mit dem Rendern von 3D Szenen beschäftigt. Der Ursprung von BOINC lag in SETI@home8 . Dieses Projekt beschäftigte sich, wie eingangs schon kurz erwähnt, mit der Suche nach außerirdischer
7
8
http://burp.boinc.dk/
http://www.setiathome.de/
3.6. Auswertung und Beurteilung
29
Intelligenz anhand der Analyse der durch Radioteleskope empfangenen Signale.
In seiner ursprünglichen Version gab es einen speziellen SETI Client. Den konnte
sich der interessierte Benutzer auf seinen Rechner installieren und diesen so in das
Netzwerk eingliedern. 1999 startete SETI@home und 2003 wurde BOINC in seiner
ersten Version veröffentlicht. 2005 hat man dann das klassische SETI@home abgeschaltet; es kann aber als BOINC Projekt weiter unterstützt werden. Der große
Schritt vorwärts von SETI@home zu BOINC bestand darin, dass die Verwaltung
solcher verteilter Projekte vom eigentlichen Projekt gekapselt wurde.
Abbildung 3.2 zeigt den Aufbau eines BOINC Projekts. Die grauen Felder sind die
Projektteile, die vom Entwickler implementiert werden müssen. Auf der Serverseite
ist dies das Project Back End, welches die Anwendungen verteilt und die Resultate
verarbeitet. Das Back End selbst baut auf dem BOINC Server Complex auf, der
das Verteilen und Sammeln von Daten verwaltet.
Dieser BOINC Server Complex besteht aus folgenden Komponenten: Mindestens
einem Scheduling Server, welcher mit den Teilnehmern kommuniziert; ferner einer
relationalen Datenbank, welche alle Informationen zur Arbeit, so wie die Teilnehmer und die Resultate speichert; sodann Bibliotheken und APIs, damit das
Project Back End mit dem Server Complex kommunizieren kann. Weiterhin besteht es aus einem Web Interface für Teilnehmer und Entwickler und zum Schluß
noch aus dem Data Server, welcher über das HTTP [Fielding u. a., 1999] Protokoll
den Dateitransfer zwischen den Clients und dem Server Complex übernimmt.
BOINC ist praktischerweise für alle gängigen Betriebssysteme verfügbar. Applikationen müssen allerdings extra für das Framework entwickelt und für jedes Betriebsystem angepasst werden, welches als Client unterstützt werden soll.
3.6 Auswertung und Beurteilung
Wie man sehen kann, gibt es eine Fülle sehr interessanter und fortgeschrittener
Projekte im Bereich der verteilten Anwendungen. Globus bietet augenscheinlich
30
3.6. Auswertung und Beurteilung
die höchste Komplexität und versucht den Themenbereich des Grid Computing
möglichst allumfassend abzudecken. Die Sun Grid Engine und Condor beschäftigen sich hauptsächlich mit der optimalen Verteilung von Aufgaben in einem Grid.
Alle drei Systeme sind für ein lokales Netz mit hoher Bandbreite optimiert. Condor sticht hier mit seinen Checkpoints und Remote System Calls besonders hervor.
Wie oben beschrieben, stellen diese Funktionen allerdings hohe Anforderungen an
die Applikation. BOINC ist speziell als Scavenging Grid im Internet ausgelegt und
universell einsetzbar. Allerdings fordert es für jedes Projekt eine eigene Entwicklung.
Das erste K.o.-Kriterium für die zu treffende Auswahl war die fehlende Vorrausetzung, auf Windows lauffähig zu sein. Hierdurch schied das Globus Toolkit und die
Sun Grid Engine aus, da diese keine vollständige Windowsunterstützung bieten.
Das zweite K.o.-Kriterium beruhte auf der Tatsache, dass die im Grid verwendeten
Applikationen nicht erst implementiert werden sollten, sondern bereits existierende hierfür vorgesehen waren. Somit war auch BOINC und Condor im Standard
Universum aus dem Rennen.
Die direkte Datenübertragung zwischen den Condor-Applikationen Execute-Hosts
und Submit-Host war dann das endgültige Aus für Condor, da dies für das vorgesehene Anwendungsgebiet der vorliegenden Arbeit, nämlich die Bearbeitung von
Aufgaben mit beliebig vielen Rechnern, nicht vertretbar ist.
Kein System greift die erwünschte Idee der Datenverteilung im Peer-To-Peer Stil
auf.
Dies sind die Gründe, warum für die vorliegende Arbeit die Entscheidung zu Gunsten einer Eigenentwicklung auf Basis eines Filesharing Protokolls gefällt wurde.
31
4 Filesharing Protokolle als Data
Grid
Zur Verteilung der Nutzdaten kommt das BitTorrent-Protokoll zur Anwendung.
Nach dem Vergleich mit konkurrierenden Filesharing-Implementierungen stellte
sich diese als die Vielversprechenste heraus. In diesem Kapitel wird die Idee der
Datenverteilung erklärt, sowie auf die grundlegenden Gemeinsamkeiten und Unterschiede von Filesharing-Protokollen eingegangen. Darauf aufbauend folgt ein
kleiner Einstieg in Verteilte Hashtabellen. Nachstehend werden die am meisten
verbreiteten Implementierungen kurz beschrieben und abschließend erfolgt die Begründung der oben genannte Entscheidung. Zum Schluss folgt dann eine vollständige Beschreibung des BitTorrent-Protokolls.
4.1 Die Idee der Datenverteilung
Wie in der Aufgabenstellung beschrieben, soll sich jeder Node die benötigten Fähigkeiten zum Bearbeiten einer Aufgabe bei Bedarf adaptiv in Form eines Moduls
aus dem Netz laden. Das ist genau das zentrale Problem dieser Arbeit, welches
in den folgenden Ausführungen gelöst wurde. Während in herkömmlichen Grids
die auf einem Node installierten Anwendungen als Entscheidungskriterium für die
Vergabe von Jobs gelten und Anwendungen wie SETI@home für lediglich genau
einen Verwendungszweck vorgesehen sind, löst sich der beabsichtigte Ansatz von
der Vorstellung, die Anwendung als feste Ressource und Entscheidungskriterium
zu sehen.
32
4.1. Die Idee der Datenverteilung
Als daraus folgende Konsequenz stellte sich die Frage, wie man die Module auf die
einzelnen Nodes verteilt. Ein oder eventuell mehrere zentrale Anlaufpunkte, die
die Module gleichzeitig sternförmig an vielleicht zehntausende von Nodes verteilen,
stellen eine große Herausforderung an Bandbreite und Performance der Anbieter
dar.
Die Idee war nun, alternativ zu den gängigen Protokollen der Datenverteilung,
wie zum Beispiel FTP und HTTP, Peer-To-Peer Protokolle aus dem FilesharingSegment zu verwenden. In diesen ist es üblich, dass die zu verteilenden Daten von
den Empfängern ebenfalls wieder weiter verteilt werden.
Eine Besonderheit, die alle etablierten Filesharing Protokolle gemeinsam haben,
ist der Umstand, dass Dateien, die ein Peer am Herunterladen ist, auch schon
vom selben Peer bezogen werden können, obwohl dieser seinen download noch
nicht beendet hat. Ermöglicht wird dies dadurch, dass eine zu verteilende Datei
in mehrere Chunks, zu Deutsch „Stücke“, aufgesplittet wird. Ein Peer lädt einen
Chunk, ermittelt mit Hilfe eines Hashwertes seine Authenzität und stellt bei Erfolg
diesen zum Download bereit.
Eine weitere Gemeinsamkeit ist, dass man eine Datei über mehrere Peers parallel
laden kann. Auch dieser Vorgang wird über die Chunks realisiert. So ermittelt ein
Peer eine Liste mit weiteren Peers, die ebenfalls dieselbe Datei am Laden sind,
beziehungsweise bereits vollständig geladen haben. Nun fordert er gleichzeitig von
den jeweiligen Peers, die die entsprechenden Chunks besitzen, die ihm fehlenden
Daten an.
Über diese Verfahren lässt sich, wenn man die Datenmenge in Ihrer Relation zur
Zeit betrachtet, ein exponentiell wachsendes Verteilen der Daten erreichen. Zudem kommt es zu einer Lastverteilung des benötigten Netzwerkverkehrs. Der letzte Punkt ist auch deswegen doppelt interessant, weil so der Verteiler eines Grid
Moduls einerseits den eigenen Netzwerkverkehr und andererseits die damit verbundenen Kosten minimal halten kann.
Der große Unterschied innerhalb der p2p Filesharing Tools ist das Vorgehen zum
4.2. Verteilte Hashtabellen
33
Auffinden der einzelnen Daten. Bei diesen Tools unterscheidet man drei Generationen [Boyvat, 2005], [Hämmerle, 2004].
Protokolle der ersten Generation besitzen einen zentralen Server, der alle im System vorhandenen Dateien und ihren Besitzer kennt. Bei Anfragen wird der zentrale
Server kontaktiert und dann die entsprechende Datei von den dort verzeichneten
Besitzern heruntergeladen. Probleme dieses Verfahrens sind zum einen die Skalierbarkeit, zum anderen die Aktualität der Daten und letztendlich der Single Point
of Failure [Reiser und Kapitza, 2003].
Protokolle der zweiten Generation verzichten auf den zentralen Indexierungsserver.
Ein Peer steht in Verbindung mit bis zu n weiteren Peers. Es wird eine TTL (TimeTo-Live) von m festgelegt. Eine Anfrage samt der TTL m eines Peers wird an die
n verbundenen Peers weitergeleitet. Diese wiederum geben die Anfrage und eine
TTL von m-1 an ihre restlichen n-1 Peers weiter. Ist die TTL bei 0 angekommen,
wird die Anfrage nicht mehr weitergeleitet. Die Treffer werden sodann an den
Anfragenden übergeben. Mit diesem Ansatz können aber, weil nicht alle Knoten
abgefragt, auch nicht alle passenden Daten gefunden werden. Zudem wird das
Netzwerk mit Suchanfragen überflutet und wegen der langen Wege kommt es zu
hohen Latenzzeiten.
Protokolle der dritten Generation beheben jedoch dieses Problem: Über dem bestehenden Netzwerk wird eine zweite virtuelle Netzstruktur in Form einer Verteilten
Hashtabelle aufgebaut. Diese Struktur ersetzt den zentralen Indexierungsserver
von Tools der ersten Generation. Somit ist es möglich, alle gesuchten Dateien im
Netz zu finden, ohne einen zentralen Indexierungsserver zu benötigen.
4.2 Verteilte Hashtabellen
Da die Verteilte Hashtabelle zu den fundamentalen Prinzipien moderner p2p Netzwerke gehört, wird im folgenden Teil der Arbeit ein kleiner Einblick in die Thematik
gegeben, welcher zum Verständnis des Unterkapitels 4.4 notwendig ist.
34
4.3. p2p Implementierungen
Die Verteilte Hashtabelle basiert auf dem Wertebereich einer Hashfunktion. Betritt ein Peer das Netzwerk, so wird die Hashfunktion auf ihn angewandt. Das
Ergebnis entspricht seiner Position im Netzwerk. Zudem bekommt ein Peer einen
Zuständigkeitsbereich zugwiesen, der zum Beispiel beim Chord Algorithmus von
seinem Hashwert bis zum Hashwert-1 seines Nachfolgers verläuft. Alle im Netzwerk angebotenen Daten werden ebenfalls auf die Hash Funktion angewandt. Das
Ergebnis entscheidet, welcher Peer für welches Datum zuständig ist. Beim Chord
Algorithmus wäre dies der Peer mit dem nächst kleineren Hashwert.
Die Speicherung der Inhalte kann auf zwei Arten geschehen: Entweder das Datum
wird direkt auf dem zuständigen Peer gespeichert, oder der Peer referenziert auf das
entsprechende Datum. Bei den üblichen Filesharing Tools wird die zweite Variante
verwendet. Fällt ein Peer aus, übernimmt zum Beispiel beim Chord-Algorithmus
dessen Vorgänger den Wertebereich mit. Die Vorgehensweise zum Auffinden der
Inhalte ist abhängig vom verwendeten Algorithmus. Dieser kann von der unpraktikablen Methode, die Anfrage an den nächsten Peer mit der geringsten Distanz
weiterzuleiten, bis hin zu Methoden mit einer Laufzeit von O(log n) reichen. Gängige Implementierungen sind CAN, Chord, Kademlia, Pastry und Tapestry. Eine
ausführliche Erläuterung zu verteilten Hashtabellen und eine Beschreibung des
Chord Algorithmus bietet [Harwood und Tanin, 2003].
4.3 p2p Implementierungen
Die gängigen Protokolle des p2p Filesharing werden im weiteren Verlauf kurz erläutert. Eine Vertiefung in die Thematik und Grundlagen der nun folgenden Beschreibungen findet man in [Ding u. a., 2003]. Abschließend folgt eine Beurteilung
der Protokolle hinsichtlich der benötigten Eigenschaften und letztendlich die Begründung der Auswahl des BitTorrent-Protokolls.
4.3. p2p Implementierungen
35
eDonkey2000 ist ein proprietäres Protokoll der Firma MetaMachine, welches
durch den gleichnamigen Client1 implementiert wird. Abgekürzt wird es mit ed2k.
Ursprünglich gehörte ed2k den Protokollen der ersten Generation an, wurde aber
später durch die Implementierung des Kademlia Algorithmus um Verteile Hashtabellen erweitert und gilt nun als Hybridclient. Das eMule Projekt2 schuf eine Open
Source Implementierung des ed2k Protokolls, die seit der Version 0.42 auch den
Kademlia Algorithmus unterstützt [MetaMachine, 2003], [Heckmann und Bock,
2002].
Gnutella gehört zu den Protokollen der zweiten Generation und ist eines der ersten völlig dezentralen Filesharing-Netze. Entwickelt hatte es die AOL-Tochterfirma
Gnullsoft. Kurz nach der Veröffentlichung im Jahre 2000 wurde die Entwicklung
jedoch eingestellt. Die Analyse des Protokolls3 brachte allerdings eine Vielzahl von
Klonen hervor, welche auch diverse Protokollerweiterung implementierten. Zu den
bekanntesten Implementierungen gehören heute die beiden Open Source Projekte
Limewire4 und Shareaza5 .
FastTrack stellt eine Erweiterung des Gnutella Protokolls dar, das von Kazaa6
erstmals implementiert wurde. Besagte Erweiterung besteht aus sogenannten Supernodes. Dabei werden Rechner zu Supernodes, welche über ausreichend Bandbreite und Rechenkraft verfügen. Diese sind Indexserver für eine Teilmenge anderer
FastTrack Clients. Die Clients geben dabei die Metadaten der von ihnen zur Verfügung gestellten Daten an den Server. Suchanfragen werden an den Supernode
geschickt, welcher wie bei Gnutella diese Anfragen an weitere Supernodes sendet.
1
http://www.edonkey2000.com/
http://www.emule-project.net/
3
http://rfc-gnutella.sourceforge.net/
4
http://www.limewire.com/
5
http://www.shareaza.com/
6
http://www.kazaa.com/
2
36
4.3. p2p Implementierungen
OpenFT steht für „Open FastTrack“ und ist eine Open Source Entwicklung7 ,
die sich an dem FastTrack Protokoll orientiert. Man unterscheidet hier die Nodes in die drei Typen User, Search und Index. Der User Node, der gewöhnliche
Teilnehmer im OpenFT Netzwerk, ist mit mehreren Search Nodes verbunden, welchen er die Metainformationen zu seinen freigegebenen Daten sendet und seine
Suchanfragen an diese stellt. Search Nodes sind Nodes, welche eine relativ große
Netzwerkbandbreite besitzen. Sie verwalten eine Menge von User Nodes und indizieren die Metainformationen zu den freigegebenen Daten derselben. Zudem leiten
sie Suchanfragen an weiter Search Nodes weiter, bzw. beantworten diese Anfragen. Index Nodes unterliegen den höchsten Anforderungen. Ein Kriterium dabei
ist, dass der Node seit relativ langer Zeit online ist. Diese Index Nodes verwalten
Listen von Search Nodes und werden von Search Nodes auf der Suche nach weiteren Search Nodes konsultiert. Wenn die Voraussetzungen stimmen, kann ein Node
gleichzeitig Search Node und Index Node sein.
BitTorrent Dieses Protokoll8 unterscheidet sich insofern von anderen Protokollen, als bei ihm ursprünglich keine Suche vorgesehen war. Es basiert auf Torrentdateien und Tracker Servern. Die Torrentdatein werden meist über Webseiten
verbreitet. Für jedes Datum existiert eine eigene Torrentdatei. Diese beinhaltet
unter anderem Informationen zu dem Namen, der Größe und den Hashwerten der
einzelnen Chunks eines Datums, sowie der URL des Trackers. Letzterer verwaltet
alle Peers, die diese Daten am Laden sind, beziehungsweise geladen haben. Peers,
die am Laden sind, werden leecher genannt, was auf Deutsch eigentlich „Sauger“
bedeutet. Dahingegen werden Peers, die das komplette Datum besitzen, seeder
genannt, auf Deutsch Säer. Neue Versionen von BitTorrent verwenden mit dem
Kademila Algorithmus auch Verteilte Hashtabellen, um so einen trackerlosen Betrieb zu ermöglichen [BitTorrent.org, 2006a]. Hierbei übernehmen die Peers für eine
ihnen zugewiesene Teilmenge der Hashwerte die Rolle der Tracker. Das originale
BitTorrent Programm wurde von Bram Cohen in Python geschrieben und ist Open
Source. Azureus9 , ebenfalls Open Source, gilt als der verbreitetste Bittorrentclient.
7
http://gift.sourceforge.net/
http://www.bittorrent.org/
9
http://azureus.sourceforge.net/
8
4.4. Auswertung und Beurteilung
37
4.4 Auswertung und Beurteilung
Ein Auswahlkriterium bestand für diese Arbeit darin, dass es sich um ein offenes
und gut dokumentiertes Protokoll handeln sollte. Da keine umfangreichen Suchfunktionalitäten benötigt wurden, ein Umstand, der ausführlich in Kapitel 5 erläutert wird, bot sich das BitTorrent Protokoll an. Als einziger Nachteil gilt nochmals
festzuhalten, dass alle Anfragen für ein bestimmtes Modul von beliebig vielen Peers
über einen Tracker laufen, ein Faktor, der sich in der Netzlast bemerkbar machen
könnte. Zudem ist ein Tracker ein Single Point of Failure.
Der Einsatz von verteilten Hashtabellen würde für das geplante Vorhaben keinen
Vorteil bringen, da für ein Modul auch weiterhin nur ein Peer verantwortlich wäre und dessen Netzbandbreite mit hoher Wahrscheinlichkeit im Bereich privater
Internetanschlüsse liegt. Dies könnte zur Folge haben, dass ein Peer mit relativ
geringer Bandbreite für ein Modul mit relativ hoher Nachfrage verantwortlich ist.
Die Verwendung eines Protokolls der zweiten Generation entfiel, da hier nur Teilmengen der bestehenden Netze durchsucht werden. Die Wahl fiel somit, sozusagen
zwangsläufig, auf das BitTorrent Protokoll.
4.5 Beschreibung des BitTorrent Protokolls
Dieses Unterkapitel lehnt sich an die Protokoll Spezifikation [BitTorrent.org, 2006a]
von BitTorrent.org an und ergänzt diese um Grafiken, sowie Erklärungen und
Beispiele zum besseren Verständnis.
Einführung
BitTorrent besteht aus drei Kernbestandteilen, die nun erläutert werden:
38
4.5. Beschreibung des BitTorrent Protokolls
Leecher
Seeder
Leecher
Leecher
Abbildung 4.1: BitTorrent Nutzdaten Kommunikation
Downloader ist die Endanwender-Software. Durch die Angabe der Metainformationen in Form einer Torrent Datei erhält der Downloader alle notwendigen
Informationen über den Download und kann diesen dann durchführen. Trotz des
Namens Downloader fungiert dieser eigentlich als Peer, was bedeutet, dass Daten
nicht nur zum Runterladen sondern auch zum Hochladen bereitgestellt werden.
Wie bereits im Abschnitt 4.3 beschrieben, differenziert man die Peers in Seeder
und Leecher. Abbildung 4.1 veranschaulicht die Kommunikation derselben untereinander.
Leecher
Seeder
Tracker
Leecher
Leecher
Abbildung 4.2: BitTorrent Tracker Kommunikation
4.5. Beschreibung des BitTorrent Protokolls
39
Tracker: Ein Tracker ist ein Server, der über das HTTP Protokoll [Fielding u. a.,
1999] mit den Downloadern kommuniziert. Alle Downloader melden sich beim
Tracker an und erhalten Informationen über andere Downloader, bei denen die
Daten bezogen werden können. Abbildung 4.2 veranschaulicht die Kommunikation
des Trackers.
Torrent Dateien beinhalten die Metainformationen zu den zum Download bereitgestellten Daten. Sie umfassen die URL des Trackers, die Namen der Daten,
die Größe der Daten, sowie die Hashwerte der einzelnen Chunks.
Nachstehend wird der klassische Weg zur Datenverteilung über BitTorrent beschrieben. Dabei werden folgende Bestandteile benötigt:
• einen normalen Webserver
• eine statische Datei mit Metainformationen
• einen BitTorrent Tracker
• einen Downloader, der die Original Daten vorhält
• einen Webbrowser für den Endanwender
• Einen Downloader für den Endanwender
Um nun Daten zum Download zur Verfügung zu stellen, sind folgende Schritte
notwendig:
1. Den Tracker starten
2. Die Dateierweiterung .torrent in als mimetype
application/x-bittorrent im Webserver eintragen
3. Den Webserver starten
40
4.5. Beschreibung des BitTorrent Protokolls
4. Die .torrent Datei mit den Metainformationen erstellen
5. Die Metainformationen auf den Webserver stellen
6. Einen Downloader starten, welcher schon alle Daten besitzt.
Um nun als Endnutzer den Download zu starten, muß folgendes getan werden:
1. BitTorrent Downloader installieren, wenn nicht schon geschehen.
2. Aus dem Web die .torrent Datei laden.
3. Mit der BitTorrent Software die .torrent Datei öffnen.
4. Einen Speicherort wählen.
5. Warten bis der Download beendet ist.
6. BitTorrent Downloader beenden.
Die Datenserialisierung
Die .torrent Dateien, sowie die Nachrichten des Trackers an die Peers, sind serialisierte Datenobjekte. Deren Ähnlichkeit dieser Objekte zu denen der Skriptsprache
Python lässt sich dadurch erklären, dass die original BitTorrent Software in Python geschrieben wurde. Besagte Serialisierung erfolgt nach einfachen Regeln, auf
welche im Folgend eingegangen wird. Man unterscheidet dabei vier Datentypen:
Strings für beliebig lange Zeichenketten werden kodiert, indem man die Länge
der betreffenden Zeichenkette zur Basis zehn, gefolgt von einem Doppelpunkt, an
dieselbe als Prefix anhängt. So entspricht 4:apfel dem String ’apfel’.
4.5. Beschreibung des BitTorrent Protokolls
41
Integer definiert die Darstellung ganzer Zahlen. Auch wenn der Name die Vermutung aufkommen lassen könnte, so ist die Größe der Zahl dennoch nicht beschränkt. Die Kodierung erfolgt dergestalt, dass am Anfang ein ’i’ steht, gefolgt
von der Zahl zur Basis zehn und mit einem ’e’ abgeschlossen wird. Als Beispiel:
i42e entspricht der 42, und i-42e entspricht der -42. Alle Zahlen mit führender
Null, außer der Null selbst, also i0e, sind ungültig.
Lists sind Listen, welche für eine Sequenz beliebig vieler Elemente, auch solcher
unterschiedlicher Typen, genutzt werden. Man kodiert diese über ein ’l’ am Anfang, gefolgt von den Nutzdaten. Abgeschlossen wird mit einem ’e’. So entspricht
l5:wurst4:brote der Liste [wurst, brot].
Dictionaries werden durch ein ’d’ am Anfang, gefolgt von den Nutzdaten und
einem abschließenden ’e’ kodiert. Die Nutzdaten hängt man auch hier einfach
aneinander, wobei immer zuerst der Schlüssel angegeben wird, gefolgt vom Wert.
Im Beispiel sieht das dann wie folgt aus:
d5:wurst4:brot5:getreidel5hafer6roggenee entspricht
{’wurst ’: ’brot ’, ’getreide’ : [’hafer’ ,’roggen ’] }.
Das Torrent Dateiformat
d8 : announce30 : h t t p : / / l o c a l h o s t : 6 9 6 9 / announce13 : c r e a t i o n
datei1158566350e4 : infod5 : f i l e s l d 6 : lengthi302080e4 : pathl7 : rar
. e x e e e d 6 : l e n g t h i 1 0 5 e 4 : p a t h l 3 : xml9 : modul . xmleee4 : name3 : j o b 1 2 :
p i e c e l e n g t h i 2 6 2 1 4 4 e 6 : p i e c e s 4 0 : ’ \ x99XS5\ xab \ x9b \ x f 9 \ x1a \ xa5 \
xd9 \ x e b f v \ xa0e \xdb\ x9e&\xd5 \ x17&\xd6 \x16O\ x93−\x06b \ x0c \ x055
\ x18 \ x83 \ xeb \ x f 1 5 n \ x f 9 \ xbaee
Abbildung 4.3: Beispiel einer .torrent Datei
Eine .torrent Datei enthält ein Dictionary, welches die beiden Schlüssel announce
und info beinhalten muss.
42
4.5. Beschreibung des BitTorrent Protokolls
announce enthält einen String, der die URL des Trackers ist.
info umfasst ein weiteres Dictionary, indem die eigentlichen Metainformationen
der Daten abgelegt sind. Es beinhaltet die Schlüssel: name, piece length, pieces
und files.
name ist ein String, welcher als Name der zu speichernden Datei oder des zu
speichernden Verzeichnisses gewählt wird.
piece length beinhaltet eine Zahl, die der Größe der einzelnen Chunks, also der
Größe der Dateisegmente entspricht. Sie ist immer ein Potenz von der Basis zwei.
Standardmäßig wird hier die Zahl 218 verwendet, welches 265 KB entspricht. In
neueren Versionen findet man auch die Zahl 220 , also 1 MB, als Standardeinstellung.
pieces enthält ein String, dessen Länge ein Vielfaches von 20 beträgt. Dieser
ist wiederum in einzelne Strings der Länge 20 zu unterteilen. Die so erhaltenen
Teilstrings entsprechen den SHA1 Hashcodes [Eastlake und Jones, 2001] der einzelnen Chunks mit gleichem Index und ermöglichen dadurch eine Verifizierung der
geladenen Daten.
length kommt als Schlüssel nur vor, wenn der Torrent lediglich auf eine einzelne
Datei verweist. Der Wert entspricht dabei der Größe der Datei in Byte.
files kommt zum Einsatz, wenn mehrere Dateien vorhanden sind. Er beinhaltet
dann eine Liste, die mit je einem Dictionary pro Datei, wobei jedes Dictionary die
folgenden Schlüssel length und path enthält:
length ist wie auch zuvor, die Länge der Datei in Byte.
4.5. Beschreibung des BitTorrent Protokolls
43
path ist eine Liste mit Strings, welche die Unterverzeichnisse wiedergeben, in der
die Datei liegt. Der letzte Eintrag der Liste entspricht dann dem Dateinamen.
1
{
’ c r e a t i o n ␣ date ’ : 1158566350 ,
’ announce ’ : ’ h t t p : / / l o c a l h o s t : 6 9 6 9 / announce ’ ,
’ info ’ : {
’ files ’: [
{ ’ path ’ : [ ’ r a r . exe ’ ] , ’ l e n g t h ’ : 3 0 2 0 8 0 } ,
{ ’ path ’ : [ ’ xml ’ , ’ modul . xml ’ ] , ’ l e n g t h ’ : 1 0 5 } ] ,
’ p i e c e ␣ length ’ : 262144 ,
’ name ’ : ’ j o b ’ ,
’ p i e c e s ’ : " ’ \ x99XS5\ xab \ x9b \ x f 9 \ x1a \ xa5 \ xd9 \ x e b f v \ xa0e \xdb\ x9e
&\xd5 \ x17&\xd6 \x16O\ x93−\x06b \ x0c \ x055 \ x18 \ x83 \ xeb \ x f 1 5 n \
x f 9 \ xba "
}
2
3
4
5
6
7
8
9
10
11
12
}
Abbildung 4.4: Dekodierung vom Listening in Abbildung 4.3
Abbildung 4.3 zeigt das Beispiel einer .torrent Datei und korrespondierend hierzu
ist in Abbildung 4.4 die dekodierte Datenstruktur in Python zu sehen. Dabei fällt
auf, dass dort ein zusätzlicher Schlüssel mit dem Namen creation date auftaucht,
welcher optional ist, der allerdings in [BitTorrent.org, 2006a] nicht dokumentiert
wurde. Die Länge des Strings von pieces beträgt 40. Dies bedeutet, dass die zu
übertragenden Daten in zwei Chunks unterteilt werden.
Abbildung 4.5 zeigt die Ausgabe der Metainformationen, wie sie auf der Konsole erscheinen, wenn man sie über das hierfür vorgesehene BitTorrent Programm
btshowmetainfo.py abruft.
Die Tracker Kommunikation
Die Peers kommunizieren mit den Trackern über das HTTP Protokoll, wobei die
zu übertragenden Informationen mit einer GET Anfrage verschickt werden. Abbildung 4.6 zeigt eine solche Anfrage.
44
1
4.5. Beschreibung des BitTorrent Protokolls
btshowmetainfo 20021207 − decode B i t T o r r e n t m e t a i n f o f i l e s
2
3
4
5
6
7
8
9
10
m e t a i n f o f i l e . : modul . xml . t o r r e n t
i n f o hash . . . . . : 6 e 8 5 4 6 b 3 3 a 7 5 f b 4 f 9 5 9 9 f e f 7 d 8 3 9 f e 9 8 0 4 2 f b a 2 7
d i r e c t o r y name: j o b
files . . . . . . . . . :
r a r . exe ( 3 0 2 0 8 0 )
xml/modul . xml ( 1 0 5 )
a r c h i v e s i z e . . : 302185 ( 1 ∗ 262144 + 4 0 0 4 1 )
announce u r l . . : h t t p : // l o c a l h o s t : 6 9 6 9 / announce
Abbildung 4.5: Konsolenausgabe der Metainformationen vom Listening in Abbildung 4.3
GET / announce ? info_hash=8z%B9%E4%3E%A0%12%29%BB7%CB%2B%99%84VWM%
F1%C3%5E&peer_id=M4−4−1−−e9987a353295&p o r t =6881&key=7 e f b f 5 3 4
&uploaded=0&downloaded=0& l e f t =21129&compact=1&e v e n t=s t a r t e d
HTTP/ 1 . 1 \ r \ nHost : 1 9 2 . 1 6 8 . 0 . 2 : 6 9 6 9 \ r \ nConnection : c l o s e . .
Accept−e n c o d i n g : g z i p \ r \ nUser−a g e n t : B i t T o r r e n t / 4 . 4 . 1 \ r \n\ r \
n
Abbildung 4.6: Beispiel eines GET Requests
Für derartige Anfragen gibt es die folgende Parameter: info_hash, peer_id, ip,
port, uploaded, downloaded, left, event, failure_reason, interval, complete,
incomplete und peers.
info_hash ist der 20 Byte lange SHA1 Hashcode vom serialisierten Wert info
Feldes in der .torrent Datei.
peer_id meint eine 20 Byte lange Zeichenfolge zur Identifizierung des Peers.
Jeder Peer generiert für einen Download sich selbst eine neue zufällige Zeichenfolge.
4.5. Beschreibung des BitTorrent Protokolls
45
ip stellt ein optionales Feld dar, welches die IP Adresse oder den DNS Namen
enthält, unter welchem der Peer zu finden ist. Dieses Feld wird hauptsächlich dann
verwendet, wenn das Ziel auf der selben Maschine wie der Tracker läuft.
port gibt die Portnummer an, auf die der Peer hört. Das Standardverhalten
eines Peers ist es, auf Port 6881 zu hören. Schlägt dies fehl, werden inkrementell
die Ports bis 6889 ausprobiert. Gelingt dies jedoch nicht, so bricht der Peer ab.
uploaded ist die absolute Menge hochgeladener Bytes, kodiert in ascii und zur
Basis zehn.
downloaded meint die absolute Menge heruntergeladener Bytes, kodiert in ascii
und zur Basis zehn.
left zeigt die Menge der noch zu herunterzuladenden Bytes an, kodiert in ascii
und zur Basis zehn. Dieser Wert kann nicht durch das Feld downloaded und der
Dateigröße ermittelt werden, da auch downloads durch fehlgeschlagene Integritätsprüfungen möglicherweise wiederholt wurden.
event ist ein optionaler Schlüssel, welcher die Werte started, completed, stopped oder empty besitzen kann, wobei das empty gleichbedeutend mit dem Weglassen dieses Parameters ist. Der Peer setzt started, wenn er mit dem Download
beginnt. completed bedeutet, dass der Download fertig ist. Dies wird aber nicht
geschickt, wenn der Download schon zu Beginn fertig war. Beendet der Peer den
Datenverkehr, wird der Wert auf stopped gesetzt. Die Antwort des Trackers ist
ein serialisiertes Dictionary, welches folgende Schlüssel hat:
failure_reason ist ein optionaler Schlüssel. Wird er gesetzt, so muss ein Fehler
aufgetreten sein, alle anderen Schlüssel werden nicht benötigt. Der Wert ist dann
46
4.5. Beschreibung des BitTorrent Protokolls
ein String mit einer Fehlerbeschreibung.
interval gibt die Anzahl der Sekunden an, die ein Peer warten sollte, bis er eine
erneute Anfragen stellen kann.
complete ist ein optionales Feld, dass angibt, wieviele Peers das Datum vollständig haben.
incomplete ist ein optionales Feld, welches anzeigt, wie viele Peers das Datum
nicht vollständig haben.
peers: Hier wird ein String hinterlegt, dessen Länge ein Vielfaches von sechs ist.
Je sechs Zeichen stehen für die Adresse eines Peers, wobei die ersten vier die IP
Adresse - und die rechtlichen Zwei die Portnummer beschreiben.
1
2
3
4
5
6
{
’ p e e r s ’ : ’ \ xc0 \ xa8 \ x00 \ x02 \ x1a \ xe1 \ xc0 \ xa8 \ x00 \ x03 \ x1a \ xe1 \ xc0 \
xa8 \ x00 \ x04 \ x1a \ xe1 ’ ,
’ i n t e r v a l ’ : 1800 ,
’ complete ’ : 3 ,
’ incomplete ’ : 1
}
Abbildung 4.7: Beispiel einer Tracker-Antwort
Abbildung 4.7 zeigt eine solche in Python decodierte Antwort eines Trackers.
Nimmt man nun die ersten vier Zeichen des peers String und konvertiert diese
in das Dezimalsystem, so erhält man die Folge 192,168,0,2. Die Zeichen an Stelle
fünf und sechs entsprechen 26 und 225. Diese wiederum entsprechen zusammen
(26 ∗ 256) + 225 = 6881, was dem Standartport für BitTorrent-Peers entspricht.
Die Adresse des Peers ist also 192.168.0.2 : 6881.
4.5. Beschreibung des BitTorrent Protokolls
47
Die Peer Kommunikation
Die Peers kommunizieren untereinander über das BitTorrent Peer Protokoll, das
ein bidirektionales TCP Protokoll ist, bei dem die Peers sich auf die Chunks der
.torrent Datei beziehen, wobei der Index Null dem ersten Chunk entspricht.
Beendet ein Peer den Download eines Chunks und prüft erfolgreich mittels des
SHA1 Hashwertes die Integrität desselben, so teilt er dann dessen Besitzt an alle
weiteren Peers mit.
Das Übertragungsprotokoll besteht aus einem Handshake und einem folgenden,
nicht endenden Übertragungsstrom von einzelnen Nachrichten, wobei jede Nachricht ihre eigene Länge als Prefix trägt.
Besagter Handshake beginnt mit der Zahl 19, gefolgt von dem 19 Zeichen langen
String ’BitTorrent protokol’. Danach folgen weiter acht reservierte Bytes, welche
zur Erkennung von Erweiterungen dienen. Als nächstes kommen 20 Byte für den
SHA1 Wert des info Wertes aus der .torrent Datei. Dies ist derselbe Wert wie
der info_hash bei der Tracker-Kommunikation. Nun folgen noch 20 Bytes mit der
peer_id. Der Gegenpart schickt ebenfalls seinen Handshake. Stimmen jetzt der
info_hash überein und unterscheidet sich die peer_id, kommt eine Verbindung
zustande.
Die Nachrichten zeichnen sich dadurch aus, dass nach der Längenangabe ein Byte
mit der Definition ihres Nachrichtentyps folgt. Ist dabei die Länge der Nachricht
Null, so entspricht dies einer Keep-Alive Nachricht, welche im Regelfall alle zwei
Minuten versendet wird. Trifft in einem definierten Zeitraum keine Nachricht des
Gegenparts ein, wird die Verbindung geschlossen. Für Nachrichten sind folgende
Bytes mit ihrer Bezeichnung definiert: 0 choke, 1 unchoke, 2 interested, 3 not
interested, 4 have, 5 bitfield, 6 request, 7 piece und 8 cancel. Werden mit
den Nachrichten Nummern übertragen, so sind diese mit vier Byte Länge definiert.
choke, unchoke, interested and not interested: Diesen Nachrichten folgen keine weiteren Informationen.
48
4.5. Beschreibung des BitTorrent Protokolls
bitfield wird nur einmal, und zwar gleich nach dem Handshake übertragen.
Die Nutzbytes repräsentieren dabei jeweils acht Indizes der in der .torrent Datei
definierten Teilstücke. Dies bedeutet, dass das erste Byte die Chunks 0-7 repräsentiert, das Zweite 8-15 und so weiter. Gelesen wird das Ganze von links nach
rechts, wobei das höchste Bit den niedrigsten Index wiedergibt und das niedrigste
Bit den höchsten. Ist ein Bit gesetzt, so besitzt der Peer dieses Stück und gibt es
zum Download frei. Hat ein Peer noch keinen Chunk, so muss das Bitfield nicht
übertragen werden.
have schickt ein Peer an alle mit ihm verbundenen Peers, sobald er einen Chunk
fertig geladen und dessen Integrität geprüft hat. Der Wert des Feldes beinhaltet
dessen Index.
request überträgt die drei Nummern index, beginn und length. Auf diese Weise fordern Peers gegenseitig die Nutzdaten an. Die erste Nummer legt fest, welcher
Chunk gemeint ist. Die zweite ist der Offset und klärt damit, an welcher Position
des Chunks zu beginnen ist. Die dritte Zahl sagt, wieviele Bytes übertragen werden
sollen, wobei die Länge allerdings eine Potenz der Basis zwei und auf maximal 217
beschränkt sein muss. Der Standartwert liegt bei 215 .
cancel hat den selben Inhalt wie request. Es wird gegen Ende des Gesamtdownloads verwendet, wenn der Peer im Endgame Mode ist. Dazu später mehr.
piece ist die Antwort auf einen Request. Es beinhaltet zuerst die Indexnummer,
dann den Offset, gefolgt von den Nutzdaten des Downloads.
Die Reihenfolge der Teilstücke, die Peers laden, ist zufällig, um so eine möglichst
große Fächerung des gesamten Inhaltes über das Netzwerk zu bewerkstelligen.
Choking ist ein Verfahren von BitTorrent, um die maximale Leistung aus TCP
herauszuholen. Werden über viele TCP Verbindungen gleichzeitig Daten übertra-
4.5. Beschreibung des BitTorrent Protokolls
49
gen, so bricht die Übertragungsgeschwindigkeit ein. Aus diesem Grund hält ein
Peer immer nur eine gewisse Anzahl von Kanälen offen (unchoked) und der Rest
wird abgewürgt (choked). Ein Datenverkehr zwischen zwei Peers kann nur zustande kommen, wenn ein Peer interessiert ist, und der andere diesen nicht choked. Die
Ausgangssituation einer Verbindung ist not interested und choked.
Gegen Ende des Gesamtdownloads fallen die Peers dann in den Endgame Mode.
Dieser soll dafür sorgen, dass der Download nicht durch eine langsame Verbindung
unnötig in die Länge gezogen wird. Hierzu fordert der Peer von mehreren Peers
gleichzeitig die letzten Teile an. Ist ein Teilstück vollständig übertragen, so bekommen die anderen Peers ein cancel geschickt, um die Übertragung zu beenden.
Abbildung 4.8 veranschaulicht anhand eines mitgesnifften und aufgearbeiteten Beispiels die eben beschriebene Kommunikation zweier Peers.
50
4.5. Beschreibung des BitTorrent Protokolls
Peer 1 : P r o t o c o l Name Length : 19
P r o t o c o l Name : B i t T o r r e n t p r o t o c o l
Reserved E x t e n s i o n Bytes : 0000000000000000
SHA1 Hash o f i n f o d i c t i o n a r y : 387AB9 . . .
Peer ID : 4D342D342D31 . . .
Peer 2 : P r o t o c o l Name Length : 19
P r o t o c o l Name : B i t T o r r e n t p r o t o c o l
Reserved E x t e n s i o n Bytes : 0000000000000000
SHA1 Hash o f i n f o d i c t i o n a r y : 387AB9 . . .
Peer ID : 4D342D322 . . .
Peer 2 : Message Length : 2
Message Type : B i t f i e l d ( 5 )
B i t f i e l d data : 80
Peer 1 :
Message Length : 1
Message Type : I n t e r e s t e d ( 2 )
Peer 2 : Message Length : 1
Message Type : Unchoke ( 1 )
Peer 1 : Message Length : 13
Message Type : Request ( 6 )
P i e c e i n d e x : 0 x00000000
Begin o f f s e t o f p i e c e : 0 x00000000
P i e c e Length : 0 x00004000
Peer 2 : Message Length : 16393
Message Type : P i e c e ( 7 )
P i e c e i n d e x : 0 x00000000
Begin o f f s e t o f p i e c e : 0 x00000000
Data i n a p i e c e : FFD8FFE . . .
Peer 2 : Message Length : 4754
Message Type : P i e c e ( 7 )
P i e c e i n d e x : 0 x00000000
Begin o f f s e t o f p i e c e : 0 x00400000
Data i n a p i e c e : DC894AC . . .
Peer 2 : Message Length : 1
Message Type : Choke ( 0 )
Abbildung 4.8: Beispiel einer Peer Kommunikation
51
5 Konzeption
Das folgende Kapitel präsentiert die Ergebnisse der Planungsphase. Anhand einer
Rollenverteilung wurden Aufgabengebiete definiert und ihren Akteuren zugeordnet. Darauf aufbauend wird die Notwendigkeit einer komplexen Verwaltung der
Gridteilnehmer begründet und ihre Funktionsweise erklärt. Danach erfolgt der
Plan, wie die Datenverteilung unter den Beteiligten zu organisieren ist und zum
Schluss wird beschrieben, wie die wichtigsten Arbeitsabläufe der Akteure zu verlaufen haben.
5.1 Rollenverteilung
Für eine klare Abgrenzung der Aufgabenbereiche und der Eingriffsmöglichkeiten
definiert das System drei Rollenmodelle: den GridManager, den JobServer und den
ExecutionNode. Abbildung 5.1 zeigt die Verteilung der Aufgabenberiche in einem
Use-Case Diagramm.
Der GridManager stellt die zentrale Verwaltung des gesamten Grids dar. Je
System existiert nur eine Instanz dieses Akteurs. Seine Aufgaben bestehen in der
Verwaltung und Verteilung von Aufgaben und ExecutionNodes. JobServer melden
sich beim GridManger an und übertragen ihre Anforderungen an diesen. Auch
ExecutionNodes melden sich hier an und warten auf kommende Instruktionen.
Kann der GridManager die Anforderungen der JobServer erfüllen, weist er diesen
eine festgelegte Anzahl an ExecutionNodes zu.
52
5.2. Nodeverwaltung
Der JobServer repräsentiert eine Gesamtaufgabe. Wie zuvor erwähnt, meldet
sich dieser beim GridManager an und teilt diesem mit, unter welchen Bedingungen
die Aufgabe erfüllt werden soll. ExecutionNodes verbinden sich mit dem JobServer
und fordern Teilaufgaben an. Nach Verifizierung durch den GridManager wird die
Teilaufgabe an den ExecutionNode übertragen. Equivalent hierzu verhält sich das
Übertragen der Resultate an den JobServer.
Der ExecutionNode erledigt die Abarbeitung der ins Grid gestellten Aufgaben. Er kommuniziert mit dem GridManager und bekommt von diesem Aufgaben
zugewiesen. Die Aufgaben holt sich der ExecutionNode beim JobServer ab, bearbeitet diese und überträgt das Resultat an selbigen zurück.
5.2 Nodeverwaltung
Wie zuvor beschrieben, tauscht der GridManager mit den ExecutionNodes Nachrichten aus. Hierzu müssen für jeden dieser Nodes Daten, wie Netzwerkadressen,
Kategorisierungen sowie weitere Variablen zwischengespeichert und schnell abgerufen werden können. Aus diesem Grund wurde für das Kommunikationsmanagement der Nodes eine sortierte und dynamisch verlinkte Liste entworfen, die in
ihrem Funktionsumfang die Verwaltung der ExecutionNodes unterstützt. So wird
der GridManager dazu befähigt, mit einer großen Anzahl von häufig wechselnden
Kommunikationspartnern über verbindungslose Protokolle Daten auszutauschen
und zuzuordnen. Das Motiv dieser Verwaltung liegt in der Zielgruppe der potentiellen ExecutionNode-Anwender. Diese sind Privatanwender mit ihren eigenen PCs,
die den Node als Plugin eines Instant-Messengers laufen lassen. Deshalb ist es nicht
vorhersehbar, wann und wie lange ein ExecutionNode angemeldet bleibt, bzw. wie
lange die Rechenleistung des Computers durch ihn in Anspruch genommen werden
darf.
Abbildung 5.2 illustriert den Aufbau der erwähnten Liste, deren Herzstück der
Hook ist. Er hält eine Verbindung zum kleinsten Element der Liste. Solche Listen-
5.2. Nodeverwaltung
Abbildung 5.1: Use Case Diagramm: Rollenverteilung
53
54
5.2. Nodeverwaltung
elemente werden Links genannt. Die einzelnen Links sind in einer doppelt verlinkten Liste miteinander verbunden, wobei der größte Link wieder auf den kleinsten
referenziert. Es bildet sich also ein Kreis. Jeder Link zeigt auf einen Node. Diese
Nodes stehen nun repräsentativ für die einzelnen ExecutionNodes und dienen dem
GridManager als Ablage für zuzuordnende Daten. Neben der Verbindung zum
kleinsten Element besitzt der Hook des Weiteren einen Iterator, welcher endlos
im besagten Kreis die Links sequentiell ansteuert und anstehende Ereignisse ihrer
Nodes bearbeitet. Zu den weiteren Funktionalitäten eines Hooks gehören die Fähigkeiten des Auffindens, des Einfügens und des Entfernens von Listenelementen.
Durch den Mehraufwand der Sortierung können so vor allem bei großen Listen mit
Hilfe der binären Suche sehr schnelle Zugriffszeiten mit einer Laufzeit von O(log n)
bewirkt werden.
Abbildung 5.2: Interne Verknüpfung der Nodes im Beispiel
Ein Node ist nun aber nie nur Bestandteil einer einzelnen solchen Listenstruktur, sondern immer von zweien. Zum einen existiert eine Hauptliste, im folgenden
5.3. Datenverteilung
55
MainHook genannt, und mindestens noch eine Teilliste, die SubHook genannt wird.
Diese SubHooks sind in ihrer Anzahl nach oben nicht weiter limitiert. Die MainHook Liste hält Referenzen auf alle im Grid registrierten Nodes. Die SubHooks
stehen für die einzelnen JobServer, welche das Grid mit Arbeit beauftragen. So
entspricht die Zuordnung eines Nodes in eine SubHook Liste der Zuordnung eines
ExecutionNodes zu einem JobServer. Zudem existiert noch eine weitere SubHook
Liste mit dem Namen IdleHook, die alle unbeschäftigten Nodes beinhaltet. Der
MainHook Liste unterliegt zudem die Verwaltung aller SubHooks.
5.3 Datenverteilung
Die Verteilung der Nutzdaten erfolgt, wie schon erwähnt, über das BitTorrentProtokoll. Hierzu müssen von allen Nutzdaten, die versendet werden sollen, die
Metainformationen als .torrent Dateien erstellt werden. Wer eine solche Metadatei besitzt, hat das Recht, von den verteilenden Rechnern die Nutzdaten zu
laden. Deswegen benötigt man ein Verfahren, welches regelementiert, wie und unter welche Bedingungen die Metadaten verteilt werden. Zu diesem Zweck unterteilt
das System die Kommunikation in drei Kanäle: den Steuerungskanal, den Metadatenkanal und den Nutzdatenkanal.
Ein JobServer registiert sich über den Steuerungskanal beim GridManager und
übergibt diesem die Ausführungsbedingungen seines Auftrags. Der GridManger
weist nun, sobald er diese Bedingungen erfüllt, dem JobServer eine Menge an ExecutionNodes zu. Die Kenntnis, welcher Node zu welchem Job gehört, bleibt beim
GridManager. Dieser teilt nun den zugewiesenen ExecutionNodes über Steuerdaten mit, von welchem JobServer sie sich wann ihre Metadaten abholen können.
Daraufhin verbinden sich die ExecutionNodes über den Metadatenkanal mit dem
JobServer, der sich über den Steuerungskanal die Nodes vom GridManager bestätigen lässt. Danach erfolgt die Übertragung der Metadaten an die ExecutionNodes.
Nach Erhalt der Metadaten beginnt der Download der benötigten Datenmengen
über den Nutzdatenkanal, sprich über das BitTorrent-Protokoll. Veranschaulicht
wird dieser Vorgang in Abbildung 5.3.
56
5.3. Datenverteilung
Abbildung 5.3: Dienste und Kommunikation
Die Strukturierung der Nutzdaten unterliegt nur wenigen Reglementierungen. Zusammen mit den Teilaufgaben müssen die ausführbaren Programme in einem gemeinsamen Hauptverzeichnis liegen.Dabei ist die Struktur innerhalb dieses Ordners bis auf das Verzeichnis ./metadata nicht vorgeschrieben. Besagter Ordner
mit seiner manifest.xml Datei stellt die Schnittstelle zwischen den Nutzdaten
und dem Grid dar. Einen beispielhaften Aufbau einer solchen Struktur zeigt Teil
A der Abbildung 5.4.
Die manifest.xml Datei, deren Aufbaubeschreibung später erfolgt, definiert, welche Dateien zusammen mit welchen Parametern zum Bearbeiten der einzelnen
Teilaufgaben benötigt werden. Hieraus separiert der JobServer neue XML Dateien, welche jeweils eine Teilaufgabe beschreiben, und generiert aus diesen Dateien
zusammen mit den in ihnen festgelegten Nutzdaten die Metadateien. Diese XMLund Metadaten werden ebenfalls im ./metadata Ordner gespeichert. Zur Veranschaulichung dient hier Teil B der Abbildung 5.4.
5.4. Arbeitsablauf
57
Abbildung 5.4: Struktur persistenter Daten
5.4 Arbeitsablauf
Die Rolle des GridManagers ist zweigeteilt. Zum einen in den Part des NodeManagers, welcher sich um die Betreuung der ExecutionNodes kümmert und zum
anderen in den Part des JobScheduler mit der Verwaltung von Aufgaben und der
Betreuung der JobServer. Dabei erfolgt die Zusammenarbeit von NodeManager
und JobScheduler über die gemeinsame Verwendung einer MainHook.
Der NodeManager nimmt Nachrichten von den ExecutionNodes entgegen. Trifft
eine Nachricht ein, so startet er in der MainHook die Suche nach einem zutreffenden Nodeeintrag. Ist kein Node auffindbar, wird ein neuer Node erstellt und in die
58
5.4. Arbeitsablauf
Nachricht
empfangen
Suche Node
in MainHook
gefunden
nicht
gefunden
erzeuge
Node
Nachricht gültig?
ja
nein
bearbeite
Nachricht
stell Antwort in
Nachrichtenqueue
des Nodes
Abbildung 5.5: Zustandsdiagramm: NodeManager Nachrichtenempfang
MainHook eingepflegt. Als nächstes ist die eintreffende Nachricht auf ihre Gültigkeit zu überprüfen und bei Erfolg zu bearbeiten. Erhält der ExecutionNode eine
Antwort, dann wird diese nicht gleich versandt, sondern in eine Warteschlange im
Node eingefügt. Erst die Hauptschleife überträgt die Daten an die ExecutionNodes.
Abbildung 5.5 illustriert das Eintreffen einer Nachricht.
Abbildung 5.6 zeigt das Zustandsdiagramm der Hauptschleife. Sie iteriert endlos
über alle Nodes und bearbeitet diese in zwei Arbeitsgängen. Der erste Schritt
liegt in der Diagnose von Timeouts. Ein Node beinhaltet Zeitstempel mit der
Ankunft der letzten Nachricht seines ExecutionNodes und mit der Verweildauer in
verschiedenen Status. Liegt das letzte Lebenszeichen zu lange zurück oder ist der
Status festgefroren, wird der Node aus der Liste entfernt.
5.4. Arbeitsablauf
59
Im zweiten Schritt wird geprüft, ob in der Node-Instanz Nachrichten hinterlegt
wurden. Ist das der Fall, so werden sie an den ExecutionNode übertragen. Der
GridManager sendet für diesen ExecutionNode bestimmte Nachrichten nicht direkt, sondern stellt dieselben in eine Warteschlange des entsprechenden Nodes,
die dann von der Hauptschleife abgefragt wird. Hierdurch werden die Nachrichten
zuerst gesammelt und darauf in einem Arbeitsschritt an den Empfänger versandt.
Deshalb kann eine möglichst homogene Netzauslastung generiert werden. Dies ist
möglich, da keine Anforderung besteht die Nachrichten schnellstmöglich an die
ExecutionNodes zu übermitteln.
Abbildung 5.6: Zustandsdiagramm: NodeManager Hauptschleife
60
5.4. Arbeitsablauf
Iterator zeigt auf
nächstfolgenden Job
ja
Iterator aufrufen
definierten Intervall
warten
nein
Schleife
fortsetzen?
Job startbereit?
ja
nein
nein
Job in Ausführung?
ja
Job beenden?
ja
SubHook
erzeugt
SubHook
regulieren
SubHook
beenden
nein
Abbildung 5.7: Zustandsdiagramm: JobScheduler Hauptschleife
Die Bestimmung des JobSchedulers liegt im Verwalten der Aufgaben der JobServer
und in der Kommunikation mit diesen. Dabei iteriert nun der JobScheduler in
der Hauptschleife permanent über alle Aufgaben und managed sie. Abbildung
5.7 veranschaulicht diesen Vorgang. Wird eine Aufgabe noch nicht ausgeführt,
ist zunächst zu überprüfen, ob die Bedingungen einen Start erlauben. Trifft das
zu, so wird hierfür ein SubHook generiert. Dieser SubHook bekommt dann durch
die MainHook einen Teil der Nodes aus der IdleHook-Liste zugewiesen. Ist eine
Aufgabe bereits in Ausführung, so wird versucht, die Anzahl der beteiligten Nodes
zu regulieren. Das bedeutet, wenn zum Beispiel durch Timeouts zugewiesene Nodes
wegfallen, werden der Aufgabe neue zugeteilt. Soll eine Aufgabe beendet werden,
ist die entsprechende SubHook-Liste zu löschen und die Nodes sind der IdleHook
zuzuführen. Diese Vorgänge wiederholen sich in zeitlich definierten Abständen, bis
der GridManager beendet wird.
5.4. Arbeitsablauf
61
Abbildung 5.8: Zustandsdiagramm: JobServer Initialisierung
Ein JobServer verwaltet die Bearbeitung eines JobPackage, welches die Daten und
Informationen zum Ausführen einer Aufgabe enthält. Beim Start eines JobServers baut dieser zuerst eine Verbindung zum JobScheduler auf und registriert sich
dort. Danach analysiert er das Aufgabenpaket und bereitet die Teilaufgaben in
sogenannten Tasks zur Verarbeitung auf. Daraufhin überträgt er die Ausführungsbedingungen, welche Policy genannt werden, an den JobScheduler. Im Anschluss
daran tritt der JobServer in drei verschiedene Zustände. Erstens überträgt er die
62
5.4. Arbeitsablauf
Tasks in Form von Metadaten auf die ExecutionNodes und sammelt die Ergebnisse
ebenfalls als Metadaten wieder ein. Zweitens verteilt und sammelt er alle Nutzdaten, auf die die Metadaten referenzieren. In seinem dritten und letzten Zustand
wartet er auf das Eintreffen eines Ergebnisses und verarbeitet dieses. Abbildung
5.8 veranschaulicht diese Vorgänge.
Abbildung 5.9: Zustandsdiagramm: JobServer Metadatenaustausch
Auf den Metadatenaustausch wird im Folgenden näher eingegangen, Abbildung
5.9 unterstützt hierbei die Beschreibung. Der JobServer wartet auf eingehende
Verbindungen der ExecutionNodes. Kommt eine solche Verbindung zustande, wird
an den JobScheduler eine Autorisierungsanfrage für den betreffenden Node gestellt.
Erfolgt eine positive Antwort, so teilt der ExecutionNode mit, ob er Metadaten
für einen neuen Task erhalten oder die Metadaten eines Ergebnisses senden will.
Nach erfolgter Übertragung wird die Verbindung beendet.
5.4. Arbeitsablauf
63
Die ExecutionNodes bekommen, wie oben bereits erwähnt, nachdem sie einem
JobServer zugeordnet wurden, Metadaten für einzelne Tasks übertragen. Nach Erhalt dieser Metadaten beginnt der Download der darauf bezogenen Nutzdaten.
Ein ExecutionNode wartet fortwährend auf das Eintreffen von Nutzdaten. Ist der
Download eines Datenpaketes beendet, wird es analysiert und die Ausführung der
enthaltenen Anweisungen vorbereitet. Danach werden diese sequentiell ausgeführt.
Sodann ist aus den erstellten Resultaten eine Metadatei zu erstellen und an den
JobServer zu übertragen. In Abbildung 5.10 ist dieser Vorgang graphisch dargestellt.
Abbildung 5.10: Zustandsdiagramm: ExecutionNode Taskbearbeitung
64
6 Implementierung des
Grid-Systems
Die Programmierung des Systems erfolgte in der Skriptsprache Python1 . Hierfür
lagen die Gründe in den folgenden Vorteilen. Python erlaubt dank seiner unkomplizierten Syntax und den umfangreichen Standartmodulen sehr rasche Entwicklungszyklen. Die Original-BitTorrent-Implementierung wurde ebenfalls in dieser
Sprache verfasst und ist somit leicht zu integrieren. Da es sich um eine Skriptsprache handelt und Interpreter für alle gängigen Systeme vorliegen, kann sie als
betriebssystemunabhängig bezeichnet werden. Dieser Umstand ist zwar auf Seiten
der ExecutionNodes uninteressant, weil dieselben auf Windows ausgelegt werden
sollen, fügt aber auf der Seite des GridManagers und des JobServers den Vorteil der
Portierbarkeit hinzu. Die Performance, welche bei Skriptsprachen bekannterweise
weit hinter denen von gängigen Programmiersprachen zurücksteht, fiel in diesem
Fall nicht ins Gewicht, da keine zeitkritischen oder rechenintensiven Berechnungen
in Python selbst ausgeführt werden. Diese sind nämlich für Windows kompilierte Programme und somit von Python unabhängig. Die Implementierung erfolgte
in Python 2.4 und BitTorrent 3.4.2. Als Literatur für Python ist [Martelli u. a.,
2005] und [Pilgrim, 2004] zu empfehlen, wobei letztere kostenlos aus dem Web zu
beziehen ist.
1
http://www.python.org/
6.1. Modul- und Klassendefinitionen
65
6.1 Modul- und Klassendefinitionen
Im Folgenden werden die einzelnen Packages und relevanten Klassen beschrieben.
Die detaillierte Beschreibung der Klassen und ihrer Methoden kann in der Quelltextdokumentation nachgelesen werden.
Das Communication Package dient zur Kapselung der Netzwerkverbindung.
Siehe hierzu Abbildung 6.1. Hierdurch ist eine einfache Verwendung von verbindungsorientierter und verbindungsloser Kommunikation möglich, ohne direkten
Zugriff auf die Sockets zu haben. Dieses Verfahren bietet die Möglichkeit, das Modul später noch um Features zu erweitern, wie zum Beispiel Verschlüsselung, ohne
die restlichen Applikationen durch diesen Eingriff zu tangieren.
Eine Besonderheit dieses Moduls besteht darin, dass man direkt Instanzen beliebige Objekte versenden kann und diese dann als solche auch wieder auf der Empfängerseite empfangen werden. Die Serialisierung und die Dekodierung werden intern
über die ComCodec Klasse implementiert. Verwendet wird das Package folgendermaßen: Eine Klasse, die hierüber kommunizieren will, muss von der ComDef Klasse
erben, sowie die Methoden recv(self, msg, address) und send(self, msg,
address) überschreiben. Dann braucht die besagte Klasse nur noch eine Instanz
von ClientCom, ServerCom oder DgramCom bilden und als einen der Parameter
eine Referenz auf sich selbst übergeben.
Während für UDP/IP Kommunikation die Klasse DgramCom instanziert werden
muss, sind für TCP/IP Verbindungen die Klassen ClientCom und ServerCom vorgesehen. ClientCom baut sodann eine Verbindung zu der Adresse auf, die dem
Konstruktor übergeben wurde. Als Gegenpart hierzu nimmt die ServerCom Instanz Verbindungen auf der Adresse an, die sie über den Konstruktor erhalten
hat. ServerCom kann beliebig viele TCP/IP Verbindungen verwalten, welche über
die Empfängeradresse im ServerCom.recv(self, msg, address) Aufruf unterschieden werden.
66
6.1. Modul- und Klassendefinitionen
Communication
ComCodec
DgramCom
+logger: logging._loggerClass
+loop: bool
+codec: ComCodec
+rthread: threading.Thread
+__init__(self,address:tuple,comdef:ComDef)
+recv(self)
+send(self,msg:object,address:tuple)
+close(self)
1 +logger: logging._loggerClass
+seperator: string
+__init__(self,seperator:string="\r\n")
+decode(self,data:string): tuple
+encode(self,encode:object): string
1
Com
+ip: string
+port: int
+socket: socket.socket
+comdef: ComDef
+__init__(self,address:tuple,comdef:ComDef)
+close(self)
StreamCom
+cons: dict
+sema: threading.Semaphore
+__init__(self,address:tuple,comdef:ComDef)
+recv(self,address:tuple,msg:object)
+send(self,msg:object,address:tuple=None)
+closeCon(self,address:tuple)
+__del__(self)
1
1
1
1
ComDef
+__init__(self)
+send(self,msg:object,address:tuple=None)
+recv(self,msg:object,address:tuple)
+appendRawData(self,data:string,address:tuple): string
+setRawData(self,data:string,address:tuple)
ClientCom
+cthread: threading.Thread
+__init__(self,addresss:tuple,comdef:ComDef)
+connectSock(self)
Connection
n
ServerCom
+othread: threading.Thread
+flag: threading.Event
+__init__(self,address:tuple,comdef:ComDef,
listen:int)
+openSock(self)
+__del__(self)
+sock: socket.socket
+address: tuple
+com: StreamCom
+codec: ComCodec
+loop: bool
+maxd: int
+rthread: threading.Thread
+CLOSED: int = 1
+__init__(self,sock:socket.socket,address:tuple,
com:StreamCom)
+recv(self)
+send(self,msg:object)
+__del__(self)
Abbildung 6.1: Communication Package
1
6.1. Modul- und Klassendefinitionen
67
Das NodeRepresentation Package ist die Implementierung der in Kapitel
5.2 beschriebenen Nodeverwaltung. Abbildung 6.2 zeigt das zugehörige Klassendiagramm.
Die Verwendung erfolgt über die Klasse MainHook. Die wichtigsten Eigenschaften
werden im Folgenden kurz beschrieben: Mit den Methoden add und drop stellt die
Klasse die Funktionalität zum Einfügen und Löschen von Nodes in eine sortierte
Liste von miteinander verknüpften Links zur Verfügung. SubHook Klassen lassen
sich mit createHook instanzieren und mit freeHook wieder entfernen. fitHook
versucht, die Sollzahl der eingegliederten Node Instanzen zu regulieren. Die Methode next stellt den Zugriff auf den Iterator dar, und mit search kann man
mittels eines Adress-Port-Tuples über die binäre Suche nach einer entsprechenden Node Instanz im Hook fanden. Eine MainHook Instanz gilt als threadsicher
und kann so gefahrlos von mehreren Klassen parallel verwendet werden, wie es im
GridManager der Fall ist.
Das Auxiliary Package (siehe Abbildung 6.3) dient als Depot für Definitionen und Hilfsklassen. Mit seinen Unterklassen bietet das DefSet eine Struktur
für allgemeingültige Definitionen und Standartwerten an. Zusammen mit dem
NodeManager gehört der JobScheduler zu den Bestandteilen des GridManagers.
Durch den JobServer wird der TorrentServer instanziert. Er verteilt die .torrent
Dateien an die TorrentClients, welche von den ExecutionNodes verwendet werden.
Der Metadatenkanal ist die Bezeichnung für die Kommunikation zwischen TorrentServer und TorrentClient. Zur Überwachung von BitTorrent gestarteten Downloadthreads dient der TorrentWatcher. Über getData lassen sich so die Namen
fertig heruntergeladener Metadatenpakete erfragen. Stehen keine fertigen Pakete
an, so blockiert die Methode, bis ein Download beendet wurde.
68
6.1. Modul- und Klassendefinitionen
NodeRepresentation
MainHook
+subhooks: dict
+idle: string = "idle"
+sema: threading.Semaphore = Semaphore(1)
+__init__(self)
+add(self,node:Node,hook:SubHook=None)
+drop(self,address:tuple)
+free(self,address:tuple,blocking:bool=True)
+createHook(self,hook:string,request:int=0,
modul:string=None)
+fitHook(self,hook:string,modul:string=None,
blocking:bool=True,kickState:int=None)
+freeHook(self,hook:string)
Hook
+sema: threading.Semaphore
+links: Link
+iterator: Link
+len: int
+__init__(self,sema:threading.Semaphore)
+next(self,blocking:bool=True): Link
+resetIt(self)
+add(self,node:Node,blocking:bool=True)
+drop(self,address:tuple,blocking:bool=True)
+search(self,address:tuple,start:Link=None,
len:int=None,nearest:bool=False,blocking:bool=False,
r:int=0): Link
+groupMessage(self,msg:object)
+acquire(self,blocking:bool=True)
+release(self,blocking:bool=True)
1
1
1
IdleHook
+modules: dict
+__init__(self,sema:threading.Semaphore)
+add(self,node:Node,blocking:bool=True)
+drop(self,address:tuple,blocking:bool=True)
+ammount(self,modul:string): int
SubHook
n
Node
n
+mainhook: MainHook
+request: int
+maximum: int
+tserver: tuple
+tracker: tuple
+distribute: bool
+add(self,node:Node,blocking:bool=True)
+__init__(self,sema:threading.Semaphore,
mainhook:MainHook,request:int=0)
Link
1
+node: Node
+hook: SubHook
+head: Link
+tail: Link
+__init__(self,node:Node,head:Link=None,
tail:Link=None,subhook:SubHook=None)
+__cmp__(self,other): int
+__add__(self,i:int): Link
+__sub__(sellf,i:int): Link
1
+address: tuple
+status: string
+msg: [[],{}]
+modules: list
+sublink: Link
+lastmsg: float
+euthanized: bool = False
+data: string = ""
+timer: dict
+ctorrents: list
+__init__(self,address:tuple,status:string,
modules:list=[])
+updateStatus(self,status:string)
+hasModul(self,modul): bool
+addModul(self,modul:string): bool
+delModul(self,modul:string): bool
1
+__cmp__(self,x): int
+isDownloading(): bool
+isUploading(): bool
+isIdle(): bool
+isBusy(): bool
+isTrafficAllowed(): bool
+isSharingAllowed(): bool
Abbildung 6.2: NodeRepresentation Package
Timeout
Message
= 2
= 3
= 4
= 0
+INIT: int = 0
+EXIT: int = 2
+REQUEST: int = 3
+ALLOWED: int = 3
+DENIED: int = 4
+ALLOWDIS: int = 5
+DENYDIS: int = 6
JobMessage
+WHATSMYADDRESS: int
+GETTORRENT: int = 1
+WHATSMYTSERVER: int
+WHATSMYTRACKER: int
+RESETWORKSPACE: int
+MESSAGE: int = 5
Abbildung 6.3: Auxiliary Package
+dcom: Communication.DgramCom
+mhook: MainHook
+ltime: float = 0.3
+address: tuple
+flag: threading.Event
+loop: threading.Thread
+__init__(self,msg:object,address:tuple=None)
+recv(self,msg:Object,address:tuple)
+mainloop(self)
+checkvalidity(self,node:Node)
+appendRawData(self,data:string,address:tuple)
+setRawData(self,data:string,address:tuple)
+resetIdle(self)
+groupMessage(self,m:string)
+close(self)
NodeManager
+connect(self,server:tuple,myaddress:tuple)
+download(self,saveas:string,myaddress:tuple,
mytserver:tuple,request:string="t")
+upload(self,path:string,myaddress:tuple,
mytserver:tuple)
TorrentClient
+VERSION: char = 0x00
+NODEMANAGER: tuple = ("", 6669)
+JOBSCHEDULER: tuple = ("",6670)
+TORRENTSERVER: tuple = ("",6671)
+JOBLISTEN: int = 5
DefSet
+DOWNLOAD: int = 32
+UPLOAD: int = 16
+IDLE: int = 8
+BUSY: int = 4
+DATATRAFFIC: int = 2
+ALLOWSHARE: int = 1
NodeState
+LASTMSG: int = 60
+DOWNLOAD: int = 1500
+UPLOAD: int = 1500
+IDLE: int = 1800
+BUSY: int = 60
+DATATRAFFIC: int = 60
+ALLOWSHARE: int = 60
Auxiliary
1
1
TorrentWatcher
+active: dict
+done: list
+failed: list
+todo: list
+jserver: JobServer
+address: tuple
+savepath: string
+torrentpath: string
+modulid: int
+flag: threading.Event
+sock: socket.socket
+loop: threading.Thread
+tallac: TorrentAllocator
+__init__(self,jserver:JobServer,
address:tuple=DefSet.TORRENTSERVER,
listen:int=5)
+close(self)
+prepare(self)
+mainloop(self)
+connection(self,sock:socket.socket)
TorrentServer
+mhook: MainHook
+flag: threading.Event
+scom: Communication.ServerCom
+jobs: dict
+wait: int = 2
+thread: threading.Thread
+__init__(self,mhook:MainHook)
+addJob(self,address:tuple,policy:object)
+getStatus(self)
+startJob(self,address:tuple)
+mainloop(self)
+close(self)
+send(self,msg:object,address:tuple)
+recv(self,msg:object,address:tuple)
JobScheduler
+ext: string = ".torrent"
+flag: threding.Event
+data: list
+blacklist: list
+thread: threading.Thread
+files: list
+__init__(self,folder:string)
+mainloop(self)
+getData(self): string
+close(self)
1
1
Hook
ServerCom
DgramCom
+__init__(self)
+send(self,msg:object,address:tuple=None)
+recv(self,msg:object,address:tuple)
+appendRawData(self,data:string,address:tuple): string
+setRawData(self,data:string,address:tuple)
ComDef
+othread: threading.Thread
+flag: threading.Event
+__init__(self,address:tuple,comdef:ComDef,
listen:int)
+openSock(self)
+__del__(self)
+logger: logging._loggerClass
+loop: bool
1 +codec: ComCodec
+rthread: threading.Thread
+__init__(self,address:tuple,comdef:ComDef)
+recv(self)
+send(self,msg:object,address:tuple)
+close(self)
1
Communication (Auszug)
+sema: threading.Semaphore
+links: Link
+iterator: Link
+len: int
+__init__(self,sema:threading.Semaphore)
1 +next(self,blocking:bool=True): Link
+resetIt(self)
+add(self,node:Node,blocking:bool=True)
+drop(self,address:tuple,blocking:bool=True)
+search(self,address:tuple,start:Link=None,
len:int=None,nearest:bool=False,blocking:bool=False,
r:int=0): Link
+groupMessage(self,msg:object)
+acquire(self,blocking:bool=True)
+release(self,blocking:bool=True)
NodeRepresentation (Auszug)
1
6.1. Modul- und Klassendefinitionen
69
70
6.1. Modul- und Klassendefinitionen
BitTorrentApp ist das BitTorrent Softwarepaket. btdownloadheadless und
btdownloadcurses sind zwei Downloader mit zwei unterschiedlichen KonsolenBenutzerschnittstellen. Beide laden und verteilen anhand einer Metadatei die in
ihr referenzierten Nutzdaten. btlaunchmany und btlaunchmanycurses sind ebenfalls zwei Downloader mit differenzierenden Benutzerschnittstellen. Sie laden und
verteilen allerdings alle Metadaten in einem angegebenen Verzeichnis. Durch Hinzufügen und Entfernen der Torrents zur Laufzeit startet und beendet man den
entsprechenden Datentransfer. Mit btmakemetafile werden .torrent Dateien erstellt. Neue Tracker weist man ihnen mit btreannounce zu. Den in der Metadatei
gesetzten Tracker ändert man mit btrename, und mit btshowmetainfo können alle Informationen zu einem Torrent ausgegeben werden. btcompletedir dient zum
Erstellen einer Metadatei von einem Verzeichnis mit all seinen Inhalten. Letztendlich wird duch bttrack noch ein Tracker zur Verfügung gesetellt.
Zudem befindet sich im eben beschriebenen Softwarepaket ein Ordner mit dem
Namen BitTorrent, der eine Vielzahl von Modulen enthält, die in den oben genannten Programmen Verwendung finden. Von besonderem Interesse ist hierbei
bencode.py. Diese Datei beinhaltet Funktionen zur Serialisierung und Rekonstruktion von Metadaten.
BitTorrentApp (Auszug)
BitTorrent (Auszug)
launchmanyasthread
bencode
bencode
maketorrentfromlist
Abbildung 6.4: Paketauswahl BitTorrent API
Um BitTorrent in das System zu integrieren, waren einige Abänderungen nötig. So stellt launchmanyasthread eine Abwandlung von btlaunchmany dar, die
es ermöglicht, die dort beschriebenen Funtkionen als Thread laufen zu lassen.
maketorrentfromlist ist eine abgeänderte Version von btmaktetorrent. Jene
erlaubt das Erstellen von Metadaten, bei denen die Nutzdaten nicht alle im selben
Verzeichnis liegen oder nur eine einzelne Datei sind, sondern eine Auswahl von lo-
6.1. Modul- und Klassendefinitionen
71
kal beliebig verteilten Dateien. Eine Darstellung der explizit verwendeten Module
und ihre Position zueinander ist in Abbildung 6.4 zu sehen.
Die Implementierung von BitTorrent erwies sich bei der Analyse des Quellcodes aus
Sicht der Softwaretechnik als unsauber. So ist beispielsweise die Umsetzung eine
Mischung aus hauptsächlich prozeduraler Programmierung mit einer gelegentlichen
Verwendung der Objektorientierung, die eine Darstellung in einem Klassendiagramm nicht zuließ. Einige Dateien enthalten darüber hinaus eins zu eins kopierte
Funktionen aus anderen Dateien, anstatt diese modular zu kapseln. Schließlich
wurden auch Syntaxfehler im Quellcode gefunden, die nur deswegen bislang nicht
auffielen, weil die betroffenen Codezeilen nur äußerst selten interpretiert werden.
Die ExecutionNode Klasse ist die Hauptklasse eines ExecutionNodes. Sie versendet in regelmäßigen Abständen über eine DgramCom Instanz Nachrichten an
den GridManager. Durch den TorrenClient werden Metadaten vom JobServer runter oder zu ihm hinauf geladen. Über den Methodenaufruf launchTorrents wird
mittels launchmanyasthread der für die Metadaten vorgesehene Ordner fortwährend auf Torrents geprüft. Solange eine Metadatei sich in diesem Ordner befindet,
werden die in ihr beschriebenen Nutzdaten verteilt, beziehungsweise auch geladen.
Abbildung 6.5 klärt den Zusammenhang dieser Klassen.
Im Beispiel würde das wie folgt ablaufen: Über DgramCom trifft ein Nachrichtenobjekt ein, das die Anweisung zum Download eines Torrents enthält. Der TorrentClient verbindet sich hierauf mit dem JobServer und verlangt nach einer Aufgabe.
Nachdem der JobServer sich die Netzwerkadresse des Anfragenden beim GridManager hat verifizieren lassen, wird der Torrent übertragen. Ist der Download
abgeschlossen, beginnt automatisch BitTorrent die Nutzdaten zu laden. Der TorrentWatcher stellt nach beendetem Download den Torrentnamen in eine Queue,
welche vom ExecutionNode über getData abholt wird. Hierauf analysiert der ExecutionNode in der execute Methode die Daten auf Informationen zur Bearbeitung und führt letztere im darauf folgenden Schritt durch. Aus dem Ergebnis der
Bearbeitung wird dann ein Torrent erzeugt und dieser wieder an den JobServer
übertragen.
72
6.1. Modul- und Klassendefinitionen
ExecutionNode
+address: tuple
+server: tuple
+flag: threading.Event
+stopbt: threading.Event
+myaddress: tuple
+mytserver: tuple
+mytracker: string
+firsttime: bool
+download: bool
+upload: bool
+idle: bool
+busy: bool
+datatraffic: bool
+allowshare: bool
+datdic: dict
+dcom: DgramCom
+mloop: threading.Thread
+dloop: threading.Thread
+workspace: string
+twatcher: TorrentWatcher
+send(self,msg:list,address:tuple=None)
+recv(self,msg:tuple,address:tuple)
+mainloop(self)
+startdownload(self,saveas:string)
+startupload(self,path:string)
+launchTorrents(self,start:bool=True)
+getStatus(self): char
+datafetcher(self)
+executer(self,metainfo_name)
+resetworkspace(self)
+close(self)
Auxiliary (Auszug)
DefSet
1
1
+VERSION: char = 0x00
+NODEMANAGER: tuple = ("", 6669)
+JOBSCHEDULER: tuple = ("",6670)
+TORRENTSERVER: tuple = ("",6671)
+JOBLISTEN: int = 5
TorrentClient
1
n
+connect(self,server:tuple,myaddress:tuple)
+download(self,saveas:string,myaddress:tuple,
mytserver:tuple,request:string="t")
+upload(self,path:string,myaddress:tuple,
mytserver:tuple)
TorrentWatcher
1
1
+ext: string = ".torrent"
+flag: threding.Event
+data: list
+blacklist: list
+thread: threading.Thread
+files: list
+__init__(self,folder:string)
+mainloop(self)
+getData(self): string
+close(self)
1
Communication (Auszug)
1
DgramCom
ComDef
+__init__(self)
+send(self,msg:object,address:tuple=None)
+recv(self,msg:object,address:tuple)
+appendRawData(self,data:string,address:tuple): string
+setRawData(self,data:string,address:tuple)
+logger: logging._loggerClass
+loop: bool
+codec: ComCodec
+rthread: threading.Thread
+__init__(self,address:tuple,comdef:ComDef)
+recv(self)
+send(self,msg:object,address:tuple)
+close(self)
Abbildung 6.5: Klassendiagramm ExecutionNode
6.1. Modul- und Klassendefinitionen
73
Die GridManager Klasse ist eine Zusammensetzung aus dem JobScheduler
und dem NodeManger, wie in Abbildung 6.6 zu sehen ist. Beide operieren auf einer gemeinsamen MainHook Instanz. Der NodeManager nimmt über eine DgramCom Instanz Nachrichten von den ExecutionNodes entgegen und verarbeitet sie.
Resultieren hieraus Antworten, so werden diese dann an das den ExecutionNode
repräsentierende Node Objekt übergeben. Beim Initialisieren der NodeManager
Klasse wird die Methode mainloop in einem extra Thread gestartet. Diese itereriert endlos über alle in der MainHook registrierten Nodes, bewertet dieselben und
schickt Nachrichten an die entsprechenden ExecutionNodes, sofern solche im Node
Objekt hinterlegt wurden.
Der JobScheduler hält die Verbindungen zu den JobServern und verwaltet deren
Aufgabenausführung. Auch der JobScheduler führt eine Methode mit dem Namen
mainloop, welche in einem eigenen Thread endlos läuft. In diesem Fall werden aber
die auszuführenden Aufgaben einer permanenten Überprüfung und Bewertung unterzogen. Hier fallen dann die Entscheidungen, wann eine Aufgabe beispielsweise
gestartet oder gestoppt werden soll.
Auxiliary (Auszug)
NodeManager
JobScheduler
DefSet
+VERSION: char = 0x00
+NODEMANAGER: tuple = ("", 6669)
+JOBSCHEDULER: tuple = ("",6670)
+TORRENTSERVER: tuple = ("",6671)
+JOBLISTEN: int = 5
+mhook: MainHook
+flag: threading.Event
+scom: Communication.ServerCom
+jobs: dict
+wait: int = 2
+thread: threading.Thread
+__init__(self,mhook:MainHook)
+addJob(self,address:tuple,policy:object)
+getStatus(self)
+startJob(self,address:tuple)
+mainloop(self)
+close(self)
+send(self,msg:object,address:tuple)
+recv(self,msg:object,address:tuple)
1
+dcom: Communication.DgramCom
+mhook: MainHook
+ltime: float = 0.3
+address: tuple
+flag: threading.Event
+loop: threading.Thread
+__init__(self,msg:object,address:tuple=None)
+recv(self,msg:Object,address:tuple)
+mainloop(self)
+checkvalidity(self,node:Node)
+appendRawData(self,data:string,address:tuple)
+setRawData(self,data:string,address:tuple)
+resetIdle(self)
+groupMessage(self,m:string)
+close(self)
1
1
GridManager
1
+js: JobServer
+nm: NodeManager
+__init__(self)
+close(self)
Abbildung 6.6: Klassendiagramm GridManager
74
6.2. Aufgabendeklaration
Die JobServer Klasse verwaltet die Verteilung der Tasks. Initial analysiert
sie das Verzeichnis der Aufgabestellung und generiert Abhängigkeitslisten aus den
Teilaufgaben. Hieraus erstellt der JobServer über maketorrentfromlist die Metadaten. Mittels eine ClientCom Instanz wird eine Verbindung zum GridManager
aufgebaut und mit Hilfe eines TorrentServers werden Verbindungen der ExecutionNodes entgegengenommen. Den Aufbau und die Abhängigkeiten der JobServer
Klasse zeigt Abbildung 6.7.
Der Algorithmus, nach dem die Aufgabenpakete verteilt werden, sieht folgendermaßen aus: Alle unbearbeiteten Tasks befinden sich in einer Queue. Soll einem
ExecutionNode ein Task zugewiesen bekommen, wird der vorderste aus der Queue
genommen, an den ExecutionNode übertragen und wieder an das Ende der Queue
gestellt. Erst wenn ein Ergebnis von einem ExecutionNode empfangen wurde, entfernt man den Tasks aus der Queue. Dies hat zur Folge, dass gegen Ende der
Jobbearbeitung Tasks erneut verteilt werden, für die der JobServer noch kein Ergebnis erhalten hat. Der Vorteil liegt darin, dass so langsame oder ausgefallene
Rechner kompensiert werden können.
6.2 Aufgabendeklaration
Ein Jobpackage ist eine für das Grid konforme Menge von beliebigen Daten. Wie
schon in Kapitel 5.3 angerissen, definiert es sich durch drei Eigenschaften:
• Identifiziert wird der Job durch das Verzeichnis im Dateisystem, in welchem
die Daten abgelegt wurde.
• Dieses Verzeichnis benötigt ein Unterverzeichnis mit dem Namen ./metadata.
• Das Verzeichnis ./metadata benötigt die Datei manifest.xml
Für einen erfolgreichen Einsatz gibt es zudem zwei Bedingungen, nämlich dass a)
der JobServer Schreibrechte auf das Jobpackage hat und dass b) alle benötigten
DefSet
Abbildung 6.7: Klassendiagramm JobServer
+ext: string = ".torrent"
+flag: threding.Event
+data: list
+blacklist: list
+thread: threading.Thread
+files: list
+__init__(self,folder:string)
+mainloop(self)
+getData(self): string
+close(self)
TorrentWatcher
+active: dict
+done: list
+failed: list
+todo: list
+jserver: JobServer
+address: tuple
+savepath: string
+torrentpath: string
+modulid: int
+flag: threading.Event
+sock: socket.socket
+loop: threading.Thread
+tallac: TorrentAllocator
+__init__(self,jserver:JobServer,
address:tuple=DefSet.TORRENTSERVER,
listen:int=5)
+close(self)
+prepare(self)
+mainloop(self)
+connection(self,sock:socket.socket)
TorrentServer
+VERSION: char = 0x00
+NODEMANAGER: tuple = ("", 6669)
+JOBSCHEDULER: tuple = ("",6670)
+TORRENTSERVER: tuple = ("",6671)
+JOBLISTEN: int = 5
Auxiliary (Auszug)
+manifest: string
+modul: string
1 1 +tasks: string
+torrents: string
+results: string
+sema: threading.Semaphore
+tserver: tuple
+tracker: string
+manager: tuple
+exitEvent: threading.Event
+stopSeeding: threading.Event
+statEvent: threading.Event
+path: string
+ccom: ClientCom
+hook: Hook
+requests: dict
+dom: xml.dom.minidom
1 1 +modulid: string
+policy: xml.dom.minidom
+tdis: TorrentServer
+stats: Statistic
+twatcher: TorrentWatcher
+dloop: threading.Thread
+__init__(self,path:string,tracker:string,
manager:tuple,tserver:tuple)
+datafetcher(self)
+makeTorrent(self,node:string)
+progress(self,x:int)
+seedTorrents(self,start:bool=True)
+send(self,msg:object,address:tuple=None)
+recv(self,msg:object,address:tuple)
1 1
+close(self)
JobServer
1
1
ClientCom
+__init__(self)
+send(self,msg:object,address:tuple=None)
+recv(self,msg:object,address:tuple)
+appendRawData(self,data:string,
address:tuple): string
+setRawData(self,data:string,address:tuple)
ComDef
+cthread: threading.Thread
+__init__(self,addresss:tuple,comdef:ComDef)
+connectSock(self)
Communication (Auszug)
6.2. Aufgabendeklaration
75
76
6.2. Aufgabendeklaration
Dateien inklusive der ausführbaren Programme und ihrer Bibliotheken innerhalb
der Ordnerstruktur liegen.
Der Aufbau der manifest.xml wird durch die metadata.dtd, siehe Abbildung 6.9,
deklariert. Sie beinhaltet unter anderem die Policy Informationen, welche Ausführungszeitraum, Prioritätslevel, Eigentümer und die Anzahl der gewünschten ExecutionNodes festlegen. Der GridManager benötigt diese Information zur Priorisierung und Konfiguration des Jobs. Des Weiteren definiert diese Konfigurationsdatei
das Modul und die Tasks des Jobs. Beide Elemente beschreiben Kommandos, welche auf den ExecutingNodes ausgeführt werden sollen, sowie die dafür benötigten
Daten. Der Unterschied besteht darin, dass das Modul an jeden ExecutingNode
übertragen wird, die Tasks aber nur an jeweils einen einzigen. Besagtes Modul
beinhaltet also die Grundvoraussetzungen, die zum Erledigen der eigentlichen Teilaufgaben, der Tasks, benötigt werden.
Für jeden Job wird eine eigene JobServer Instanz gestartet. Diese analysiert jetzt
die manifest.xml, extrahiert die Modul und Task Informationen in einzelne .xml
Dateien und legt dieselben im Ordner ./metadata ab. Nun werden für das Modul
und die Tasks eigene Torrent Dateien erstellt, welche für die jeweilige .xml Datei
und die darin beschriebenen Dateien gelten. Sie sind ebenfalls im ./metadata
Ordner abzulegen.
Abbildung 6.8 zeigt den beispielhaften Aufbau einer manifest.xml, welche eine
Policy, ein Modul und drei Tasks umfasst. Das Modul besteht in diesem Fall nur
aus einer Datei, die einen Packer repräsentieren soll. Die Tasks beinhalten je eine
.txt Datei und drei Kommandos. Kommando eins besagt, dass das Programm
welches die ID 0001 trägt, mit den Parametern des param Strings auszuführen
ist. Werden IDs im param String verwendet, so werden sie von Prozentzeichen
eingeschlossen. Im Beispiel soll der Packer also aus der jeweiligen .txt Datei im
Task ein gleichnamiges Archiv mit der zusätzlichen Endung „.rar“ erzeugen. In den
Kommandos zwei und drei wird der Parameter cmd verwendet. Für diesen sind die
Werte „result“, „copy“, „delete“ und „move“ zulässig. Erster markiert den Inhalt
von param als Resultat, welches nach erfolgter Aufgabenlösung zum JobServer zu
übertragen ist. Die restlichen Werte stellten dabei Dateisystemoperationen dar,
6.2. Aufgabendeklaration
77
die äquivalent ihrer Bedeutung verwendet werden. Die übergebenen Parameter
stimmen mit den Pfadangaben überein, wie sie auch in den gleichbedeutenden
Konsolenkommandos gängiger Betriebssysteme zum Einsatz gelangen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version=" 1 . 0 " e n c o d i n g="ISO−8859−1" ?>
< !DOCTYPE j o b SYSTEM " m e t a i n f o . dtd ">
<j o b i d=" 0001 ">
<p o l i c y p r i o r i t y l e v e l="1 " minnodeamount="1" maxnodeamount="1"
f a v o u r e d s t a r t="−1" f a v o u r e d e n d="−1" owner=" username "/>
<modul i d=" 0001 ">
<data i d=" 0001 " path=" . / r a r . exe "/>
</modul>
<t a s k i d=" 0001 " modul=" 0001 ">
<data i d=" 0002 " path=" . / a l p h a . t x t "/>
<command data=" 0001 " param="␣%0002%␣%0002%. r a r "/>
<command cmd =" d e l e t e " param="%0002%"/>
<command cmd =" r e s u l t " param="%0002%. r a r "/>
</ t a s k>
<t a s k i d=" 0002 " modul=" 0001 ">
<data i d=" 0003 " path=" . / b e t a . t x t "/>
<command data=" 0001 " param="␣%0003%␣%0003%. r a r "/>
<command cmd =" d e l e t e " param="%0003%"/>
<command cmd =" r e s u l t " param="%0003%. r a r "/>
</ t a s k>
<t a s k i d=" 0003 " modul=" 0001 ">
<data i d=" 0004 " path=" . / gamma . t x t "/>
<command data=" 0001 " param="␣%0004%␣%0004%. r a r "/>
<command cmd=" d e l e t e " param="%0004%"/>
<command cmd=" r e s u l t " param="%0004%. r a r "/>
</ t a s k>
</ j o b>
Abbildung 6.8: manifest.xml
78
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
6.2. Aufgabendeklaration
<?xml version=" 1 . 0 " e n c o d i n g="ISO−8859−1" ?>
< !ELEMENT m e t a i n f o ( j o b | modul | t a s k | r e s u l t )>
< !ELEMENT j o b
( p o l i c y , modul , t a s k +)>
< !ELEMENT p o l i c y
EMPTY>
< !ELEMENT modul
( data ∗ , command∗ )>
< !ELEMENT t a s k
( data ∗ , command∗ )>
< !ELEMENT data
EMPTY>
< !ELEMENT command EMPTY>
< !ELEMENT r e s u l t
( data +)>
< !ATTLIST j o b
i d CDATA #REQUIRED>
< !ATTLIST p o l i c y
p r i o r i t y l e v e l CDATA #REQUIRED
minnodeamount CDATA #REQUIRED
maxnodeamount CDATA #REQUIRED
f a v o u r e d s t a r t CDATA #REQUIRED
favouredend
CDATA #REQUIRED
owner
CDATA #REQUIRED>
< !ATTLIST modul
id
CDATA #REQUIRED>
< !ATTLIST t a s k
id
CDATA #REQUIRED
modul CDATA #REQUIRED>
< !ATTLIST data
id
CDATA #REQUIRED
path CDATA #REQUIRED>
< !ATTLIST command
id
CDATA #REQUIRED
data CDATA #IMPLIED
cmd
CDATA #IMPLIED
param CDATA #REQUIRED>
< !ATTLIST r e s u l t
job
CDATA #REQUIRED
t a s k CDATA #REQUIRED>
Abbildung 6.9: metainfo.dtd
6.3. Kommunikationskanäle
79
6.3 Kommunikationskanäle
Der Informationsaustausch findet über drei Kommunikationskanäle statt. Diese
sind der Steuerungs-, der Metadaten- und der Nutzdatenkanal. Die Konstellation,
in welcher die Teilnehmer miteinander in Verbindung treten, wird durch Abbildung
5.3 auf Seite 56 dargestellt.
Der Steuerungskanal dient unter den Teilnehmern zum Austausch von Informationen und Steuerbefehlen. Hierüber kommuniziert der GridManager mit den
ExecutionNodes und den JobServern. Die ExecutionNodes tauschen mit dem GridManger ihre Nachrichten über das zustandslose UDP/IP Protokoll aus. Der Grund
für diese Entscheidung liegt darin, dass bei dauerhaften TCP/IP Verbindungen jeder Node eine Socketinstanz zugewiesen bekäme. Da die Annahme gilt, dass ExecutionNodes unvorhersagbar ausfallen werden, würde dies eine permanente Fehlerbehandlung in der Nodeverwaltung mit sich ziehen. Die Alternative, dass TCP/IP
Verbindungen je Nachricht neu aufgebaut und wieder geschlossen werden könnten,
würde einen unnötigen Overhead an Netzwerkverkehr und Verwaltungsaufwand
generieren.
Hingegen basiert die Kommunikation zwischen GridManager und JobServern auf
permanenten TCP/IP Verbindungen, da hier die oben genannten Entscheidungsgründe nicht gegeben sind.
Die Kommunikation des Steuerungskanal erfolgt über Nachrichtenobjekte. Diese
werden in Python mit Hilfe des pickle Moduls serialisiert und über einen Socket
versendet. Nun rekonstruiert und verarbeitet die Empfängerseite das ursprüngliche
Objekt. Als Nachrichtenobjekt bezeichnet man eine Liste, deren erstes Element ein
Character ist, welcher zur Versionierung dient. Die folgenden Beschreibungen der
Nachrichtenobjekte beziehen sich alle auf Version 0x00.
ExecutionNode Nachrichtenobjekte werden vom ExecutionNode an den NodeManager des GridManagers gesendet. Das Objekt, welches in Tabelle 6.1 mit
80
6.3. Kommunikationskanäle
dem Namen object bezeichnet und dessen Zusammensetzung dort dargestellt
wird, besteht aus den vier Elementen version, status, messages und infos.
Name
object
version
status
messages
infos
Definiton
List:[version, status, messages, infos]
Character
Character
List
Dictionary
Tabelle 6.1: ExecutionNode Nachrichtenobjekt
Der Character status stellt eine Zusammenschluss von binären Zuständen dar,
welche durch ihre Bitstelle im Characterbyte in der Bedeutung definiert werden.
Interpretiert wir der Wert mit 1 für ja und 0 für nein. Die Bezeichnung und ihre
Bedeutung sind der Tabelle 6.3 zu entnehmen. Anhand dieser Zustände und der
Zeitdauer, wie lange ein Node in diesem Zustand verweilt, entscheidet der GridManager über die Verwendung desselben. Das message Objekt ist eine Liste, die
als Container der in der Klasse DefSet.Messages festgelegten Definitionen dient.
Mittels dieser kann der Node beispielsweise Anfragen über die Adresse des ihm zugewiesenen JobServers stellen. infos instanziert ein Dictionary, das die Aufgabe
hat, Anfragen mit einem variablen Anteil zu versenden. In der aktuellen Version
wird dies noch nicht benötigt.
Name
object
version
messages
infos
Definiton
List:[version, messages, infos]
Character
List
Dictionary
Tabelle 6.2: NodeManager Nachrichtenobjekt
NodeManager Nachrichtenobjekte heißen die Narichten, welche vom NodeManager an die ExecutionNodes versendet werden. Wie man Tabelle 6.2 entnehmen kann, haben diese denselben Aufbau wie die ExecutionNode Nachrichtenobjekte, allerdings mit dem Unterschied, dass kein Statusbyte vorhanden ist.
6.3. Kommunikationskanäle
Bitstelle
8
7
6
5
4
3
2
1
Bezeichnung
FREE
FREE
DOWNLOAD
UPLOAD
IDLE
BUSY
DATATRAFFIC
ALLOWSHARE
81
Erklärung
nicht verwendet
nicht verwendet
ist der EN Daten am laden?
ist der EN Daten am hochladen?
ist der EN frei oder am rechnen?
wird der EN vom Anwender verwendet?
ist ein Datentransfer zur Zeit erlaubt?
darf EN Daten mit anderen ENs Teilen?
Tabelle 6.3: Statusbyte der ExecutionNodes
JobServer Nachrichtenobjekte werden an den JobScheduler gesendet. Sie
enthalten, wie Tabelle 6.4 entnommen werden kann, die Variablen type und content. type definiert mit seinem Wert den zu erwartenden Inhalt von content. Der zu
der ExecutionNode und dem NodeManager beschriebene Aufbau der Nachrichtenobjekte resultiert aus der Tatsache, dass beim JobServer und beim JobScheduler
die Nachrichten direkt versendet und nicht, wie im Fall der ExecutionNodes und
des NodeManagers, vorerst gesammelt werden. Daher ist eine einfachere Struktur
der Nachrichten möglich.
Name
object
version
type
content
Definiton
List:[version, type, content]
Character
Integer
von type Abhängig
Tabelle 6.4: JobServer/JobScheduler Nachrichtenobjekt
JobScheduler Nachrichtenobjekte gleichen sich im Aufbau mit denen der
JobServer.
Welche Kommandos von den jeweiligen Nachrichtenobjekten in der aktuellen Version unterstützt werden und was diese bedeuten, zeigt Tabelle 6.5.
82
6.3. Kommunikationskanäle
Variable Werte
Bedeutung
ExecutionNode Nachrichtenobjekt
messages WHATSMYADDRESS Anfrage nach eigener IP Adresse
um NATs zu erkennen.
WHATSMYTRACKER Adresse des Trackers erfragen.
WHATSMYTSERVER Adresse des TorrentServers erfragen.
NodeManager Nachrichtenobjekt
messages GETTORRENT
Aufforderung zum Laden einer
Aufgabe.
RESETWORKSPACE
Aufforderung in den Grundzustand zu kehren.
infos
WHATSMYADDRESS
Antwort auf Anfrage. Enthält
Adresstuple.
WHATSMYTRACKER Antwort auf Anfrage. Enthält
Adresstuple.
WHATSMYTSERVER Antwort auf Anfrage. Enthält
Adresstuple
MESSAGE
Textnachricht an den Node.
JobServer Nachrichtenobjekt
type
INIT
Initialisierung. Enthält die Policy.
EXIT
Aufforderung Job zu beenden.
REQUEST
Identifikations- und Authorisierungsanfrage. Enthält Adresstuple eines Nodes.
ALLOWDIS
Aufgabenzuweisung der Nodes erlauben.
DENYDIS
Aufgabenzuweisung der Nodes
verbieten.
JobScheduler Nachrichtenobjekt
type
ALLOWED
Positive Antwort auf REQUEST.
Enthält Addresstuple
Tabelle 6.5: Wertebereich Nachrichtenobjekte
6.3. Kommunikationskanäle
83
Der Metadatenkanal dient zur Übertragung der .torrent Dateien zwischen
den ExecutionNodes und den JobServern. Dieser Kanal verwendet das TCP/IP
Protokoll und baut nicht auf dem Communication Package auf. Initiator der einer
Verbindung ist immer der ExecutionNode. Entweder er erhält vom GridManager
die Anweisung, sich eine .torrent Datei vom JobServer abzuholen oder er beendet
eine Aufgabe und möchte die Metadaten seines Resultates zum JobServer schicken.
Nach dem Verbindungsaufbau überträgt der ExecutionNode einen String seines
mit pickle serialisiertes Adresstuples, welchen er vom GridManager zugewiesen
bekommen hat. Als Prefix vor diesem String steht die Länge des Strings in ASCII Zahlen zur Basis zehn, gefolgt von einem Doppelpunkt. Im Beispiel würde das
Adresstuple ("11.11.0.11",1234) mit "26:(S’11.11.0.11’\nI1234\ntp1\n."
übertragen werden. Dabei sagt die Zahl 26 dem JobScheduler, wieviele Byte für die
Adresse einzulesen sind, wobei der Doppelpunkt das Ende der Zahl markiert. Der
JobServer schickt ein Nachrichtenobjekt mit einem REQUEST und der Adresse
als Wert an den GridManager, um den ExecutionNode verifizieren zu lassen. Die
Tatsache, dass der JobScheduler nicht die Adresse der eingehenden Verbindung
zur Verifizierung verwendet, hat zwei Gründe: erstens sollen so Adressveränderungen durch Proxyserver und NATs umgangen werden, und zweitens ist somit eine
spätere Umstellung auf andere Identifikationswerte, wie zum Beispiel eindeutige,
zufällig generierte Zeichenketten problemlos möglich.
Nach erfolgter Verifizierung empfängt der JobServer ein weiteres Byte, um den
Grund der Verbindung zu erfahren. Dieses Byte repräsentiert ein Zeichen der
ASCII Tabelle. Entspricht besagtes Byte einem „u“ hat der ExecutionNode eine Metadatei zum Hochladen, und bei einem „d“ soll ein Torrent vom JobServer
heruntergeladen werden. Im zweiten Fall muss noch ein Byte übertragen werden.
Ist dieses ein „m“, so fordert der ExecutionNode das Modul; bei einem „t“ soll ein
Task übertragen werden. Hiernach steht wieder eine Zahl, gefolgt von einem Doppelpunkt, welche der Größe der Metadatei in Bytes entspricht. Schließend wird die
Torrentdatei übertragen.
84
6.4. Benutzerschnittstellen
Der Nutzdatenkanal verteilt die in den Torrents referenzierten Daten. Implementiert wird dies durch das BitTorrent Protokoll, welches in Kapitel 4.3 vollständig beschrieben ist.
6.4 Benutzerschnittstellen
Das System stellt dem Benutzer für die drei Anwendungen ExecutionNode, JobServer und GridManager je eine Konsole zur Steuerung bereit. Diese Systemschnittstellen erlauben den Zugriff auf die grundlegenden Fähigkeiten zur Verwaltung und
Manipulation der verbundenen Anwendungsinstanz.
Im Folgenden wird der Gebrauch der drei Schnittstellen erläutert. Hierfür werden im Sinne einer verständlichen Erklärung zuvor beispielhafte Konfigurationsbedingungen festgelegt. Es gelten nachstehende Bedingungen: Von jeder Anwendung wird nur eine Instanz gestartet. Unter der URL http://10.10.11.68:6969/
announce steht ein BitTorrent Tracker zur Verfügung. Der ExecutionNode wird
auf einem Rechner mit der IP Adresse 10.10.11.69 gestartet. Der GridManager soll
unter der IP Adresse 10.10.11.68 initiiert werden, wobei der NodeManager unter
Port 6669 und der JobScheduler unter dem Port 6670 erreicht wird. Der JobServer
erhält einen Rechner mit der IP Adresse 10.10.11.67. Dabei soll der TorrentServer
unter dem Port 6671 laufen. Der JobServer findet seine JobPackage unter dem
Pfad /home/griduser/renderjob.
Der ExecutionNode ist über das nachstehende Kommando zu starten:
python ExecutionNode.py -manager 10.10.11.68:6669
Der Wert des Parameters -manager gibt die Adresse des NodeManagers vom GridManager an. Alle Nachrichtenobjekte werden vom ExecutionNode an diese Netzadresse geschickt. Nach dem Start steht dem Benutzer eine Eingabeaufforderung
6.4. Benutzerschnittstellen
85
mit dem Prompt ExecutionNode > zur Verfügung. Tabelle 6.6 zeigt eine Übersicht
aller zugelassener Befehle.
Befehl
help
status
debug
reset
exit
Definiton
Listet alle Befehle mit kurzer Erklärung auf.
Listet alle Statuswerte auf.
Sprung zu einem definierten Breakpoint. Nur
für den Debugmodus der Entwicklungsumgebung.
Stellt den ExecutionNode auf den Ursprungszustand zurück und löscht alle geladenen und errechneten Daten.
Beendet das Programm.
Tabelle 6.6: ExecutionNode Befehle
Der JobServer wird mit vier Parametern initiiert. Hiervon nennt -job den
Pfad zum JobPackage. Die Festlegung des Trackers erfolgt mit dem Parameter
-tracker. -manager gibt die Adresse des JobSchedulers vom GridManager an.
Der -tserver benennt die lokale Adresse, an die der TorrentServer gebunden werden soll. Nach Ausführung des nachstehenden Befehls erhält der Anwender eine
Kommandozeile mit dem Prompt JobServer >.Tabelle 6.7 zeigt eine Übersicht
aller zugelassener Befehle.
python JobServer.py -job /home/griduser/renderjob
-tracker http://10.10.11.68:6969/announce
-manager 10.10.11.68:6670
-tserver 10.10.11.67:6671
Befehl
help
status
exit
Definiton
Listet alle Befehle mit kurzer Erklärung auf.
Gibt Prozentual die Fertigstellung des Jobs
und die benötigte Zeit aus.
Beendet den JobServer.
Tabelle 6.7: JobServer Befehle
86
6.4. Benutzerschnittstellen
Der GridManager wird ohne weitere Parameter über den folgenden Befehl
ausgeführt:
python GridManager.py
Somit hat der Benutzer eine Kommandozeile mit dem Prompt GridManager > auf
seinem Schirm. Tabelle 6.8 zeigt eine Übersicht aller zugelassener Befehle.
Befehl
help
status
start
kill
newidle
msg
restart
exit
Definiton
Listet alle Befehle mit kurzer Erklärung auf.
Listet Informationen über Menge und Zustand der registrierten Gridteilnehmer.
Benötigt JobServer-Adresse IP:PORT als
Prameter. Startet den Job.
Benötigt JobServer-Adresse IP:PORT als
Prameter. Beendet den Job.
Anweisung an alle freien ExecutionNodes
sich in den Grundzustand zurückzusetzen.
Benötigt einen String als Parameter. Versendet diesen als Gruppennachricht an alle ExecutionNodes.
Startet den GridManager neu.
Beendet den GridManager.
Tabelle 6.8: GridManager Befehle
87
7 Testszenario
Als Testplattform für die ExecutionNodes standen mehrere Rechner mit größtenteils homogenen Leistungsfaktoren zur Verfügung, welche über ein Fast Ethernet
Netzwerk miteinander verbunden waren. Eine Spezifikation der einzelnen Computer ist Tabelle 7.1 zu entnehmen. Der GridManager und die JobServer wurden
auf einem Ubuntu Linux Rechner ausgeführt. Auf diesem Rechner befand sich zudem ein Subversion Repository, über welches die Testrechner via WebDAV ihre
ExecutionNode-Versionen aktualisierten.
Name
PC1
PC2
PC3
PC4
PC5
PC6
PC7
PC8
CPU
Pentium 4
Pentium 4
Pentium 2
Pentium 4
Pentium 4
Pentium 4
Pentium 4
Pentium 4
Taktfrequenz
3.0 GHz
3.0 GHz
350 MHz
2.4 GHz
3.0 GHz
3.0 GHz
2.0 GHz
3.0 GHz
Arbeitsspeicher
512 MB
1024 MB
128 MB
512 MB
512 MB
512 MB
512 MB
512 MB
Tabelle 7.1: Testrechner
Das Testszenario sah wie folgt aus: Mit der freien 3D Modellierungssoftware Blender1 entstand eine aus zehn Bildern bestehende Animationssequenz. Deren Einzelbilder wurden dann als XML Dateien exportiert und sodann mit der freien
Software 7-Zip2 komprimiert. Die Aufgabe der ExecutionNodes bestand darin, die
7a-Archive herunterzuladen und nach deren Dekompression aus den XML-Dateien
1
2
http://www.blender3d.org/
http://www.7-zip.org/
88
mittels des Open Source Renderes YafRAY3 die Bilder zu berechnen. Danach galt
es, diese Resultate als komprimiertes Archiv dem Auftraggeber zu übertragen.
Hierzu beschrieb die manifest.xml Datei 7-Zip und YafRay als Modul und die
einzelnen Archive als Tasks. Zur Veranschaulichung zeigt Abbildung 7.4 einen Ausschnitt der manifest.xml. Dieses 10 Bilder JobPackage diente dann als Basis für
abgewandelte JobPackges, welche aus 5, 25, 50, 75 und 100 Aufgaben bestanden.
Abbildung 7.1 zeigt das von YafRay generierte Bild 10 der Animation.
Abbildung 7.1: Gerendertes Bild, Auflösung: 1024x768
Das Programm YafRay ist ein Raytracer. Mit Raytracing bezeichnet man ein Verfahren zur Bildsynthese aus einer 3D Szenerie. Hierzu werden vom Auge des Betrachters Strahlen in die Szene gesandt und so die Sichtbarkeit, beziehungsweise
die Verdeckung von Objekten ermittelt. Über dieses Verfahren ist eine globale
3
http://www.yafray.org/
7.1. Test 1: Verteilung
89
Beleuchtung der 3D Objekte möglich. Während in lokalen Beleuchtungsmodellen
nur die Reflektion zwischen zuvor definierten Lichtquellen und einer Oberfläche
simuliert werden, ist es die Aufgabe der globalen Beleuchtungsmodelle, alle in
der Szene befindlichen Objekte in die Berechnung eines Bildpunktes mit einzubeziehen. So wird zum Beispiel das reflektierende Licht eines Objekts für die Berechnung eines benachbarten Objekts mit berücksichtigt. Über Erweiterungen der
klassischen Raytracing-Algorithmen ist es unter anderem möglich Schattenwurf,
Lichtbrechung, Reflektion und Kaustik einer 3D Szene zu simulieren. Durch die
Tatsache, dass Raytracing eine mit zunehmender Komplexität der Szenerie und
steigender Auflösung der zu erstellenden Bilder sehr zeitaufwändige Aufgabe sein
kann, und alle Bilder einer Szene parallel erstellt werden können, ist Raytracing
ein ideales Anwendungsgebiet für das implementierte Grid.
Die Laufzeit tp eines JobServers resultiert aus einem Zusammenhang mit der Anzahl der ExecutionNodes m, der Anzahl der Tasks n, der mittleren Ausführungszeit
tm pro Aufgabe und der Zeitbedarf ti zur Initialisierung des JobServers. Der Wert
von tm ist die Summe der eigentlichen Rechenzeit des ExecutionNodes und des
im Grid betriebenen Mehraufwands für einen Task. Letzterer umfasst den Verwaltungsaufwand zur Zuordnung und Verteilung der Aufgaben, vor allem aber die
Datenübertragung zu den ExecutionNodes und die Übergabe der Resultate an den
JobServer. Die durchschnittliche Anzahl an Berechnungen, die auf einem ExecutionNode ausgeführt werden, bildet der Quotient von der Taskmenge n und der
ExecutionNodes m. Die Formel 7.1 stellt diesen Zusammenhang dar.
tp = tm ·
n
+ ti
m
(7.1)
7.1 Test 1: Verteilung
In diesem Versuch wurde die Verteilung der Aufgabenpakete untersucht. Anhand
der ermittelten Werte ließ sich eine Schwachstelle im Verteilungsalgorithmus ausmachen und verbessern.
90
7.2. Test 2: Aufwandssteigerung
Der Test bestand aus der Berechnung von zehn Bildern, die zuerst auf einem
Rechner (PC1), dann auf vier (PC1, PC4, PC5, PC7) und anschließend auf fünf
(PC1, PC3, PC4, PC5, PC7) erfolgte. Als Ergebnis wurde die Ausführungsdauer
des JobServers gemessen. Tabelle 7.2 zeigt die Ergebnisse. Man erkennt, dass die
Ausführungszeit mit der Versuchnummer 3 mit fünf Rechnern deutlich länger war,
als die der Versuchnummer 2 mit vier Rechnern. Zu erklären ist dies damit, dass
in Versuch 3 der Rechner PC3 hinzukam. Die Ausführungszeit des JobServers
erhöhte sich durch die relativ geringe Leistung des Rechners, da dieser auf das
Ergebnis von PC3 warten musste. Die Konsequenz dieser Messung bestand in der
Überarbeitung des Verteilungsalgorithmus. So werden jetzt nach der Verteilung
aller Tasks an die ExecutionNodes freie Computer mit der Berechnung von bereits
verteilten Aufgaben beauftragt, die sich noch in der Bearbeitung befinden. Der
erste Rechner, der eine solch mehrfach verteilte Aufgabe fertig stellt, darf diese
dann an den JobServer übertragen. So können leistungsschwache Rechner gegen
Ende der Laufzeit kompensiert werden. Versuch Nummer 4 entstand nach der
Überarbeitung des entsprechenden Algorithmus. Deutlich erkennt man die nun
kürzere Laufzeit.
7.2 Test 2: Aufwandssteigerung
Dieser Versuch untersuchte die Laufzeiten der JobServer bei unterschiedlichen
Mengen von Teilaufgaben und einer konstanten Anzahl von ExecutionNodes. Als
Ergebnis war ein annährend linearer Anstieg der Laufzeit bei zunehmender Aufgabenmenge festzustellen. Danach brachte eine Regessionsanalyse die Messdaten in
einen gemeinsamen Bezug. Tabelle 7.3 zeigt die Resultate der Messungen, welche
in Abbildung 7.2 graphisch dargestellt sind. Alle Jobs wurden dreimal wiederholt,
Versuch Nr.
Teilnehmer
Zeit [mm:ss]
1
1
08:17
2
4
02:56
3
5
4:04
Tabelle 7.2: Scheduler update
4
4
03:16
7.2. Test 2: Aufwandssteigerung
91
die Ergebnisse gemittelt und jeweils die mittlere Abweichung berechnet.
Teilnehmer
Summe Tasks
Messungen
[mm:ss]
Mittelwert
mittl. Abw.
PC1, PC3, PC4, PC5, PC7
5
10
25
50
01:42 03:16 07:07 13:28
01:43 03:17 07:09 13:30
01:40 02:36 07:04 13:25
01:42 03:03 07:07 13:28
00:01 00:18 00:02 00:02
75
21:30
21:02
18:14
20:15
01:21
100
26:07
26:15
26:03
26:08
00:04
Tabelle 7.3: Aufwand zur Zeit bei gleicher Kapazität
Zur Untersuchung der erhobenen Messdaten stand sodann die Durchführung einer
linearen Korrelations- und Regressionsanalyse an, da ein linearer Zusammenhang
zu vermuten war. Anhand dieser Methoden kann man nämlich den funktionalen
Zusammenhang von Messdaten in Bezug auf ihre Koordinaten x und y bewerten.
Der Korrelationskoeffizient r gibt hierbei die Wahrscheinlichkeit eines Funktionalen
Zusammenhangs wieder. Der Wertebereich geht über −1 ≤ r ≤ 1. Ist |r| gleich 1,
so besteht ein funktionaler Zusammenhang. Nähert dieser Wert sich 1, so wird der
Zusammenhang wahrscheinlicher. Bei 0 besteht kein Zusammenhang. Die lineare
Regressionsgleichung berechnet die angenäherten Werte für die Steigung a und den
Schnittpunkt der y-Achse b der Geradegleichung y = ax + b. Einen Einstieg in die
Thematik bietet [Huber, 2006]. Formel 7.2 zeigt die Gleichung von r, Formel 7.3
und 7.4 beschreiben die Berechnung von a und b.
P
P
xy − n1 ( x) ( y)
r=q P
P P 2 1 P 2
y − n ( y)
x2 − n1 ( x)2
P
a=
P
b=
P
xy − (
P 2
x −
P
P
x)( y)
n
P
( x)2
n
(7.2)
y−b
n
P
x
(7.3)
(7.4)
Die Anwendung dieser Formeln auf die gemittelten Werte brachte nun folgendes
92
7.2. Test 2: Aufwandssteigerung
Ergebnis. Der Korrelationskoeffizient r ist gleich 0,99 und sagt somit eine sehr
hohe Wahrscheinlichkeit eines funktionalen Zusammenhangs aus. Die Steigung a
beträgt 15,52 und der y-Achsenschnittpunkt b ist gleich 31,7.
Abbildung 7.2: Laufzeit bei variabler Menge von Task
Die hieraus resultierende Gerade ist gleich der oben beschriebenen Formel 7.1.
Folglich konnten mit ihrer Hilfe die mittlere Ausführungsdauer tm und der Initialisierungsaufwand ti ermittelt werden. Diesen Zusammenhang zeigt Gleichungsfolge
7.5 bis 7.10.
f (n) = an + b
(7.5)
f (n) = 15, 52n + 31, 7
n
tp = tm ·
+ ti
m
tp = f (n)
(7.6)
tm = a · m = 15, 52 · 5 = 77, 6
(7.7)
(7.8)
(7.9)
7.3. Test 3: Leistungssteigerung
93
ti = b = 31, 7
(7.10)
Die Dauer von tm betrug also gleich 77,6 Sekunden und die von ti war gleich
31,7 Sekunden. Die Gleichsetzung mit der Geradengleichung bot sich deshalb an,
weil m für diesen Test konstant blieb und die Gleichung 7.1 daher ebenfalls eine
Gerade beschrieb. Abbildung 7.2 stellt die Messwerte und den Verlauf der Geraden
f graphisch dar.
7.3 Test 3: Leistungssteigerung
Der Test bezweckte die Analyse des Systemverhaltens bei einer unterschiedlichen
Anzahl von ExecutionNodes. Zur Messung diente jeweils ein JobServer mit dem
gleichen, 50 Tasks beinhaltenden JobPackage. Für jeden Test wurde ein Rechner
aus Tabelle 7.1 hinzugeschaltet. Eine Ausnahme war hierbei PC3. Dieser blieb
ungenutzt, um ein möglichst homogenes Rechnernetz zu erhalten. Die Ergebnisse zeigt Tabelle 7.4, welche in Abbildung 7.3 visualisiert sind. Mit zunehmender
Rechnerzahl nähert sich die Funktion in Form einer Hyperbel einem Grenzwert
an. Letzterer ist dann erreicht, wenn m = n ist, also wenn jeder Rechner nur eine Aufgabe zugewiesen bekommt. Der besagte Grenzwert und damit die kürzeste
Rechenzeit liegt dann bei theoretischen tm + ti . Aus dieser Beobachtung heraus resultierte die Feststellung, dass die Steigung der Hyperbel ein Maß der Wirksamkeit
des Systems ist. Anhand der ersten Ableitung der Hyperbelfunktion kann somit die
benötigte Rechneranzahl für eine gewünschte Funktionssteigung ermittelt werden.
Teilnehmer
Messungen
[mm:ss]
Mittelwert
mittl. Abw.
1
59:47
62:15
61:01
01:14
2
28:36
30:18
29:27
00:51
3
19:27
18:57
19:17
00:20
4
15:11
15:38
15:24
00:14
5
13:28
13:02
13:15
00:13
6
11:34
11:23
11:28
00:05
7
10:08
10:20
10:14
00:06
Tabelle 7.4: Leistung zur Zeit bei gleichem Aufwand
Da man bereits wegen der Messdaten einen hyperbelartigen Abfall vermuten konn-
94
7.3. Test 3: Leistungssteigerung
te, und die Gleichung 7.1 bei konstanter Aufgabenanzahl n und variabler Rechneranzahl m eben einen solchen Verlauf beschreibt, konnte aufgrund der Messwerte
die mittlere Laufzeit tm und der Initialisierungsaufwand ti berechnet werden. Zu
diesem Zweck wurde die Gleichung nach ti aufgelöst, für ti die gegenüberliegende
Seite der Gleichung eingesetzt und nach tm aufgelöst. Dies ermöglicht mit Hilfe
zweier Messpunkte eine Bestimmung von ti und tm . Gleichungsfolge 7.11 bis 7.14
veranschaulicht dies.
tp1 − tm1
n
+ ti
m
n
= tp − tm
m
n2
= tp2 − tm2
m2
tp2 − tp1
= n1
n2
−m
m1
2
tp = tm ·
(7.11)
ti
(7.12)
n1
m1
tm
(7.13)
(7.14)
Mit Hilfe dieser Gleichungen wurde für jede mögliche Zweierkombination der Messwerte tm und ti berechnet und sodann die Ergebnisse gemittelt. Diese ergaben für
tm = 64, 38 Sekunden und für ti = 124, 61 Sekunden. Die Funktion g in Abbildung
7.3 stellt Gleichung 7.1 mit diesen Werten und n = 50 dar. Deutlich sieht man die
enge Nachbarschaft zu den Messpunkten.
Wie die Grafik verdeutlicht, nimmt die Effektivität des Systems, also die negative
Steigung der Hyperbel, mit jedem hinzugefügten Rechner ab. Für einen ressourcenschonenden Umgang mit den ExecutionNodes kann es daher sinnvoll sein, die
Steigung der Hyperbel einen definierten Wert nicht überschreiten zu lassen, also
dem Job eine optimierte Menge von Nodes zuzuweisen. Um diese optimale Menge
an ExecutionNodes zu errechnen, ermittelt man die Steigung der Hyperbelfunktion
anhand der ersten Ableitung. Durch die Umformung nach m kann so die benötigte Menge von Rechnern für die Steigung t0p ermessen werden. Die Funktionsreihe
7.15 bis 7.17 stellt diese Umformung dar. In Abbildung 7.3 zeigt Funktion g 0 die
Ableitung von g.
7.4. Beurteilung und Fehleranalyse
n
+ ti
m
tm n
g 0 (m) = t0p = − 2
m
s
tm n
m =
− 0
tp
g(m) = t0p = tm ·
95
(7.15)
(7.16)
(7.17)
Abbildung 7.3: Laufzeit bei variabler Menge von ExecutionNodes
7.4 Beurteilung und Fehleranalyse
Das System ist so konzipiert, dass mit ihm eine große Menge von eventuell mehreren tausend Rechnern verwaltet werden können, die über verhältnismäßig schmale
Bandbreiten miteinander vernetzt sind.
96
7.4. Beurteilung und Fehleranalyse
Aufgrund der für diese Diplomarbeit zur Verfügung stehenden Ressourcen entsprach das verwendete Rechnernetzwerk allerdings weder in der Quantität der
Rechner noch in der Qualität des Netzwerks den geplanten Kriterien. Die hier
geschilderten Untersuchungen sind somit nicht direkt auf das vorgesehene Anwendungsgebiet zu übertragen. Allerdings geben sie bereits wichtige Informationen
über das Zusammenspiel des Job-Aufwands in Relation zur Rechneranzahl, Ausführungsdauer und Effektivität.
Die Rechner im Testnetzwerk waren auch nicht absolut gleichwertig. Sie unterschieden sich teilweise in der Taktfrequenz sowie in der Größe des Arbeitsspeichers. Hinzu kam, dass die hierfür benutzten Computer Work- und Teststations
der Mitarbeiter der Firma Goober waren, die während der laufenden Tests ihre
Rechner weiter verwendeten und somit einen unbekannten Störfaktor in das System einbrachten.
Bei den Tests fiel auf, dass es zum teilweisen Ausfall des Nutzdatenkanals bei der
Ausführung von Jobs mit über 150 Tasks kam. Trotz der korrekten Übertragung
der Metadaten wurden die in ihnen beschriebenen Daten nicht übertragen, weil
die Anzahl der parallel zur Verfügung gestellten Metadaten eines BitTorrent Peers
einem Limit unterstellt waren.
Die Ursache hierfür konnte nicht genau lokalisiert werden. Der BitTorrent Quellcode wies diesbezüglich keine Beschränkung auf. BitTorrent verwendet für jede
Torrentdatei einen eigenen Python-Thread. Die Vermutung, dass die Anzahl der
Threads somit auf eine in Python definierte Beschränkung stieß, konnte nicht bestätigt werden, weil sonst der TorrentServer auch keine weiteren Verbindungen
hätte entgegen nehmen können, da diese ebenfalls in einem Thread starteten. Ein
möglicher Lösungsansatz wäre, die Torrents in Queues zu verwalten und nur die
aktuell benötigten Metadateien an BitTorrent weiterzureichen. Dies sollte dann
zudem unnötige Systembelastungen durch wartende Nutzdatenübertragungen verringern.
7.4. Beurteilung und Fehleranalyse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
97
<?xml version=" 1 . 0 " e n c o d i n g="ISO−8859−1" ?>
< !DOCTYPE j o b SYSTEM " m e t a i n f o . dtd ">
<j o b i d=" 0001 ">
<p o l i c y modulid=" 1" p r i o r i t y l e v e l="1" minnodeamount="5"
maxnodeamount=" 5" f a v o u r e d s t a r t="−1" f a v o u r e d e n d="−1"
owner=" t e s t u s e r " />
<modul i d= ’ 1 ’>
<data i d= ’ 1−2 ’ path= ’ . / 7 za /7 za . exe ’ />
<data i d= ’ 1−25 ’ path= ’ . / y a f r a y / y a f r a y . exe ’ />
<data i d= ’ 1−26 ’ path= ’ . / y a f r a y / y a f r a y . i c o ’ />
<data i d= ’ 1−27 ’ path= ’ . / y a f r a y / y a f r a y c o r e . d l l ’ />
<data i d= ’ 1−28 ’ path= ’ . / y a f r a y / y a f r a y p l u g i n . d l l ’ />
...
</modul>
<t a s k i d= ’ 0 ’ modul= ’ 1 ’>
<data i d= ’ 1−29 ’ path= ’ a n i 0 . 7 z ’ />
<data i d= ’ 1−3 ’ path= ’ sky . j p g ’ />
<command i d= ’ 0001 ’ data= ’ 1−2 ’ param= ’ x␣−y␣{1−29} ’ />
<command i d= ’ 0003 ’ data= ’ 1−25 ’ param= ’−p␣ . / y a f r a y ␣ a n i 0 1 0 . xml
’ />
<command i d= ’ 0004 ’ data= ’ 1−2 ’ param= ’ a␣ result_0_ {1−29}␣
a n i 0 1 0 . t g a ’ />
<command i d= ’ 0005 ’ cmd= ’ d e l e t e ’ param= ’ a n i 0 1 0 . t g a ’ />
<command i d= ’ 0006 ’ cmd= ’ d e l e t e ’ param= ’ a n i 0 1 0 . xml ’ />
<command i d= ’ 0007 ’ cmd= ’ r e s u l t ’ param= ’ result_0_ {1−29} ’ />
</ t a s k>
...
</ j o b>
Abbildung 7.4: Testszenario manifest.xml
98
8 Fazit und Ausblick
Der erste Teil der Arbeit diente dem Verschaffen eines kritischen Überblicks über
den aktuellen Stand der Grid- und P2P-Technologien. Die hieraus gewonnenen
Erkenntnisse flossen in die Konzeption des im Rahmen dieser Diplomarbeit konstruierten Systems ein. Dieses befähigt einen Netzwerkverbund von Computern
zur gemeinsamen Berechnung von parallelisierbaren Aufgaben beliebiger Natur.
Dabei ist die benötigte Software, welche zur Lösung spezieller Aufgaben gebraucht
wird, unabhängig von diesem System und kann gleich der Software sein, wie sie
auch zur seriellen Bearbeitung auf einem einzelnen Rechner verwendet wird.
Nach erfolgter Implementierung des Systems wurden anhand eines Testszenarios
mit verschieden parametrisierten Aufgaben die Lauffähigkeit und das Verhalten
des Grids untersucht. Unter Verwendung der hieraus gesammelten Daten konnten
Formulierungen zur Prognostizierung und Optimierung der Laufzeiten von Aufgabenpaketen erstellt werden.
Der zeitliche Rahmen einer Diplomarbeit steckte die Grenzen für die hier entwickelte Software. Im Folgenden soll noch ein Ausblick auf mögliche Erweiterungen
des Systems gegeben werden.
JobServer erlauben, nur parallelisierbare Aufgaben zu einem Job zusammenzuschließen. Sinnvoll wäre hier eine Erweitung zur Einbindung sequentieller, von einander abhängiger Arbeitsschritte. Hierzu müssten die auf den JobServer geladenen
Resultate Auslöser zur Generierung neuer Teilaufgaben werden. Die Einsatzmöglichkeiten des Grids würden somit stark erweitert.
99
Weitere Vorteile kann die Umstellung des Metadatenkanals auf Web Service Technologien bringen. Diese haben weniger Probleme bei der Überwindung von NATs
und Firewalls und sind auch im Bedarfsfalle leichterer auszubauen.
Das Thema Sicherheit bietet ausgiebig Potential für notwendige Erweitungen, um
einen erfolgreichen Einsatz außerhalb eines Testlabors zu ermöglichen. So wäre zum
einen die komplette Datenübertragung zu verschlüsseln. Zum anderen müssten Resultate auf ihre Authenzität geprüft werden. Ein Ansatz wäre hier beispielsweise
die Mehrfachberechnung von Aufgaben. Des Weiteren stellen die Module, welche
auf den ExecutionNodes ausgeführt werden, ein nicht zu vernachlässigendes Sicherheitsrisiko dar. Möglich wäre hier eine Zertifikation durch eine Trustcenter Instanz.
Nur zertifizierte Module würden dann auf den ExecutionNodes ausgeführt.
100
Literatur
[Barth und Schüll 2006]
Barth, Thomas ; Schüll, Anke: Grid Computing. Konzepte, Technologien, Anwendungen. 1. Vieweg, März 2006. – ISBN
3834800333
[Berstis 2002] Berstis, Viktors: Fundamentals of Grid Computing. IBM Redbook. November 2002. – URL http://www.redbooks.ibm.com/redpapers/
pdfs/redp3613.pdf
[Boyvat 2005] Boyvat, Baris: Kenosis: A P2P RPC system using the Kademlia
DHT / Telecommunications Software and Multimedia Laboratory. April 2005.
– Forschungsbericht
[Chervenak u. a. 2001] Chervenak, Ann ; Foster, Ian ; Kesselman, Carl ;
Salisbury, Charles ; Tuecke, Steven: The Data Grid:Towards an Architecture
for the Distributed Management and Analysis of Large Scientic Datasets. In:
Journal of Network and Computer Applications 23 (2001), Nr. 3, S. 187–200. –
URL http://www.globus.org/alliance/publications/papers/JNCApaper.
pdf
[Condor 2006] Condor: Condor Version 6.8.1 Manual. University of WisconsinMadison (Veranst.), September 2006. – URL http://www.cs.wisc.edu/
condor/manual/v6.8.1/condor-V6_8_1-Manual.pdf
[Ding u. a. 2003] Ding, Choon H. ; Nutanong, Sarana ; Buyya, Rajkumar:
P2P Networks for Content Sharing / Department of Computer Science and
Software Engineering. Dezember 2003. – Forschungsbericht
101
[Eastlake und Jones 2001] Eastlake, D. ; Jones, P.: US Secure Hash Algorithm
1 (SHA1). Internet Engineering Task Force: RFC 3174. September 2001. – URL
http://www.ietf.org/rfc/rfc3174.txt
[EGA 2004]
EGA:
Neue Allianz treibt Einführung von Grid Computing in Unternehmen voran. Enterprise Grid Alliance: Pressemitteilung.
April 2004. – URL http://www.gridalliance.org/en/news/PressReleases/
DE-Enterprise_Grid_Alliance9.pdf
[Feng u. a. 2005] Feng, Jun ; Cui, Lingling ; Wasson, Glenn ; Humphrey, Marty: Toward Seamless Grid Data Access: Design and Implementation of GridFTP
on .NET. URL http://www.cs.virginia.edu/~humphrey/papers/GridFTP_
on_dotNET.pdf, November 2005. – Forschungsbericht
[Fielding u. a. 1999] Fielding, R. ; Gettys, J. ; Mogul, J. ; Frystyk, H. ;
Masinter, L. ; Leach, P. ; Berners-Lee, T.: Hypertext Transfer Protocol:
HTTP/1.1. Internet Engineering Task Force: RFC 2616. June 1999. – URL
http://www.ietf.org/rfc/rfc2616.txt
[Foster und Iamnitchi 2003] Foster, I. ; Iamnitchi, A.: On Death, Taxes, and
the Convergence of Peer-to-Peer and Grid Computing. In: 2nd International
Workshop on Peer-to-Peer Systems (IPTPS’03). Berkeley, CA, Februar 2003
[Foster 2002] Foster, Ian: What is the Grid? A Three Point Checklist. In: Grid
Today 1 (2002), Juli, Nr. 6. – URL http://www-fp.mcs.anl.gov/~foster/
Articles/WhatIsTheGrid.pdf
[Foster und Kesselman 2003] Foster, Ian ; Kesselman, Carl: The Grid. Blueprint for a New Computing Infrastructure. 2. Morgan Kaufmann Publishers,
November 2003. – ISBN 1558609334
[Foster u. a. 2002] Foster, Ian ; Kesselman, Carl ; Nick, Jeffrey M. ; Tuecke, Steven: The Physiology of the Grid. In: Open Grid Service Infrastructure
WG (2002), Juni. – URL http://www.globus.org/alliance/publications/
papers/ogsa.pdf
102
[Foster u. a. 2001] Foster, Ian ; Kesselman, Carl ; Tuecke, Steven: The
Anatomy of the Grid. In: International Journal of High Performance Computing
Applications 15 (2001), August, Nr. 3, S. 200–222. – URL http://www.globus.
org/alliance/publications/papers/anatomy.pdf
[Harwood und Tanin 2003] Harwood, Aaron ; Tanin, Egemen: Hashing Spatial Content over Peer-to-Peer Networks. In: Australian Telecommunications,
Networks and Applications Conference (CD-ROM), ATNAC, 2003. – URL
http://www.cs.mu.oz.au/~aharwood/online/HarwoodTanin-2003d.pdf
[Hauswirth und Dustdar 2005] Hauswirth, Manfred ; Dustdar, Schahram:
Peer-to-Peer: Grundlagen und Architektur. In: Datenbank-Spektrum 5 (2005),
Nr. 13, S. 5–13
[Heckmann und Bock 2002] Heckmann, Oliver ; Bock, Axel: The eDonkey
2000 Protocol / Department of Electrical Engineering & Information Technology. Dezember 2002. – Forschungsbericht
[Hämmerle 2004] Hämmerle, Lukas: P2P Population Tracking and Traffic Characterization of Current P2P File-sharing Systems, Eidgenössische Technische
Hochschule Zürich, Diplomarbeit, 2004
[Liming und Foster 2005] Liming, Lee ; Foster, Ian: GT4: What’s in it for
you? Mai 2005. – URL http://www.globus.org/alliance/publications/
clusterworld/0505Grid.pdf. – Das Magazin „Gridworld“ stellte vor der Veröffentlichung den Betrieb ein.
[Martelli u. a. 2005] Martelli, Alex ; Ravenscroft, Anna M. ; Ascher,
David: Python Cookbook. 2. O’Reilly, April 2005. – ISBN 0596007973
[Meyer 2005] Meyer, Angela: Grid: Visionen vom Computer aus der Steckdose.
In: Ct́ 23 (2005), November, S. 96–97
[Pilgrim 2004] Pilgrim, Mark: Dive into Python. 2. Apress, Juli 2004. – URL
http://diveintopython.org/. – ISBN 1590593561
103
[Sun Microsystems, Inc. 2005a] Sun Microsystems, Inc. (Veranst.): N1 Grid
Engine 6 Administration Guide. 817.5677.20. Mai 2005. – URL http://docs.
sun.com/app/docs/doc/817-5677?a=load
[Sun Microsystems, Inc. 2005b] Sun Microsystems, Inc. (Veranst.): N1 Grid
Engine 6 Installation Guide. 817.6118.20. Mai 2005. – URL http://docs.sun.
com/app/docs/doc/817-6118?a=load
[Sun Microsystems, Inc. 2005c] Sun Microsystems, Inc. (Veranst.): N1 Grid
Engine 6 Release Notes. 817.5678.20. Mai 2005. – URL http://docs.sun.
com/app/docs/doc/817-5678?a=load
[Sun Microsystems, Inc. 2005d] Sun Microsystems, Inc. (Veranst.): N1 Grid
Engine 6 Users Guide. 817.6117.20. Mai 2005. – URL http://docs.sun.com/
app/docs/doc/817-6117?a=load
[Thain u. a. 2002] Thain, Douglas ; Tannenbaum, Todd ; Livny, Miron: Condor and the Grid. In: Berman, Fran (Hrsg.) ; Fox, Geoffrey (Hrsg.) ; Hey, Tony
(Hrsg.): Grid Computing: Making the Global Infrastructure a Reality. John Wiley & Sons Inc., Dezember 2002. – URL http://media.wiley.com/product_
data/excerpt/90/04708531/0470853190.pdf
104
Weblinks
[Bart 2003] Bart, Jacob: Grid computing: What are the key components? Juni 2003. – URL http://www-128.ibm.com/developerworks/grid/library/
gr-overview/. – Zugriffsdatum: 13. Oktober 2006
[BitTorrent.org 2006a] BitTorrent.org: BitTorrent Protocol. Protocol Specifications v1.0, 2006. – URL http://www.bittorrent.org/protocol.html. –
Zugriffsdatum: 1. August 2006
[BitTorrent.org 2006b] BitTorrent.org: DHT Protocol, 2006. – URL http://
www.bittorrent.org/Draft_DHT_protocol.html. – Zugriffsdatum: 1. August
2006
[BitTorrent.org 2006c] BitTorrent.org: Fast Extension, 2006. – URL http:
//www.bittorrent.org/fast_extensions.html. – Zugriffsdatum: 1. August
2006
[Cohen 2003] Cohen, Bram: Incentives Build Robustness in BitTorrent, Mai
2003. – URL http://www.bittorrent.org/bittorrentecon.pdf. – Zugriffsdatum: 1. August 2006
[FAS 1999] FAS: Semi-Automatic Ground Environment (SAGE). Juni 1999. –
URL http://www.fas.org/nuke/guide/usa/airdef/sage.htm. – Zugriffsdatum: 14. Oktober 2006
[Huber 2006]
Huber, Prof. Dr. H.:
Theorie: Lineare Regression.
2006. – URL http://www.chemie.unibas.ch/~huber/Statistik/LinReg/
LRTheorie/theorie.html. – Zugriffsdatum: 5. Dezember 2006
105
[Merkey 2004] Merkey, Phil: Beowulf History. 2004. – URL http://www.
beowulf.org/overview/history.html. – Zugriffsdatum: 14. Oktober 2006
[MetaMachine 2003] MetaMachine: How Overnet works. 2003. – URL http:
//www.edonkey2000.com/documentation/how_on.html. – Zugriffsdatum: 6.
Oktober 2006
[Norberg 2005] Norberg, Arvid: LibtorrentDocs. Rasterbar Software (Veranst.), 2005. – URL http://www.rasterbar.com/products/libtorrent/
docs.html. – Zugriffsdatum: 6. Oktober 2006
[Reiser und Kapitza 2003] Reiser, Hans P. ; Kapitza, Rüdiger: Verteilte HashTabellen. 2003. – URL http://www4.informatik.uni-erlangen.de/Lehre/
WS03/V_VA/Skript/VA-6b.pdf. – Zugriffsdatum: 6. Oktober 2006
[Sun Microsystems, Inc. 2002] Sun Microsystems, Inc.: History of the Grid.
2002. – URL http://nz.sun.com/2002-0708/grid/history.html. – Zugriffsdatum: 15. Oktober 2006
[Surveyer 2002] Surveyer, Jacques: Grid computing uses spare CPU power. July 2002. – URL http://www.networkworld.com/news/tech/2002/0715tech.
html. – Zugriffsdatum: 13. Oktober 2006
[Thompson und Clavenna 2003] Thompson, Rick ; Clavenna, Scott: Grid
Networking. Mai 2003. – URL http://www.lightreading.com/document.asp?
doc_id=33405&print=true. – Zugriffsdatum: 6. Oktober 2006
[University of California 2006] University of California: Creating BOINC
projects. 2006. – URL http://boinc.berkeley.edu/create_project.php. –
Zugriffsdatum: 15. Oktober 2006
106
Inhalt der CD-ROM
Inhalt
/Diplomarbeit.pdf
/readme.pdf
/src
/doc
/jobs
Beschreibung
Datei, enthält die schriftliche Ausarbeitung der Diplomarbeit.
Datei, nennt Informationen zum Inhalt der CD-ROM
und dessen Verwendung.
Verzeichnis, enthält den Python Quelltext des Systems.
Verzeichnis, mittels pydoc generierte HTML Quelltextdokumentation.
Verzeichnis, JobPackackges der in Kapitel 7 durchgeführten Tests.
107
Glossar
ASCII . . . . . . . . . . . . . . American Standard Code for Information Interchange. 7
Bit Zeichenkodierung.
Batch Job . . . . . . . . . . Dies ist ein Synonym für Stapelverarbeitung. Aufgaben werden in eine Liste aufgenommen und sequentiell abgearbeitet.
BitTorrent . . . . . . . . . . Protokoll zum parallelen Datenaustausch über beliebig viele Rechner.
Chunk . . . . . . . . . . . . . . Dies sind die Teilelemente eines Datums. Ihre Größe und
Reihenfolge ist fest definiert. BitTorrent Peers übertragen
die zu verteilenden Daten in Chunks. Die Summe dieser
Chunks ergibt das Datum.
Cluster . . . . . . . . . . . . . Der Zusammenschluss mehrerer Computer zur Steigerung
der Leistung oder der Ausfallsicherheit.
Condor . . . . . . . . . . . . . Grid Software der Universität von Wisconsin
COTS . . . . . . . . . . . . . . Commodity Off The Shelf. Zu deutsch: Massenware aus
dem Regal.
Dictionary . . . . . . . . . . Datenstruktur im BitTorrent Protokoll, über die man anhand eines Schlüsselswertes auf einen darauf verwiesenen
Wert zugreifen kann. Vergleichbar mit Dictionaries in Python oder HashMaps in Java.
ExecutingNode . . . . . Ausführende Einheit, bekommt Aufgaben vom JobServer
zugewiesen, bearbeitet diese und stellt das Ergebnis dem
JobServer zur Verfügung.
Globus . . . . . . . . . . . . . Vereinigung zur Entwicklung von Gridtechnologie, welche
108
goober . . . . . . . . . . . . . .
Grid . . . . . . . . . . . . . . . .
GridManager . . . . . . .
Handshake . . . . . . . . . .
Hashfunktionen . . . . .
HTC . . . . . . . . . . . . . . .
HTTP . . . . . . . . . . . . . .
JobServer . . . . . . . . . . .
List . . . . . . . . . . . . . . . . .
Load Balancing . . . . .
Metadaten . . . . . . . . . .
NAT . . . . . . . . . . . . . . . .
Hersteller des Globus Toolkits sind.
Neuer, propäritärer, Instant Messenger mit VOIP Client
und vielen weiteren Features.
Oberbegriff für vernetzte Rechner, deren Kommunikation
und Zusammenarbeit über den reinen Datenaustausch hinausgehen.
Zentrales Resourcenmanagement. Zur Verwaltung von JobServern und ExecutionNodes.
Verfahren zwischen Kommunikationspartnern im Datenverkehr, um sich initial zu synchronisieren.
Berechnung, die aus einer Quelle beliebiger Größe ein eindeutiges Ergebnis definierter Größe erzeugt.
High Throughput Computing. Steht für möglichst schnelles
berechnen von Aufgaben auf langen Zeiträumen. Latenzzeiten spielen eine untergeordnete Rolle.
Hypertext Transfer Protocol. Dient zur Übertragung von
Daten über ein Netzwerk
Zentrales Aufgabenmanagement. Reserviert beim GridManager ExecutingNodes. Weist diesen Teilaufgaben zur Bearbeitung zu. Verwaltet die Daten der Aufgaben und der
Ergebnisse.
Datenstruktur im BitTorrent Protokoll, über die man eine
Sequenz beliebig vieler Datensätze hinterlegen kann. Vergleichbar mit den Listen von Python oder den Maps von
Java.
Durch geschicktes Routen im Netzwerk wird versucht, die
Netzlast über das Netz so zu verteilen, dass es zu keinen
Engpässen in der verfügbaren Bandbreite kommt.
Beschreibende Daten, die Informationen, wie Ort, Name
oder Größe der eigentlichen Daten vorhalten.
Network Address Translation. Verbindet zwei Netzwerke
mittels Ersetzung der Packetadressen durch Adressen des
Zielnetzes.
109
Node . . . . . . . . . . . . . . . Knotenpunkt in einem Grid. Jeder Node stellt einen eigenen
Rechner dar.
Offset . . . . . . . . . . . . . . . Im Zusammenhang des Datenzugriffs steht dieser Begriff
für die Distanz zwischen Anfang und dem Zugriffspunkt
einer Datei.
Peer . . . . . . . . . . . . . . . . Gleichgestellte Computer in einem Netzwerk, in dem jeder einzelne sowohl Server- als auch Client-Aufgaben wahrnimmt.
Proxyserver . . . . . . . . . Ein P. wird stellvertretend mit der Beschaffung von Daten
beauftragt, die dieser an den Auftraggeber überträgt.
Resource Balancing . Durch geschickte Planung wird versucht, eine Ressource,
wie z.B. ein Computercluster, homogen auszunutzen und
Lasten gleichmäßig zu verteilen.
Round Robin . . . . . . . Verfahren zur Ablaufsteuerung von Arbeitsschritten. Alle
Aufgaben bekommen nacheinander einen definierten Zeitschlitz für die Bearbeitung zur Verfügung gestellt.
SHA1 . . . . . . . . . . . . . . . Secure Hash Algorithm. Hashfunktion zum Erstellen von
160 Bit langen Hashwerten aus Quellen beliebiger Größe.
Subversion . . . . . . . . . . Freie Software zu Versionierung von digitalen Entwicklungsständen.
Virtual Organisation Geographie- als auch organisationsunabhängiger Zusammenschluss von beliebigen Computer, Netzwerken u.a. Ressourcen zu einer gemeinsamen Arbeitsgruppe.
WebDAV . . . . . . . . . . . Web-based Distributed Authoring and Versioning. Erweiterung des HTTP Protokolls um zusätzliche Funktionen im
Dateitransfer.
110
Stichwortverzeichnis
BitTorrent, 36, 37, 70
Intra-Grid, 10
Chunk, 32
Cluster, 10
Communication Package, 65
Computional Grid, 10
Condor, 24
Condor-C, 26
Condor-G, 26
JobScheduler, 57
JobServer, 52
Data Grid, 10
Downloader, 37
MainHook, 55
NodeManager, 57
OGSA, 19
Open Grid Forum, 18
OpenFT, 35
Python, 64
eDonkey2000, 34
ExecutionNode, 52
Extra-Grid, 10
FastTrack, 35
Globus, 19
Globus Toolkit, 21
Gnutella, 35
Grid Service, 19
GridManager, 51
Handshake, 47
IdleHook, 55
Inter-Grid, 11
Raytracing, 88
Scavenging Grid, 10
SubHook, 55
Sun N1 Grid Engine, 22
Torrent Dateien, 39
Tracker, 38
Verteilte Hashtabellen, 33

Similar documents