2

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

4 回答 4

4

如果我的理解有误,请纠正我。在上面的代码中,您指的是“/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,它会说“输出目录hdfs://<nameNode>:<port>/Users/msadri/...已经存在”

如果没有必要,排除它。请让我知道你的回应..

于 2013-08-26T08:39:07.933 回答
0

你也可以试试这个

如果已存在,则删除输出文件夹。

于 2014-04-24T06:53:37.583 回答
0

你可以试试

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

//to

FileSystem fs = FileSystem.get(jobConf);
fs.delete(outputDir, true);
于 2013-08-24T05:34:00.143 回答
-1

您遇到上述异常是因为您的输出目录(/Users/msadri/Documents/files/linkage_output)已经在 HDFS 文件系统中创建/存在

请记住,在运行 map reduce 作业时,请务必提及 HDFS 中已经存在的输出目录。请参阅以下说明,这将帮助您解决此异常

要运行 map reduce 作业,您必须编写类似于以下命令的命令

$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 生态系统将抛出异常“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/

于 2015-09-08T07:02:27.140 回答