Database Reference
In-Depth Information
Wir haben nun die Hotel-Daten erzeugt, auf die wir Mapreduce anwenden
wollen.
Einführung in Mapreduce
Einer von Googles nachhaltigsten Beiträgen zur Informatik ist die Populari-
sierung von Mapreduce als algorithmisches Framework zur parallelen Aus-
führung von Jobs auf mehreren Knoten. Es wird in Googles bahnbrechender
Abhandlung
7
erläutert und wurde zu einem wertvollen Tool für die Ausfüh-
rung von Queries bei partitionstoleranten Datenspeichern.
Mapreduce zerlegt Probleme in zwei Teile. Im ersten Teil wird eine Liste von
Daten über eine
map()
-Funktion in eine andere Art von Liste umgewandelt.
Im zweiten Teil wird diese zweite Liste über die
reduce()
-Funktion in einen
oder mehrere Skalarwerte umgewandelt. Nach diesem Muster kann ein Sys-
tem Aufgaben in kleinere Komponenten zerlegen und parallel in einem Ser-
ver-Cluster ausführen. Wir könnten alle Riak-Werte, die
{country : 'CA'}
enthalten, zählen, indem wir jedes passende Dokument auf
{count : 1}
ab-
bilden (map) und dann die Summe aller counts berechnen (reduce).
Sind 5012 kanadische Werte in unseren Daten enthalten, wäre das Reduce-
Ergebnis also
{count : 5012}
.
map = function(v) {
var parsedData = JSON.parse(v.values[0].data);
if(parsedData.country === 'CA')
return [{count : 1}];
else
return [{count : 0}];
}
reduce = function(mappedVals) {
var sums = {count : 0};
for (var i in mappedVals) {
sums[count] += mappedVals[i][count];
}
return [sums];
}
In gewisser Hinsicht ist Mapreduce das Gegenteil von dem, wie wir Que-
ries normalerweise ausführen. Ein Ruby on Rails-System könnte Daten (über
sein ActiveRecord-Interface) wie folgt abrufen:
# Baue Hash auf, der Raumkapazität und Raumtyp veknüpft
capacity
_
by
_
style = {}
rooms = Room.all
for
room
in
rooms
total
_
count = capacity
_
by
_
style[room.style]