2013-08-20 106 views
2

我使用以下運行代碼運行mapreduce作業,它一直給我以下例外。我確保在開始作業前刪除文件夾,但不起作用。Mapreduce Hadoop作業異常輸出目錄已存在

代碼:

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

接受其中U發現有用 –

回答

4

糾正我,如果我的理解是錯誤的。在上面的代碼,你指的是「/ Users/msadri/Documents/.....」,在本地文件系統中不是這樣。它看起來像core-site.xml中的fs.defaultFS指向文件:///,而不是羣集的hdfs地址。

1)如果您需要根據您的要求指向本地文件系統,請嘗試此操作。

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

2)如果是有望指向HDFS那麼請檢查覈心的site.xml並在這,fs.defaultFS必須指向hdfs://<nameNode>:<port>/然後再試一次.. (錯誤消息說你指向本地文件系統。如果它指向HDFS,它會說:「輸出目錄hdfs://<nameNode>:<port>/Users/msadri/...已經存在」

規則這一點,如果它不是必需的。請讓我知道你的反應..

+0

工作正如@Srini說,**但是如果輸出目錄在HDFS中,那麼我們所要做的就是** FileSystem.get(conf).delete(outputDir,true); ** –

0

你可以嘗試爲

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

//to 

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

謝謝你的回答,這是一個好主意,但仍是異常發生。 – msadri

+0

檢查fs.exists(outputDir)返回true,輸入參數是什麼? – sethi

+0

也使用文件系統,如果我們需要指向本地文件系統,然後我們就可以使用** FileSystem.getLocal(CONF).delete(outputDir,真)不會在S3 – msadri

0

你可以試試this too

如果已經存在,刪除輸出文件夾。

0

你得到例外上面,因爲你的輸出目錄(/用戶/ msadri /文件/文件/ linkage_output)已創建/存在於HDFS文件系統

只要記住在運行圖減少工作做提輸出目錄已經在HDFS中。請參考下面的指令,這將有助於你解決這個異常

要運行圖減少你必須寫類似下面的命令

$ Hadoop的罐子{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罐子facebookCrawler.jar com.wagh.wordcountjob.WordCount /home/facebook/facebook-cocacola-page.txt /家/實/履帶輸出

只需注意{output_directory_path}即/ home/facebook/crawler輸出。如果您已經在HDFS中創建了這個目錄結構,那麼Hadoop EcoSystem會拋出異常「org.apache.hadoop.mapred.FileAlreadyExistsException」。

解決方案: -總是在運行時指定輸出目錄名稱(即Hadoop會自動爲您創建目錄,您不必擔心輸出目錄的創建)。 如在上面的例子中相同的命令可以在下面的方式下運行提及 -

「的hadoop罐子facebookCrawler.jar com.wagh.wordcountjob.WordCount /home/facebook/facebook-cocacola-page.txt /家/實/履帶輸出-1"

所以輸出目錄{履帶輸出-1}將在由Hadoop的生態系統的運行時創建。

欲瞭解更多詳細信息,您可以參考: - http://techpost360.blogspot.com/2015/09/hadoop-file-already-exists-exception.html

相關問題