2017-09-21 4 views
0

Die 'Gruppen' Operation der 'Shuffle' ist, die Daten in <key, List <value>> Form zu ändern, aber mein reducer.py erkennt diese Liste nicht und behandelt sie weiterhin als eine Zeile der <key, value> Form der Standardeingabe.Hadoop MapReduce Shuffle & Sort: Warum brauchen Sie eine Gruppenoperation?

Blick auf den Code unten:

for line in sys.stdin: 
    line = line.strip() 
    word, count = line.split('\t', 1) 

Also, warum es dies tut? Ändert Hadoop Streaming <key, List <value> Daten von <key, value> Formular in der Standardeingabe? Wenn ja, warum brauchen Sie den Gruppenbetrieb? 'Sortieren' Operation direkt auf den gleichen Schlüssel sort zusammen, und dann Zeile für Zeile der Eingabe in die reduce.py ist nicht das Gleiche?

reducer.py:

import sys 

current_word = None 
current_count = 0 
word = None 
for line in sys.stdin: 
    line = line.strip() 
    word, count = line.split('\t', 1) 
    try: 
     count = int(count) 
    except ValueError: 
     continue 
    if current_word == word: 
     current_count += count 
    else: 
     if current_word: 
      print('%s\t%s' % (current_word, current_count)) 
     current_word = word 
     current_count = count 

if current_word == word: 
    print('%s\t%s' % (current_word, current_count)) 

sys.exit(0) 

Angenommen, es ist ein Beispiel der Worthäufigkeitsstatistik, die die Anzahl der Vorkommen von a, b, c, d zählt.

1. Mit dem 'Gruppe' Betrieb, werden die Daten wie:

(b,[2,3]) 
(c,[1,5]) 
(d,[3,6]) 
(a,[2,4]) 

2.With die 'sort' Operation, die Daten werden wie:

(a,[2,4]) 
(b,[2,3]) 
(c,[1,5]) 
(d,[3,6]) 

3.reducer. py beim Empfang von Daten, werden die Daten wie:

(a,2) 
(a,4) 
(b,2) 
(b,3) 
(c,1) 
(c,5) 
(d,3) 
(d,6) 

So mag ich wissen, wer Stufe 2 in Stufe 3 hergestellt. Und wenn es keinen Schritt ‚Gruppe‘:

1.Without der ‚Gruppe‘ Betrieb, aber mit der ‚Art‘ Operation, auch die Daten werden wie:

(a,2) 
(a,4) 
(b,2) 
(b,3) 
(c,1) 
(c,5) 
(d,3) 
(d,6) 

2.reducer.py erhält die obigen Daten, ist es nicht OK? Ich verstehe nicht. :-)

+0

Fest Ihren Lauf zu verstehen auf Sätze. Fragen Sie nach dem "Shuffle" -Stadium von mapreduce? –

+0

Ja, sehr leid. Ich fragte die Shuffle-Bühnengruppe. – Gary

Antwort

0

Der Mapper gibt nur Listen mit Werten (eigentlich Iterator) für die Java-API aus.

Ja, in MapReduce gibt es eine Shuffle und Sortierung Phase, aber in Streaming, die Schlüssel werden den Reduzierungen in einer Linie getrennt Weise präsentiert und sortiert die Schlüssel. Mit diesen Informationen können Sie die Grenzen zwischen den verschiedenen Tasten erkennen, so dass Gruppen von Natur aus zu bilden und reduziert auf diese

Von the source you copied the code from, können Sie den Ausgang des mapper.py | sort -k1,1

siehe

Die Eingabe in die (erste) Minderer wie diese

a 1 
a 1 
b 1 
b 1 
b 1 
b 1 
c 1 
c 1 
d 1 

einfach den Code lesen ... nimmt nichts () oder [] Zeichen aus. Nichts wird auf ein Komma aufgeteilt ... Ihr Mapper druckt Tabs zwischen dem Schlüssel und dem Wert 1 aus.

Die erste Iteration des Reduktions treffen wird diesen Code

current_word = word # found a new word 
current_count = count # this will always start at 1 for word count 

Und das Reduktions sammelt die sortierten Tasten, bis sie ein neues Wort findet und druckt die Summen des vorherigen Wortes

+0

Es ist nach Schlüssel gruppiert, wird aber in diesem Format nicht für Hadoop Streaming bereitgestellt. Du parst niemals '[]' Zeichen –

+0

Ja, ich möchte fragen, ist das! Wer hat diese Arbeit gemacht? hadoop-streaming.jar hat das analysiert []? Warum brauchen Sie eine Gruppenoperation? Schließlich sind die Daten zu einer Eingabezeile geworden. – Gary

+0

Auch hier gibt es keine eckigen Klammern. Sie können darüber nachdenken, aber es ist nicht da –