C++ 减少Hadoop管道1.1.2上的卡住(java.io.IOException:错误的命令代码:48)

C++ 减少Hadoop管道1.1.2上的卡住(java.io.IOException:错误的命令代码:48),c++,hadoop,pipe,reduce,C++,Hadoop,Pipe,Reduce,各位早上好, 我正在运行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(

各位早上好,

我正在运行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)
这是执行reduce任务的其余部分中的一个

这是我的代码。我用地图里面的字符串里面的一个辅助键来排序,任何性能的改进都是欢迎的

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的代码位于Java二进制协议的run函数中;可以在第120行找到它。NegativeArraySizeException被抛出到第133行和第149行之间的某个地方;我猜int numBytes=writeableutils.readVIntinStream;高于INT_MAX,但我不知道如何修复它

HDFS在所有节点中看起来都很健康,仅使用了约3%。我使用的是非常健壮的节点,至少有64GB的RAM

我已经搜索了这个问题,但没有找到任何提示,因此非常感谢您的帮助

提前感谢,

里欧