Mapreduce Hadoop作业异常输出目录已存在

时间:2013-08-20 20:39:58

标签: java hadoop mapreduce output avro

我正在使用以下运行代码运行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)

4 个答案:

答案 0 :(得分:4)

如果我的理解是错误的,请纠正我。在上面的代码中,你指的是“/ Users / msadri / Documents / .....”,在本地文件系统中是不是。核心site.xml中的fs.defaultFS似乎指向file:///而不是集群的hdfs地址。

1)如果您需要根据您的要求指向本地文件系统,请尝试此操作。

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

2)如果需要指向hdfs那么请检查core-site.xml,并且fs.defaultFS必须指向hdfs://<nameNode>:<port>/然后尝试一次.. (错误消息说您指向本地文件系统。如果它指向hdfs,它会说“输出目录hdfs://<nameNode>:<port>/Users/msadri/...已经存在”

如果没有必要,请将其排除在外。请让我知道你的回复..

答案 1 :(得分:0)

你可以尝试

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

//to

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

答案 2 :(得分:0)

您可以尝试this too

删除输出文件夹(如果已存在)。

答案 3 :(得分:-1)

由于您的输出目录(/ Users / msadri / Documents / files / linkage_output)已在HDFS文件系统中创建/存在,因此您已超出异常

只要记住在运行map reduce job时请注意输出目录,它已经是HDFS中的了。请参阅以下有助于您解决此异常的说明

要运行地图缩小作业,您必须编写类似于以下命令的命令

$ hadoop jar {name_of_the_jar_file.jar} {package_name_of_jar} {hdfs_file_path_on_which_you_want_to_perform_map_reduce} {output_directory_path}

示例: - hadoop jar facebookCrawler.jar com.wagh.wordcountjob.WordCount /home/facebook/facebook-cocacola-page.txt / home / facebook / crawler-output

注意{output_directory_path}即/ home / facebook / crawler-output。如果您已经在HDFS中创建了这个目录结构,那么Hadoop EcoSystem将抛出异常“org.apache.hadoop.mapred.FileAlreadyExistsException”。

解决方案: - 始终在运行时指定输出目录名称(即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/