我在reducer中使用MultipleOutputs。多输出将文件写入名为NewIdentities的文件夹。代码如下所示:
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:org.apache.hadoop.hdfs.server.namenode.FSNamesystem上已存在客户端192.168.71.128的/ CaptureOnlyMatchIndex9 / TEMP / ChangeReport / NewIdentities / -r-00000。在org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2225)的org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem。)中的startFileInternal(FSNamesystem.java:2297)。 java:2178)org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:520)atg.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:354)at org位于org.apache的org.apache.hadoop.ipc.ProtobufRpcEngine $ Server $ ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)中的.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos $ ClientNamenodeProtod $ 2.callBlockingMethod(ClientNamenodeProtocolProtos.java)。 org.apach中的hadoop.ipc.RPC $ Server.call(RPC.java:928) e.hadoop.ipc.Server $ Handler $ 1.run(Server.java:2013)atg.apache.hadoop.ipc.Server $ Handler $ 1.run(Server.java:2009)at java.security.AccessController.doPrivileged( Native方法)位于org.apache.hadoop.ipc.Server $的org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)的javax.security.auth.Subject.doAs(Subject.java:415) Handler.run(Server.java:2007)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 45)在org.apache.hadoop.ipc.RemoteException.unwrapRemoteException的org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106)的java.lang.reflect.Constructor.newInstance(Constructor.java:526)中(RemoteException.java:73)org.apache中的org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:1604)。位于org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1390)的oro.apache.hadoop.hdfs.DistributedFileSystem $ 6.doCall(DistributedFileSystem.java)中的hadoop.hdfs.DFSClient.create(DFSClient.java:1465) :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)atg.apache.hadoop.fs.FileSystem.create(FileSystem.java:906)at at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:887)位于org.apache.hadoop.mapreduce.lib.output的org.apache.hadoop.fs.FileSystem.create(FileSystem.java:784)。位于org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.getRecordWriter(MultipleOutputs.java:475)的TextOutputFormat.getRecordWriter(TextOutputFormat.java:132)
答案 0 :(得分:2)
我找到了原因。因为在我的一个减速器中,它耗尽了内存。因此它隐含地抛出了一个内存不足的异常。 hadoop停止当前的多输出。也许还原的另一个线程想要输出,所以它创建了另一个多输出对象,因此发生了碰撞。