【发布时间】:2017-05-12 18:46:56
【问题描述】:
在减少阶段(减少百分比的 67%),我的代码在尝试完成数小时后最终卡住并失败。我发现问题是reducer正在接收大量无法处理的数据并最终耗尽内存,从而导致reducer卡住。
现在,我正在尝试解决这个问题。目前,我正在根据 reducer 从每个键接收到的值组装一个列表。在减少阶段结束时,我尝试在列表中写入键和所有值。所以我的问题是,如何在不耗尽内存的情况下获得与该键相关的键和值列表的相同功能?
public class XMLReducer extends Reducer<Text, Text, Text, TextArrayWritable> {
private final Logger logger = Logger.getLogger(XMLReducer.class);
@Override
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
//logger.info(key.toString());
Set<String> filesFinal = new HashSet<>();
int size = 0;
for(Text value : values) {
String[] files = value.toString().split(",\\s+");
filesFinal.add(value.toString());
//size++;
}
//logger.info(Integer.toString(size));
String[] temp = new String[filesFinal.size()];
temp = filesFinal.toArray(temp);
Text[] tempText = new Text[filesFinal.size()];
for(int i = 0; i < filesFinal.size(); i++) {
tempText[i] = new Text(temp[i]);
}
}
}
而 TextArrayWritable 只是将数组写入文件的一种方式
【问题讨论】:
标签: list hadoop memory collections mapreduce