am 22. Oktober 2009
MapReduce – erfunden von Google, Nachfolger von SQL und neuer leuchtender Stern am Buzzword-Himmel (oder sollte ich besser Cloud sagen). Es handelt sich hierbei um eines der Hauptkonzepte von Key-Value Datenbanken, das es erlaubt, flexible Abfragen auf die gespeicherten Daten abzusetzen und mit ihnen zu arbeiten.
Oft wird MapReduce als SQL der Key-Value Datenbanken (Einführung siehe Gibt es ein Leben nach SQL?) bezeichnet. Es handelt sich hierbei aber nicht um eine Sprache, sondern um ein allgemeines Konzept, das festlegt, wie auf sehr große Datenmengen zugegriffen wird, wie Abfragen abgearbeitet werden und wie diese skalierbar und verteilbar gehalten werden.
Objekte in Key-Value Datenbanken können nur über einen eindeutigen Key angesprochen werden. Ein Zugriff erfolgt daher immer direkt und betrifft nur einen Datensatz. Suche, Joins, Aggregationen oder ähnliche Konstrukte, die bei relationalen Datenbanken über SQL realisiert werden, und mehrere Daten betreffen, sind daher grundsätzlich nicht möglich. Um trotzdem komplexe Berechnungen oder Manipulationen, wie zum Beispiel im Data Mining Bereich, durchführen zu können, wird bei den meisten Key-Value Datenbanken das MapReduce Konzept eingesetzt. Das Konzept wurde zum ersten Mal 2004 von Google unter dem Namen MapReduce veröffentlicht [1] und zielt auf einen hohen Grad an Verteilung und Skalierbarkeit ab. Zahlreiche Prozesse bei Google, wie z.B. Aufbau des Suchindex, werden mit Hilfe von MapReduce realisiert und bewältigen mehrere Terabyte an Daten.
Grundsätzlich besteht ein MapReduce-Prozess aus zwei Funktionen, der Map- und der Reduce-Funktion. Die Map Funktion wird auf alle gespeicherten Daten angewandt. Die Ergebnisse aller ausgeführten Map-Funktionen werden dann über die Reduce-Funktion eingesammelt und zusammengefasst.
Der folgende Pseudo Code zeigt ein Beispiel zur Berechnung der Anzahl aller Artikel, die das Wort ‘phphatesme’ beinhalten. Das Beispiel ist mit der SQL Query SELECT count(*) FROM articles WHERE content LIKE ‘%phphatesme%’ zu vergleichen.
function mapSearch ($article) {
//search for string 'phphatesme' and exclude self-praise
if (strstr($article->content, 'phphatesme')
&& $article->author != 'Nils') {
return 1;
} else {
return 0;
}
}
function reduceSearch($resultArray) {
//sum up all occurrences of 'phphatesme'
$count = 0;
foreach ($resultArray as $value) {
$count = $count + value;
}
return $count;
}
Die Funktion mapSearch, die mit Hilfe von strstr nach dem String ‘phphatesme’ sucht, wird hierbei für jedes gespeicherte Objekt (im relationalen Modell eine Zeile) aufgerufen. Die return-Werte werden dann vom MapReduce Framework gesammelt und der Funktion reduceSearch als Array übergeben. Diese muss nur mehr die 1-Werte aufsummieren und kann das Gesamtergebnis zurückliefern.
Um eine hohe Nebenläufigkeit (Parallelität) bzw. Skalierbarkeit zu ermöglichen, übernimmt MapReduce ein Konzept aus der Funktionalen Programmierung. Die Map- und Reduce-Funktionen dürfen dabei keine Seiteneffekte aufweisen. Den Funktionen ist es daher nicht erlaubt, auf Objekte außerhalb ihres eigenen Scopes (z.B. globale Variablen) zuzugreifen bzw. diese zu verändern. Die einzige Kommunikation mit der “Außenwelt” erfolgt über die übergebenen Parameter (keine Referenzen, nur Call by value) und dem return-Wert. Durch die so gewährleistete Unabhängigkeit jeder Funktion können die Funktionen parallel, auf verschiedenen CPUs, auf verschiedenen Rechnern oder in beliebiger Reihenfolge aufgerufen werden.
Im ersten Moment erscheint die MapReduce-Variante der “count” Abfrage eventuell komplexer und umständlicher, als eine klassische SQL-Query. Der Vorteil liegt jedoch in der Verwendung einer vollwertigen Programmiersprache, mit der im Gegensatz zu SQL wesentlich komplexere Prozesse modelliert werden können. Zusätzlich erhält man durch das funktionale Konzept eine ideale Grundlage zur Parallelisierung. Zum Beispiel verteilt Google mit dem eigenen MapReduce Framework Prozesse auf tausende Rechner und setzte damit 2008 den Rekord mit dem TeraSort Benchmark (1 Milliarde Datensätze mit 1 Terabyte sortieren) mit 1000 Rechnern auf 68 Sekunden.
Das sehr einfache und leichtgewichtige MapReduce Konzept wird mittlerweilen in fast allen Key-Value Datenbanken verwendet. Die auf Skalierbarkeit ausgerichteten Datenbanken können hier von der hohen Parallelisierbarkeit unter Beibehaltung des großes Funktionsumfanges der Map und Reduce Funktionen profitieren.
Ich hoffe ich konnte einen schnellen Blick hinter das Cloud-Buzzword auf das Konzept MapReduce ermöglichen. Wer noch nicht genug von diesem Thema hat, und gern mehr lesen will, z.B. wie diese Techniken in PHP eingesetzt werden können, möge dies doch bitte in den Kommentaren unterbringen. Für alle Interessierten und Datenbank-Nerds, die nicht auf weitere Artikel warten wollen/können, hier noch einige Links zum Thema:
MapReduce Artikel:
- MapReduce Original Paper Google OSDI’04: Sixth Symposium on Operating System Design and Implementation, San Francisco, CA, December, 2004
- Sorting 1PB with MapReduce, GoogleBlog 2008
- Allgemeiner Wikipedia Artikel zu MapReduce mit weiterführenden Links
- Kritische Stimmen zu MapReduce: Three big myths about MapReduce, DBMS2, October 18, 2009
Key-Value Datenbanken (kein Anspruch auf Vollständigkeit):
- CouchDB
- Tokyo Cabinet
- Memcachedb
- Cassandra
- MongoDB