win7使用eclipse連接hadoop集羣,運行mapreduce報錯之Failed to set permissions of path

在win7上使用eclipse連接hadoop集羣運行mapreduce任務(Java編寫)時出現如下錯誤提示,導致運行mapreduce作業失敗

15/09/05 20:42:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

15/09/05 20:42:58 INFO security.JniBasedUnixGroupsMappingWithFallback: Falling back to shell based
15/09/05 20:42:59 ERROR security.UserGroupInformation: PriviledgedActionException as:lenovo cause:java.io.IOException: Failed to set permissions of path: \home\suh\hadoop-1.2.1\tmp\mapred\staging\lenovo1496408529\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \home\suh\hadoop-1.2.1\tmp\mapred\staging\lenovo1496408529\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)
at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)
at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349)
at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193)
at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
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:1190)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at org.dataguru.mr.kpi.MinTemperature.run(MinTemperature.java:86)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.dataguru.mr.kpi.MinTemperature.main(MinTemperature.java:127)


問題分析:
關鍵錯誤信息“Failed to set permissions of path”,這個打印信息是hadoop源碼裏 hadoop-1.2.1\src\core\org\apache\hadoop\fs\FileUtil.java 裏checkReturnValue方法拋出的IOException。
所以只需要將裏面的異常註釋掉,或改爲警告信息即可,我將其改爲警告,不拋出運行時IO異常。
  private static void checkReturnValue(boolean rv, File p, 
                                       FsPermission permission
                                       ) throws IOException {
    if (!rv) {
      LOG.warn("Failed to set permissions of path: " + p + 
                            " to " + 
                            String.format("%04o", permission.toShort()));
 //throw new IOException("Failed to set permissions of path: " + p + 
      //                      " to " + 
      //                      String.format("%04o", permission.toShort()));
    }
  }


解決方案:
方案一:(本人採用的辦法)
將checkReturnValue方法改寫後,直接把FileUtil.java直接放到項目工程中,注意路徑必須爲org.apache.hadoop.fs.FileUtil.java;


方案二:
將checkReturnValue方法改寫後,將hadoop-1.2.1\src\core包重新編譯(可以使用ant,也可以直接使用eclipse),編譯成hadoop-1.2.1-core.jar,然後替換hadoop集羣中的該jar文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章