cat input.txt | python map.py

Im 1
ersten 1
Teil 1
dieses 1
Blogposts 1
werde 1
ich 1
zeigen, 1
wie 1
ein 1
einfaches 1
Beispiel 1
funktioniert. 1
Im 1
zweiten 1
Teil 1
dieses 1
Blogposts 1
werde 1
ich 1
eine 1
einfache 1
Hadoop-Variante 1
davon 1
vorstellen. 1

cat gibt den Text Zeile für Zeile an map.py, das den Text – Zeile für Zeile – von sys.stdin einliest. Im nächsten Schritt schneidet es Leerzeichen und Zeilenvorschübe ab (split()) und trennt den Text an Leerzeichen. pp ist also eine Liste der Wörter je Zeile. Dann gibt der Code für jedes Wort in der Zeile das Paar Wort 1 heraus.

Wir zählen also, indem wir jedes Wort einmal zählen, und dem Reducer überlassen, pro Wort aufzuaddieren. Denkt wieder an Billionen Worte in allen Büchern der Welt. Lasst 10000 dieser Mapper gleichzeitig laufen, und das ganze macht mehr Sinn – viele Mapper werden den gleichen Schlüssel emittieren. Wenn ihr jetzt fragt, warum der Mapper nicht einfach alles aufaddiert – nun dazu müsste er alle Worte im Speicher behalten. Wenn man es so macht, ist man mit der Ausgabe das Unterproblem (hier die Verarbeitung eines einzelnen Wortes) schon los. Allerdings kann man noch einen combiner-Schritt einführen, der quasi das gleiche wie der Reducer macht, aber nur für die Ergebnisse eines Mappers. Danach werden die Ausgaben gesammelt, neu verteilt sodass der Reducer alle Ergebnisse eines Schlüssels erhält.

Schicken wir also das obigen Zwischenergebnis an den Reducer

cat test.txt | python map.py | sort | python reduce.py

wie 1
einfache 1
vorstellen. 1
funktioniert. 1
Hadoop-Variante 1
zweiten 1
ersten 1
eine 1
zeigen, 1
einfaches 1
davon 1
Beispiel 1
ein 1
ich 2
Teil 2
dieses 2
Im 2
werde 2
Blogposts 2

Der Reducer also liest wiederum die (sortierten) Zwischenergebnisse vom Mapper über sys.stdin und zerlegt sie in Schlüssel (=Wort) und Wert (Wie oft das Wort gezählt wurde, also immer 1). Dann speichert er in einem dictionary die Schlüssel und zählt die Anzahl um den Wert hoch (also hier immer um 1). Die get Funktion liefert entweder den vorigen Wert aus dem dictionary oder eine 0, falls der Schlüssel noch nicht existiert. Abschließend gibt er dann die nach Anzahl sortierte Wortliste heraus.

Wenn ihr jetzt Lust auf etwas größete Daten habt, füttert den Code doch mal mit einem Buch aus dem Projekt Gutenberg. Die häufigsten Wörter in Moby Dick sind z.B.

was 1566
is 1586
as 1599
with 1692
I 1724
his 2415
that 2693
in 3878
to 4510
a 4533
and 5951
of 6587
the 13766

 

1 / 2

Kommentare (2)

  1. #1 fluxcompensator
    Salzburg
    11/20/2012

    Danke. Das ist gleichzeitig ein tolles Einsteigerbeispiel für Python.

  2. […] ersten Teil haben wir die Grundlagen des MapReduce erlebt, heute ist es dann endlich soweit, wir starten mit […]