2011-01-13 10 views
0

Angenommen, ich eine einfache Textdatei mit den folgenden Daten haben:Wie wird eine Textmenge als Ganzes einem Knoten zugeordnet?

DataSetOne <br /> 
content <br /> 
content <br /> 
content <br /> 


DataSetTwo <br /> 
content <br /> 
content <br /> 
content <br /> 
content <br /> 

... und so weiter ...

Was ich will ist zu: zählen, wie viele Inhalte in jedem Datensatz. Zum Beispiel sollte das Ergebnis

<DataSetOne, 3>, <DataSetTwo, 4> 

Ich bin sein ein beginer Hadoop, frage ich mich, ob es einen Weg gibt, einen Teil der Daten als Ganzes zu einem Knoten abzubilden. B. alle DataSetOne auf Knoten 1 und alle DataSetTwo auf Knoten 2 setzen.

Kann mir jemand eine Idee geben, wie man das archiviert?

Antwort

0

Zu allererst Ihre Datensätze werden für mehrere Karten aufgeteilt, wenn sie in separaten Dateien sind oder wenn sie die konfigurierte Blockgröße nicht überschreiten. Wenn Sie also einen Datensatz von 128 MB haben und Ihre Chunksize 64 MB ist, wird Hadoop diese Datei 2-blockig machen und 2 Mapper für jede Datei einrichten.
Dies ist wie das Wordcount-Beispiel in den Hadoop-Tutorials. Wie David sagt, müssen Sie die Schlüssel/Wert-Paare in HDFS abbilden und dann reduzieren. Ich würde das wie folgt umzusetzen:

// field in the mapper class 
int groupId = 0; 

@Override 
protected void map(K key, V value, Context context) throws IOException, 
     InterruptedException { 
    if(key != groupId) 
     groupId = key; 
    context.write(groupId, value); 
} 

@Override 
protected void reduce(K key, Iterable<V> values, 
     Context context) 
     throws IOException, InterruptedException { 
    int size = 0; 
    for(Value v : values){ 
     size++; 
    } 
    context.write(key, size); 
} 

Wie David sagte aswell Sie Kombinierer nutzen könnten. Combiner sind einfache Reduzierer und dienen zum Speichern von Ressourcen zwischen der Map- und Reduce-Phase. Sie können in der Konfiguration eingestellt werden.

2

Ich denke, die einfache Art und Weise die Logik in der Mapper implementieren wird, wo Sie erinnern, was ein Strom dataSet und emittieren Paare wie folgt aus:

(DataSetOne, Inhalt)
(DataSetOne, Inhalt)
(DataSetOne, Inhalt)

(DataSetTwo, Inhalt)
(DataSetTwo, Inhalt)

Und dann Sie w kranke Zählgruppen in der Reduzierungsstufe.

Wenn die Leistung ein Problem wird, würde ich vorschlagen, Combiner zu berücksichtigen.

0

Sie können die FileInputFormat-Klasse erweitern und die RecordReader-Schnittstelle implementieren (oder wenn Sie die neuere API verwenden, erweitern Sie die abstrakte RecordReader-Klasse), um zu definieren, wie Sie Ihre Daten aufteilen. Hier finden Sie einen Link, der Ihnen anhand der älteren API ein Beispiel für die Implementierung dieser Klassen gibt.

http://www.questionhub.com/StackOverflow/4235318

Verwandte Themen