在我的MapReduce程序的簡化階段,我執行的唯一操作是在所提供的迭代器concatonate每個值,如下:處理較大的輸出值減少的步驟在Hadoop中
public void reduce(Text key, Iterator<text> values,
OutputCollector<Text, Text> output, Reporter reporter) {
Text next;
Text outKey = new Text()
Text outVal = new Text();
StringBuilder sb = new StringBuilder();
while(values.hasNext()) {
next = values.next();
sb.append(next.toString());
if (values.hasNext())
sb.append(',');
}
outKey.set(key.toString());
outVal.set(sb.toSTring());
output.collect(outKey,outVal);
}
我的問題是一些減少輸出值是巨大的行文字;非常大,即使是非常大的初始大小,字符串緩衝區也必須多次增加(加倍)其大小以容納迭代器的所有上下文,從而導致內存問題。
在傳統的Java應用程序中,這表示寫入文件的緩衝寫入將是寫入輸出的首選方法。你如何處理Hadoop中非常大的輸出鍵值對?我應該直接將結果流式傳輸到HDFS上的文件(每次縮減調用一個文件)?有沒有辦法緩衝輸出,而不是output.collect方法?
注意:我已經盡最大可能增加了我的記憶/堆積。另外,有幾個消息來源表示,增加reducer的數量可以幫助解決內存/堆的問題,但是這裏的問題直接關係到SringBuilder在擴展容量時的使用。
由於