mapreduce hadoop作业异常输出目录已存在

w6lpcovy  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(507)

我正在用下面的运行代码运行一个mapreduce作业,它一直给我以下异常。我确保在开始作业之前删除文件夹,但它不起作用。
代码:

JobConf jobConf = new JobConf( getConf(), MPTU.class );
    jobConf.setJobName( "MPTU" );

    AvroJob.setMapperClass( jobConf, MPTUMapper.class );
    AvroJob.setReducerClass( jobConf, MPTUReducer.class );

    long milliSeconds = 1000 * 60 * 60;
    jobConf.setLong( "mapred.task.timeout", milliSeconds );

    Job job = new Job( jobConf );
    job.setJarByClass( MPTU.class );

    String paths = args[0] + "," + args[1];
    FileInputFormat.setInputPaths( job, paths );
    Path outputDir = new Path( args[2] );
    outputDir.getFileSystem( jobConf ).delete( outputDir, true );
    FileOutputFormat.setOutputPath( job, outputDir );

    AvroJob.setInputSchema( jobConf, Pair.getPairSchema( Schema.create( Type.LONG ), Schema.create( Type.STRING ) ) );
    AvroJob.setMapOutputSchema( jobConf, Pair.getPairSchema( Schema.create( Type.STRING ),
                                                             Schema.create( Type.STRING ) ) );
    AvroJob.setOutputSchema( jobConf,
                             Pair.getPairSchema( Schema.create( Type.STRING ), Schema.create( Type.STRING ) ) );

    job.setNumReduceTasks( 400 );
    job.submit();
    JobClient.runJob( jobConf );

例外情况:

13:31:39,268 ERROR UserGroupInformation:1335 - PriviledgedActionException as:msadri (auth:SIMPLE) cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/Users/msadri/Documents/files/linkage_output already exists
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/Users/msadri/Documents/files/linkage_output already exists
    at org.apache.hadoop.mapred.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:117)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:937)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:896)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:896)
    at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:870)
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1319)
    at com.reunify.socialmedia.RecordLinkage.MatchProfileTwitterUserHandler.run(MatchProfileTwitterUserHandler.java:58)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at com.reunify.socialmedia.RecordLinkage.MatchProfileTwitterUserHandler.main(MatchProfileTwitterUserHandler.java:81)
wwtsj6pe

wwtsj6pe1#

如果我的理解有误,请纠正我。。在上面的代码中,您指的是本地文件系统中的“/users/msadri/documents/…”,不是吗。?似乎core-site.xml中的fs.defaultfs指向的是file:///而不是集群的hdfs地址。
1) 如果您需要根据您的要求指向本地文件系统,那么请尝试此操作。

FileSystem.getLocal(conf).delete(outputDir, true);

2) 如果需要指向hdfs,那么请检查core-site.xml,其中fs.defaultfs必须指向 hdfs://<nameNode>:<port>/ 那就试一下(错误消息说您指向本地文件系统。如果它指向hdfs,它会说“output directory” hdfs://<nameNode>:<port>/Users/msadri/... “已存在”
如果没有必要,就排除这个可能性。请告诉我你的回答。。

yhqotfr8

yhqotfr82#

你也可以试试这个
删除已存在的输出文件夹。

1zmg4dgp

1zmg4dgp3#

出现上述异常是因为您的输出目录(/users/msadri/documents/files/u output)已在hdfs文件系统中创建/存在
只要记住,在运行map reduce作业时,一定要提到输出目录,它已经在hdfs中了。请参阅以下帮助您解决此异常的说明
要运行map reduce作业,您必须编写一个与下面的命令类似的命令
$hadoop jar{name\u of the \u jar\u file.jar}{package\u name\u of \u jar}{hdfs\u file\u path\u on \u you \u perform \u map\u reduce}{output\u directory\u path}
example:- hadoop jar facebookcrawler.jar com.wagh.wordcountjob.wordcount/home/facebook/facebook-cocacola-page.txt/home/facebook/crawler输出
请注意{output\u directory\u path},即/home/facebook/crawler输出。如果您已经在hdfs中创建了这个目录结构,那么hadoop生态系统将抛出异常“org.apache.hadoop.mapred.filealreadyexistsexception”。
solution:- always 在运行时指定输出目录名(即hadoop将自动为您创建目录)。您不必担心输出目录的创建)。如上例所述,相同的命令可以按以下方式运行-
“hadoop jar facebookcrawler.jar com.wagh.wordcountjob.wordcount/home/facebook/facebook-cocacola-page.txt/home/facebook/crawler-output-1”
因此,hadoop生态系统将在运行时创建输出目录{crawler-output-1}。
有关更多详细信息,请参阅:https://jhooq.com/hadoop-file-already-exists-exception/

ijnw1ujt

ijnw1ujt4#

你能试一下吗

outputDir.getFileSystem( jobConf ).delete( outputDir, true );

//to

FileSystem fs = FileSystem.get(jobConf);
fs.delete(outputDir, true);

相关问题