Stai leggendo il libro correttamente. Il riduttore non memorizza tutti i valori in memoria. Invece, durante il looping attraverso l'elenco dei valori Iterable, ogni istanza di Object viene riutilizzata, quindi mantiene solo un'istanza in un dato momento.
Ad esempio nel codice seguente, l'array ArrayList avrà la dimensione prevista dopo il ciclo ma ogni elemento sarà lo stesso b/c l'istanza di testo Val viene riutilizzata ogni iterazione.
public static class ReducerExample extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) {
ArrayList<Text> objs = new ArrayList<Text>();
for (Text val : values){
objs.add(val);
}
}
}
(Se per qualche ragione avete voglia di intraprendere ulteriori azioni per ogni val, si dovrebbe fare una copia profonda e poi memorizzarlo.)
Naturalmente anche un solo valore potrebbe essere più grande di memoria . In questo caso, è consigliabile che lo sviluppatore esegua dei passi per ridurre i dati nel Mapper precedente, in modo che il valore non sia troppo grande.
UPDATE: vedere le pagine 199-200 di Hadoop The Definitive Guide 2nd Edition.
This code snippet makes it clear that the same key and value objects are used on each
invocation of the map() method -- only their contents are changed (by the reader's
next() method). This can be a surprise to users, who might expect keys and vales to be
immutable. This causes prolems when a reference to a key or value object is retained
outside the map() method, as its value can change without warning. If you need to do
this, make a copy of the object you want to hold on to. For example, for a Text object,
you can use its copy constructor: new Text(value).
The situation is similar with reducers. In this case, the value object in the reducer's
iterator are reused, so you need to copy any that you need to retain between calls to
the iterator.
fonte
2012-06-13 23:28:01
Sono confuso dalla risposta. Per prima cosa dici "il riduttore non memorizza tutti i valori in memoria", il che implica che i valori Iterable carichi secondo necessità. In seguito, si dice, "anche una singola istanza di valori potrebbe essere più grande della memoria", il che implica che l'elenco di valori viene prima caricato in memoria. Puoi chiarire per favore? – Zach
Modificato per chiarire. Volevo solo che anche un singolo valore potesse essere grande. Questo è improbabile. "Il riduttore non memorizza tutti i valori in memoria" è una vera affermazione. Ha senso? –
Sì. Grazie per il chiarimento. Hai un riferimento per questo, per caso? – Zach