具有FileReadyExistsException的reducer中的hadoop多路输出

wqsoz72f  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(344)

我在减速机中使用倍数输出。多重输出将把文件写入一个名为newidentifies的文件夹。代码如下:

private MultipleOutputs<Text,Text> mos;
@Override
public void reduce(Text inputKey, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        ......
        // output to change report
        if (ischangereport.equals("TRUE")) {
            mos.write(new Text(e.getHID()), new Text(changereport.deleteCharAt(changereport.length() - 1).toString()), "NewIdentities/");
        }
    }
}

@Override
public void setup(Context context) {
    mos = new MultipleOutputs<Text,Text>(context);
}

@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
    mos.close();
}

它可以在以前运行。但是当我今天运行它时,它抛出一个异常,如下所示。我的hadoop版本是2.4.0。
错误:org.apache.hadoop.fs.filealreadyexistsexception:/captureonlymatchindex9/temp/changereport/newIdentifies/-r-00000客户端192.168.71.128已存在于org.apache.hadoop.hdfs.server.namenode.fsnamesystem.startfileinternal(fsnamesystem)。java:2297)在org.apache.hadoop.hdfs.server.namenode.fsnamesystem.startfileint(fsnamesystem)。java:2225)位于org.apache.hadoop.hdfs.server.namenode.fsnamesystem.startfile(fsnamesystem)。java:2178)在org.apache.hadoop.hdfs.server.namenode.namenoderpcserver.create(namenoderpcserver。java:520)在org.apache.hadoop.hdfs.protocolpb.clientnamenodeprotocolserversidetranslatorpb.create(clientnamenodeprotocolserversidetranslatorpb。java:354)org.apache.hadoop.hdfs.protocol.proto.clientnamenodeprotocolprotos$clientnamenodeprotocol$2.callblockingmethod(clientnamenodeprotocolprotos.java)位于org.apache.hadoop.ipc.protobufrpceengine$server$protobufrpinvoker.call(protobufrpceengine。java:585)在org.apache.hadoop.ipc.rpc$server.call(rpc。java:928)在org.apache.hadoop.ipc.server$handler$1.run(server。java:2013)在org.apache.hadoop.ipc.server$handler$1.run(server。java:2009)位于java.security.accesscontroller.doprivileged(本机方法)javax.security.auth.subject.doas(主题。java:415)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1548)在org.apache.hadoop.ipc.server$handler.run(server。java:2007)位于sun.reflect.nativeconstructoraccessorimpl.newinstance0(本机方法)sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl。java:57)在sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl。java:45)在java.lang.reflect.constructor.newinstance(constructor。java:526)在org.apache.hadoop.ipc.remoteexception.instantiateexception(远程异常。java:106)在org.apache.hadoop.ipc.remoteexception.unwrapremoteexception(remoteexception。java:73)位于org.apache.hadoop.hdfs.dfsoutputstream.newstreamforcreate(dfsoutputstream)。java:1604)在org.apache.hadoop.hdfs.dfsclient.create(dfsclient。java:1465)在org.apache.hadoop.hdfs.dfsclient.create(dfsclient。java:1390)在org.apache.hadoop.hdfs.distributedfilesystem$6.docall(distributedfilesystem。java:394)在org.apache.hadoop.hdfs.distributedfilesystem$6.docall(distributedfilesystem。java:390)在org.apache.hadoop.fs.filesystemlinkresolver.resolve(filesystemlinkresolver。java:81)在org.apache.hadoop.hdfs.distributedfilesystem.create(distributedfilesystem。java:390)在org.apache.hadoop.hdfs.distributedfilesystem.create(distributedfilesystem。java:334)在org.apache.hadoop.fs.filesystem.create(filesystem。java:906)在org.apache.hadoop.fs.filesystem.create(filesystem。java:887)在org.apache.hadoop.fs.filesystem.create(文件系统)。java:784)位于org.apache.hadoop.mapreduce.lib.output.textoutputformat.getrecordwriter(textoutputformat)。java:132)位于org.apache.hadoop.mapreduce.lib.output.multipleoutputs.getrecordwriter(multipleoutputs。java:475)在

xeufq47z

xeufq47z1#

我找到了原因。因为在我的一个减速机里,它的内存用完了。因此它隐式抛出内存不足异常。hadoop停止当前的多重输出。可能另一个reducer线程想要输出,所以它创建了另一个多输出对象,所以发生了冲突。

相关问题