我使用MultipleOutputs将数据输出到某些绝对路径,而不是相对于OutputPath的路径。
然后,我收到错误:
错误:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException):无法创建文件[/test/convert.bak/326/201505110030/326-m-00035]对于客户端[192.168.7.146]上的[DFSClient_attempt_1425611626220_29142_m_000035_1001_-370311306_1],因为此文件已由[192.168.7.149]上的[DFSClient_attempt_1425611626220_29142_m_000035_1000_-53988495_1]创建,位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal( FSNamesystem.java:2320)org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:2083)at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java: 2012)atg.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1963)at
答案 0 :(得分:1)
https://issues.apache.org/jira/browse/MAPREDUCE-6357
输出文件必须在$ {mapred.output.dir}。
设计和实现不支持将数据输出到$ {mapred.output.dir}中的文件。
答案 1 :(得分:0)
通过查看堆栈跟踪错误,似乎已经创建了输出文件。
如果要将数据写入多个文件,请尝试动态生成这些文件名,并使用这些文件名,如Hadoop权威指南中的代码所示
String basePath = String.format("%s/%s/part", parser.getStationId(), parser.getYear());
multipleOutputs.write(NullWritable.get(), value, basePath);
我希望这会有所帮助。
答案 2 :(得分:0)
因为它清楚地表明您尝试创建的路径已经存在。因此,在创建该路径之前,请尝试检查该路径是否存在。如果存在,则删除该路径。
FileSystem hdfs;
Path path = new Path (YourHadoopPath);
if (hdfs.exists(path)) {
hdfs.delete(path);
}