Software as a Service Cloud Computing und aktuelle Entwicklungen Seminararbeit Thema: Das MapReduce-Framework Betreuer: Prof. Dr. Klaus Küspert Dipl.-Inf. Andreas Göbel Nicky Kuhnt Friedrich-Schiller-Universität Jena Studiengang: Informatik, Diplom Matrikel: 96577 Gliederung 1. Einführung……………………………………………………………...……..………..2 2. Motivation…………………………………………………………………….…..……2 3. MapReduce Verfahren……………………………………………….…….…………..3 3.1. Einführung……………………………………………………...…….…………...3 3.2. Definition………………………………………………..…………….…………..3 3.3. Map-Phase…………………………………………………………….…………..4 3.4. Shuffle-Phase……………………………………………….……….…………….4 3.5. Reduce-Phase………………………………………………..…….………………5 3.6. Überblick………………………………………………………………………….6 3.7. Funktionsweise und Fehlerbehandlung……………………………………………7 4. Beispiel………………………………………………………..……….………………7 5. Vergleich mit relationalen Mehrrechner-Datenbanken……………….…………..…...9 6. Hadoop………………………………………………….…………………...………..11 7. HadoopDB…………………………………………………………………………….12 8. Zusammenfassung………………………………………………………………........12 9. Quellen………………………………………………………………………………..13 Bemerkung: Sollte ein Literaturangabe am Ende eines Kapitels stehen, so bezieht sie sich auf das gesamte Kapitel, sonst nur auf den jeweiligen Abschnitt. -1- 1. Einführung Cloud Computing ist heutzutage in aller Munde. Es beschreibt die Verwendung einer Technologie, welche große Berechnungen auf mehreren Computern in einem Netzwerk verteilt. Der Begriff Cloud beschreibt demnach eine Farm von Computern, die sich zu einem Cluster verbinden, was man sich wie eine Wolke vorstellen kann. Bei dieser Technologie werden verschiedenen Komponenten Speicherkapazitäten dynamisch im Netzwerk zur Verfügung gestellt. wie Rechen- oder Ein Aspekt des Cloud Computing ist die parallele Berechnung auf mehreren Computern in der Cloud, worin ein erheblicher Geschwindigkeitsvorteil liegt Ein Ansatz dafür bietet das MapReduce-Framework, welches in dieser Seminararbeit beschrieben und anhand eine Beispiels näher erläutert wird. Desweiteren wird ein Vergleich mit relationalen Mehrrechner-Datenbanksystemen gezogen und eine wichtige Implementierung von MapReduce vorgestellt. [VBM] 2. Motivation Heutzutage werden immer mehr Daten automatisch erfasst. Dies ist beispielsweise bei Aktienkursen, Wetterdaten, Social Networks oder Log-Dateien der Fall. Dies erzeugt riesige Datenmenge, dessen Verarbeitung sich als Herausforderung darstellt. Zwar sind in den letzten Jahren die Speicherkapazitäten der Festplatten enorm angestiegen, die Zugriffszeiten jedoch nicht in diesem Maße. Im Jahr 2000 betrug das durchschnittliche Volumen von Festplatten um die 40 GB mit Zugriffszeiten von rund 32 MB pro Sekunde. Das Auslesen einer solchen Platte dauerte demnach um die 21 Minuten. 2009 hingegen betrug die mittlere Speicherkapazität von Festplatten 1000 GB, also das 25 fache im Vergleich zum Jahr 2000. Die Zugriffszeiten betrugen dabei 125 MB pro Sekunde, was nur ein 4 faches der Zugriffszeiten im Vergleich zum Jahr 2000 darstellt. Demnach benötigte man 135 Minuten zum Auslesen einer derartigen Festplatte. [WIKI] Google gibt zu ihren Verfahren für das Durchsuchen des Webs folgende Beispielrechnung: Im Jahr 20xx gibt es mehr als 1 Billion Websites, wobei jede eine Mindestgröße von 20 kB hat. Das ergibt über 400 TB an zu bearbeitenden Daten. Würde ein Computer das Web „lesen― bräuchte er mit einer Festplatten-Lesegeschwindigkeit von 30-35 MB pro Sekunde rund 4 Monate. Würden allerdings 100.000 Computer diese Aufgabe übernehmen, so wär die Arbeit in weniger als 2 Minuten getan. [CIR07] Dies zeigt, dass das Bearbeiten von Daten im Computercluster viel weniger Zeit in Anspruch nimmt, da die Daten parallel verarbeitet werden können, anstatt sequentiell mit einem Computer. -2- Daher bewältigen Unternehmen wie Google große Datenmengen in Computerclustern durch verteiltes paralleles Rechnen. Durch diese Methode werden mehrere Recheneinheiten mit eigenen Festplatten zu einem sogenannten Cluster verbunden. Desweiteren werden die Daten verteilt gespeichert, also genau auf dem Computer, der die Daten auch bearbeitet. [CIR07] Durch dieses Verfahren soll sich eine deutliche Zeiteinsparung bei der Datenverarbeitung und Zugriffsoperationen ergeben. 3. Das MapReduce Verfahren 3.1 Einführung Um die bereits oben genannten Probleme zu bewältigen, entwickelte Goggle MapReduce, ein Framework um nebenläufige Berechnungen auf Computerclustern durchzuführen. Es wurde durch die Funktionen map und reduce inspiriert, welche in der funktionalen Programmierung häufig verwendet werden. Allerdings weicht die Semantik bei MapReduce davon ab. [LAE07] Das MapReduce-Framework realisiert eine Funktion, welches aus einer Liste von Schlüssel/Werte-Paaren, welche die Eingabeliste darstellen, eine neue Liste von Schlüssel-/WertePaaren berechnet, die Ausgabeliste. Dabei teilt es die zu bearbeitenden Daten in kleine Teile, die sogenannten Blöcke, auf. Diese werden anschließend zur gleichzeitigen Verarbeitung auf unterschiedliche Rechner im Cluster verteilt. Daraus ergibt sich die parallele Verarbeitung der Daten, was zu mehreren Teilergebnissen führt, welche für das Endergebnis wieder zusammengeführt werden sollen, da der Nutzer ein komplettes Endergebnis der Berechnung haben will und nicht mehrere kleine Teilergebnisse. [DG04] Die darunterliegende Architektur und die Verteilung auf Computerclustern soll für den Nutzer transparent sein, sodass er von der Datenaufteilung nichts mitbekommt und auch keinen Einfluss darauf nehmen kann. Das ganze Verfahren ist in mehrere Phasen aufgeteilt, welche im Folgenenden beschrieben werden. 3.2 Definition list(k1,v1) list(k2,v4) Die formale Definition der gesamten Transformation zeigt, dass die Eingabe aus einer Liste von Schlüssel-/Werte-Paaren besteht, welche durch die Bearbeitung die Ausgabeliste, eine neue Liste von Schlüssel-/Werte-Paaren, erstellt. -3- Dabei sind alle Schlüssel vom gleichen Typ und alle sind die entsprechenden Werte vom gleichen Typ. 3.3 Map-Phase Vor Beginn der MapReduce-Funktion, müssen die Eingabedaten, welche in semistrukturierter Form vorliegen, umgewandelt werden. semistrukt. Eingabedaten list(k1,v1) Dies geschieht durch eine sogenannte Input-Phase. Das Ergebnis dieser Phase ist eine Liste von Schlüssel-/Werte-Paaren (SWPaaren), welche als Eingabe für die Map-Funktion, die eine derartige Struktur als Eingabedaten verlangt, dient. Liegt diese Liste vor, wird für jedes einzelne SWPaar die Map-Funktion aufgerufen. (k1,v1) list(k2,v2) Die Map-Funktion erzeugt aus jedem SWPaar eine Liste von SWPaaren, wobei jeder Schlüssel in dieser Liste mehrmals vorkommen kann und genau einen Wert enthält. Jede Map-Funktion ist unabhängig von den anderen und wird auf einen Computer im Cluster aufgerufen. Das heißt, dass die SWPaare parallel und gleichzeitig bearbeitet werden. 3.4 Shuffle-Phase Die Shuffle-Phase ist ein Teil der eigentlichen Map-Berechnung. Diese muss im Gegensatz zur Map-Phase nicht für den jeweiligen Anwendungsfall programmiert werden, da sie funktional stets die gleiche Aufgabe erledigt. list(k2,v2) (k2, list(v2)) -4- Sie erstellt neue SWPaare, was durch Gruppierung der einzelnen Paare durch den Schlüssel geschieht. Das heißt, dass alle Werte, welche ein und demselben Schlüssel enthalten, diesem zugeordnet werden und am Ende dieser Phase jeder Schlüssel nur noch in einem SWPaar vorkommt und die zugehörigen Werten enthält. Das Ergebnis dieser Phase bildet das Zwischenergebnis, welches der Mapper in seinem FileSystem speichert. Betrachtet man alle Map-Berechnungen, inklusiver der Shuffle-Phase, so entstehen mehrere Zwischenergebnisse, welche jeweils auf dem Computer abgespeichert werden, auf dem sie bearbeitet wurden. 3.5 Reduce-Phase (k2, list(v2)) list(v3) Die Reduce-Phase berechnet aus den Zwischenergebnissen der Map-Phase eine Liste von Ergebniswerten. Dabei wird für jedes Zwischenergebnis der Shuffle-Phase eine Reduce-Berechnung unabhängig von den anderen durchgeführt. Dies ergibt wieder eine parallele Bearbeitung der Zwischenergebnisse auf mehreren Computern im Cluster. list(v3) list(v2,k4) Im Anschluss müssen die einzelnen Endergebnisse der Reduce-Berechnungen wieder zu einen einheitlichen Endergebnis zusammengeführt werden. Dabei werden die jeweiligen Werte der Endergebnisse mit ihren Schlüsseln gepaart und ausgegeben. [DG04] -5- 3.6. Überblick Abb. 1: MapReduce-Schema In dem oben abgebildeten Schema sind nochmals alle Phasen der MapReduce-Berechnung dargestellt. Die Eingabedaten werden wie beschrieben in Blöcke aufgeteilt und für jeden Block wird die Map-Berechnung inklusive der Shuffle-Phase durchgeführt. Jedes Zwischenergebnis wird im Speicher abgelegt und zwar auf dem Computer, der Map-Berechnung durchgeführt hat. Anschließend ist zu sehen, dass für jedes Zwischenergebnis die Reduce-Berechnung durchgeführt wird, deren gesamte Ergebnisse als gemeinsames Endergebnis ausgegeben werden. -6- 3.7. Funktionsweise und Fehlerbehandlung Um eine MapReduce-Berechnung mit der oben beschriebenen Funktionsweise durchzuführen müssen die ganzen Knoten, die bei der Ausführung dieser Berechnung beteiligt sind, in irgendeiner Form gemanagt werden. Dies geschieht, indem das Framework zu Beginn einen Computer als Master bestimmt. Dieser ist für die Koordination der restlichen Computer und für die Datenverteilung verantwortlich. Dabei teilt der Master den anderen Computern, welche Worker genannt werden, die entsprechenden Map-Funktionen zu. Während der Berechnung kommuniziert der Master ständig mit den Workern, indem er sie in bestimmten Zeitintervallen anpingt. Dabei überprüft er die Erreichbarkeit der Worker und bekommt in der Antwort jedes Computers den Berechnungsstatus mitgeteilt und die Speicherorte der bearbeitenden Daten. Der Master bestimmt ebenfalls, welche Computer die Reduce-Berechnungen übernehmen und das noch während der Map-Berechnungen. [FIS10] Während der Berechnungen kann es durchaus zu Fehlern kommen. Die kann ein Ausfall oder Fehler in der Hardware eines Rechners oder ein Ausfall des gesamten Netzwerkes sein. In beidem Fällen ist ein bestimmter Teil der Daten nicht erreichbar, da der betroffene Rechner nicht antwortet. Ist ein Worker ausgefallen, so bekommt dies der Master mit, da er jeden Worker periodisch anpingt. Der Master teilt nun die Berechnung, die der ausgefallene Rechner durchgeführt hat, einen anderen Worker zu. Somit ist sichergestellt, dass jede Berechnung terminiert. Ist ein Worker bei einer Map-Berechnung ausgefallen, so muss die gesamte Berechnung neu ausgeführt werden, auch wenn er schon beendet wurde. Dies ist notwendig, da noch nicht alle Reduce-Berechnungen vom Map-Worker gelesen haben. Ist jedoch ein Worker bei einer beendeten Reduce-Berechnung ausgefallen, so muss diese Berechnung nicht neu durchgeführt werden, da die Ergebnisse dieser Berechnungen redundant im FileSystem gesichert sind. [FIS10] 4. Beispiel In diesem Kapitel wird ein Beispiel für die beschriebene Funktionsweise von MapReduce erklärt und vereinfacht dargestellt, welches den jeweiligen Maximalverbrauch eines PKW bei mehreren Testfahrten bestimmt. Die zu bearbeitenden Daten liefert ein System, welches neben den Verbrauchsdaten, die in einem bestimmten Intervall aufgezeichnet werden, auch mehrere Metadaten enthält (Testfahrtnummer, FahrerID, usw.). -7- Wie MapReduce das Verbrauchsmaximum der ermittelten Daten bestimmt, wird im Folgenden dargestellt. 1 6 input output shuffle map 2 3 reduce 4 5 Abb. 2: Verarbeitung exemplarischer Verbrauchsdaten eines PKW mittels MapReduce Als Eingabe dienen in diesem Fall unstrukturierte Verbrauchsdaten (Abb. 2, Feld 1), welche bei den Testfahrten des Fahrzeuges ermittelt wurden. Diese enthalten aller Verbrauchsangaben in 3-stelliger Form (bspw. steht 074 für einen Verbrauch von 7,4l) inklusiver der Uhrzeit, welche in bestimmten Zeitintervallen aufgezeichnet wurde und wichtige Metadaten wie die Nummer der Testfahrt, die Nummer des Testfahrers usw. Die Input-Phase extrahiert aus dieser Eingabe die benötigten Daten, anhand des Byte-Offset (in diesem Fall die Testfahrtnummer, welche hier die ersten 3 Stellen sind). Der Schlüssel in den SWPaaren gibt jeweils die Nummer der Testfahrt an (Abb. 2, Feld 2). Anschließend beginnt die Map-Berechnung, welche aus den SWPaaren der Eingabe derartige neue SWPaare berechnet, die als Wert jeweils eine dreistellige Verbrauchsangabe enthalten (Abb. 2, Feld 3). Direkt im Anschluss wird für jedes berechnete Paar der Map-Phase die Shuffle-Berechnung durchgeführt, welche jeder einzelnen Testfahrt eine Liste von allen Verbrauchsangaben zuordnet (Abb. 2, Feld 4). Diese SWPaare dienen als Zwischenergebnisse. Liegen alle Zwischenergebnisse vor, so wird für jedes einzelne die Reduce-Berechnung durchgeführt. Diese ermittelt in unseren Fall die jeweiligen Verbrauchsmaxima der einzelnen Testfahrten. Die Ergebnislisten enthalten in unserem Fall demnach nur einen einzelnen Wert (Abb. 2, Feld 5). -8- Im Anschluss daran ordnet die Output-Phase jedem Verbrauchsmaxima den Schlüssel zu, mit dem der jeweilige Reduce-Task aufgerufen wird. In unserem Fall ist das die Testfahrtnummer. Die Ergebnisse dieser Phase werden als Endergebnisse ausgegeben und man bekommt das jeweilige Verbrauchsmaxima zu jeder einzelnen Testfahrt zurückgeliefert (Abb. 2, Feld 6). 5. Vergleich mit relationalen Mehrrechnerdatenbanken Dieses Kapitel stellt einen Vergleich von MapReduce und relationalen Mehrrechnerdatenbanken auf und erörtert die Vor- und Nachteile beider Systeme. Da MapReduce auf die Bearbeitung in Computerclustern setzt, muss man sie relationalen Mehrrechnerdatenbanken gegenüberstellen. Dafür gibt es 3 verschiedene Architekturen: Shared Everything – alle Recheneinheiten nutzen einen gemeinsamen Speicher und einen gemeinsamen Multiprozessor Shared-Disk – jede Recheneinheit hat einen eigenen Multiprozessor, aber alle nutzen einen gemeinsamen Speicher Shared-Nothing – jede Recheneinheit hat einen eigenen Multiprozessor und einen eigenen Speicher Allerdings kommen für relationale Mehrrechner-Datenbanksysteme in der Regel ausschließlich High-End-Server zum Einsatz, welche hohe Kosten verursachen. Dabei wird meist die Shared-Disk-Architektur genutzt, teilweise aber auch die Shared-NothingArchitektur unterstützt. Desweiteren arbeiten solche Datenbanksysteme mit einer horizontalen Partitionierung auf mehrere Speicher oder Partitionen. Deshalb müssen die Anfragen partitioniert werden, deren Ergebnisse anschließend wieder zusammengeführt werden müssen, um ein Gesamtergebnis zu erhalten. Bei MapReduce hingegen werden die Daten in Blöcke aufgeteilt, was mit dem SharedNothing-Prinzip vergleichbar ist. Die Struktur bei relationalen Mehrrechner-Datenbanksystemen (MDBs) ist statisch, sodass sie bei Punktabfragen und Änderungsoperationen via SQL einen Vorteil haben. MapReduce hingegen bietet ausschließlich Abfragen. Modifikationen der Daten geschieht durch darunterliegende Strukturen wie beispielsweise dem FileSystem. Allerdings liegt MapReduce vorn, wenn das Schema semistrukturiert ist. Treten bei der Datenverarbeitung Fehler auf, so muss bei relationalen MDBs ein QueryRestart durchgeführt werden. Bei MapReduce wird der Task, der durch einen Rechnerausfall nicht durchgeführt werden kann, durch oben beschriebene Funktionsweise auf einen anderen Rechner übergeben, der -9- diesen Task übernimmt und dessen Daten bearbeitet, wodurch MapReduce einen enormen Geschwindigkeitsvorteil bei dieser Art der Fehlertoleranz besitzt. Die Umgebung bei relationalen MDBs ist homogen, da in der Regel High-End-Hardware in den Servern eingesetzt werden muss, welche hohe Kosten verursachen. Desweiteren ist das DBMS teuer, die Installation und die Konfiguration solcher Systeme komplex, zeit- und damit kostenintensiv. MapReduce hingegen ist auf den Einsatz von Standardhardware optimiert und es kann auf OpenSource-Software zurückgegriffen werden, sodass die Kosten für dieses System gering sind. Die eben beschriebene Gegenüberstellung beider Systeme soll die folgende Tabelle nochmal veranschaulichen. Tabelle 3: Vergleich von MapReduce und relationalen Mehrrechner-Datenbanksystemen Relationale MDBs haben demnach ihre Stärken bei Abfrage- und Änderungsoperationen via SQL, statischem Schemata sowie in ihrer Ausgereiftheit. MapReduce ist für das parallele Verarbeiten enormer Datenmengen geeignet, hat Vorteile in der Struktur, da es eine große Anzahl von semistrukturierten Daten gibt und bei den Kosten. Desweiteren ist es auch schnell aufsetzbar, da, wenn die Hardware-Infrastruktur vorliegt, es ausschließlich von Nöten ist, die Funktionen für MapReduce zu programmieren. [STO10] Allerdings soll MapReduce keine generelle Alternative zu relationalen MDBs sein, sondern nur in speziellen Bereichen wie beispielsweise der Bearbeitung semistrukturierter Daten. - 10 - 6. Hadoop Für MapReduce gibt es bereits einige Implementierungen, wobei Hadoop womöglich die Bedeutendste darstellt. Hadoop ist ein OpenSource-Java-Framework für skalierbare, verteilt arbeitende Datenverarbeitungssysteme. Es basiert auf dem Algorithmus von Googles MapReduce und des Google-FileSystem, da dieses hohen Datenvolumen gerecht wird und sich neue Knoten leicht hinzufügen lassen. [FIS10] Dies ermöglicht riesige Rechenprozesse mit Petabytes an Daten auf Computerclustern, da die Verarbeitung der Daten parallel auf mehreren Computern durchgeführt werden kann. Die Grundlage für Hadoop legte Doug Cutting, indem er MapReduce 2005 für die Suchmaschine der OpenSource-Community Nutch* implementierte. Im Jahr 2006 startete Hadoop als Lucene-Projekt und es wurde am 28. Januar 2008 zum Apache Top-Level-Projekt ernannt. Mittlerweile beherbergt es mehrere Subprojekte. Im Juli 2009 gewann ein Cluster des Hadoop-Framework den Terabyte-Sort-Benchmark, welcher ermittelt, welches System bestimmte Eingabedaten am schnellsten sortiert und speichert. Dies war eine große Besonderheit, das Hadoop sowohl das erste OpenSourceProgramm, als auch das erste Java-Framework war, das diesen Test gewann. Nutzer, welche Hadoop im großen Maße einsetzen, sind u.a. yahoo!, Amazon, facebook und last.fm. Beispielsweise arbeitet yahoo!‗s größte Installation mit 4000 Knoten. Hadoop besteht im Wesentlichen aus 3 Komponenten: Hadoop Common Hadoop Distributed FileSystem Hadoop MapReduce Mit diesen 3 Komponenten lässt sich ein vollständiger Hadoop-Cluster aufbauen, welcher nach dem Master-Slave-Prinzip arbeitet. Hadoop Common stellt sämtliche Grundfunktionen bereit, die alle anderen Komponenten benötigen, wie eine implementierungsneutrale FileSystem-Schnittstelle oder eine Schnittstelle für die „Remote-Procedure-Call―-Kommunikation im Cluster und Bibliotheken. Das Hadoop Distributed FileSystem (HDFS) ist das primäre Dateisystem von Hadoop und es folgt dem Vorbild des Google-FileSystem. Es ist speziell für die Entwicklung von MapReduce-Anwendungen optimiert. Hadoop MapReduce bietet alle Funktionen um nach dem Programmiermodell zu entwickeln und es basiert auf dem oben beschriebenen Google-MapReduce-Verfahren und dessen Funktionsweise. [FIS10] [BAL 09] ___________________________________________________________________________ * Suchmaschinen-Projekt der OPenSource-Community - 11 - 7. HadoopDB HadoopDB ist ein freies paralleles Datenbanksystem, welches auf der Shared-NothingArchitektur basiert und das mit einer an SQL angelehnten Sprache abgefragt werden kann. Es soll die Skalierbarkeit von Hadoop mit der Geschwindigkeit eines parallelen Datenbanksystems kombinieren. HadoopDB basiert auf einer Verbindung von PostgreSQL, Hadoop und einem Interface, das Anfragen in MapReduce oder SQL verarbeitet, je nachdem, welche Art von Anfragen vorliegen. Es generiert Anfragepläne, welche über einen Shared-Nothing-Cluster ausgeführt werden. Aus diesem Grund ist HadoopDB ein Hybrid aus MapReduce und einem parallelen Datenbanksystem. [GOLEM] Das derzeit genutzte Datenbanksystem ist PostgreSQL und es soll gegen andere Datenbanksysteme austauschbar sein, was mit MySQL schon erfolgreich durchgeführt wurde. Desweiteren ist HadoopDB OpenSource. [YALE] 8. Zusammenfassung Zusammenfassend ist zu sagen, dass durch das MapReduce-Framework Berechnungen und eingelesene Daten auf vergleichsweise einfache und durch Standardhardware sowie OpenSource-Software kostengünstige Art und Weise durchgeführt und weiterverarbeitet werden können. Der Geschwindigkeitsvorteil von MapReduce besteht darin, dass die Daten parallel auf mehreren Computern im Cluster verarbeitet und gespeichert werden. Es gibt bereits einige Implementierungen des MapReduce-Frameworks, sowie Hybridlösungen, welche die Vorteile der MapReduce-Berechnung und relationalen Mehrrechner-Datenbanksystemen nutzen. Das MapReduce-Framework wird bereits von vielen Firmen erfolgreich genutzt und findet immer höheren Zuspruch, da es schnell und kostengünstig aufsetzbar ist. - 12 - 9. Literaturverzeichnis [DG04] Jerref Dean, Sanjay Ghemawat, ―MapReduce: Simplified Data Processing on Large Clusters‖, Google Inc., 2004 [STO10] Michael Stonebraker, ―MapReduce and Parallel DBMSs: Friends or Foes?‖, Communication of the ACM, Januar 2010 [CIR07] Walfredo Cirne, ―Google Infrastructure for Massive Parallel Processing‖, Google Inc., 2007 [FIS10] Oliver Fischer, ―Verarbeiten großer verteilter Datenmengen mit Hadoop‖, Heise Zeitschriften Verlag, 2010 [BAL09] Eric Baldeschwieler, „Hadoop Updaten, Open Cirrus Summit―, yahoo!, 2009 [LAE07] Ralf Lämmel, ―Google‘s MapReduce Programming Model—Revisited‖, Microsoft Corp., 2007 [YALE] http://db.cs.yale.edu/hadoopdb/hadoopdb.html, Abrufdatum: 05.06.2010 [VBM] http://www.vb-magazin.de/KnowledgeBase/articles/2009/09/11/272-einfuuml-hrung-in-die-cloud-computing-technologie-microsoft-azure.aspx, Abrufdatum: 05.06.2010 [WIKI] http://de.wikipedia.org/wiki/Festplatte, Abrufdatum: 05.06.2010 [GOLEM] http://www.golem.de/0907/68643.html, Abrufdatum: 05.06.2010 - 13 -