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