Доброе утро всем,
Я работаю над полным кластером, работающим под управлением Hadoop Pipes 1.1.2, и обнаружил следующие ошибки для очень длинных заданий:
2013-07-24 06:13:55,058 ERROR org.apache.hadoop.mapred.pipes.BinaryProtocol: java.io.IOException: Bad command code: 48
at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:157)
(этот в одном узле)
2013-07-24 06:18:03,472 ERROR org.apache.hadoop.mapred.pipes.BinaryProtocol: java.lang.NegativeArraySizeException
at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.readObject(BinaryProtocol.java:180)
at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:132)
(этот в остальном, который выполняет задачи сокращения)
Это мой код редуктора. Я использую карту там, чтобы отсортировать по второму ключу внутри строки, любые улучшения производительности также приветствуются!
void ACEReducer::reduce(HadoopPipes::ReduceContext& context) {
string fragmento, instante, contenido;
size_t pos;
string fichero = string();
map<string, string> resultados;
// Ordena la lista de valores para escribirlos conforme al instante simulado (map se encarga de la ordenacon)
int nValores = 0;
while (context.nextValue()) {
fragmento = context.getInputValue();
pos = fragmento.find("\t", 0);
if (pos == string::npos) {
cerr << "ERROR - Valor erroneo en Reduce." << endl;
} else {
instante = fragmento.substr(0, pos);
contenido = fragmento.substr(pos+1, string::npos);
resultados.insert(pair<string&, string&>(instante, contenido));
}
nValores++;
if (nValores % 10 == 0) {
context.progress();
}
}
// Concatena los resultados ordenados y los emite para escritura.
nValores = 0;
for (map<string, string>::iterator it=resultados.begin(); it!=resultados.end(); it++){
nValores++;
if (nValores % 10 == 0) {
context.progress();
}
fichero += it->second;
}
context.emit(context.getInputKey(), fichero);
}
Код, который выбрасывает IOException, находится в функции run () в Java BinaryProtocol; это можно найти Вот в строке 120. NegativeArraySizeException выбрасывается где-то между строками 133 и 149; я думаю, что int numBytes = WritableUtils.readVInt(inStream);
выше, чем INT_MAX, но я не знаю, как это исправить.
HDFS выглядит здоровой во всех узлах, используется только ~ 3%. Я использую очень надежные узлы, по крайней мере с 64 ГБ оперативной памяти.
Я искал эту проблему, и я не нашел никаких подсказок, поэтому любая помощь очень ценится.
Заранее спасибо,
Рио
Задача ещё не решена.
Других решений пока нет …