2014-03-06 112 views
7

我試圖從集羣外部運行MapReduce作業。遠程運行Hadoop作業

例如Hadoop集羣正在Linux機器上運行。 我們有一個在Windows機器上運行的Web應用程序。 我們想從這個遠程web應用程序運行hadoop作業。 我們想要檢索hadoop輸出目錄並將其顯示爲圖形。

我們已經寫了下面的代碼:

Configuration conf = new Configuration(); 

Job job = new Job(conf); 

conf.set("mapred.job.tracker", "192.168.56.101:54311"); 

conf.set("fs.default.name", "hdfs://192.168.56.101:54310"); 

job.setJarByClass(Analysis.class) ; 
//job.setOutputKeyClass(Text.class); 
//job.setOutputValueClass(IntWritable.class); 

job.setMapperClass(Map.class); 
job.setReducerClass(Reduce.class); 



//job.set 

job.setInputFormatClass(CustomFileInputFormat.class); 
job.setOutputFormatClass(TextOutputFormat.class); 

FileInputFormat.addInputPath(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(IntWritable.class); 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(IntWritable.class); 


job.waitForCompletion(true); 

這是我們得到的錯誤。即使我們關閉了hadoop 1.1.2羣集,錯誤仍然是一樣的。

14/03/07 00:23:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
14/03/07 00:23:37 ERROR security.UserGroupInformation: PriviledgedActionException as:user cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-user\mapred\staging\user818037780\.staging to 0700 
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-user\mapred\staging\user818037780\.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 LineCounter.main(LineCounter.java:86) 
+1

嘗試在您的應用程序的類路徑中包含集羣中的mapred-ste.xml和hdfs-site.xml。通過調用addResource(Path)將這些文件添加到Configuration對象中。 – Venkat

+0

看到這個https://stackoverflow.com/questions/17444720/running-hadoop-in-windows-7-setting-via-cygwin-priviledgedactionexception-asp?rq=1 –

+0

底線,Hadoop內的一些代碼並不期望曾經在Windows環境中運行。我敢肯定,你可以爲它寫一個補丁,但如果這樣做工作太多,最好的方法可能是在運行之前將作業發送到Linux機器。 –

回答

2

從遠程系統運行時,應該以遠程用戶身份運行。你可以在你的主類,如下所示:

public static void main(String a[]) { 
    UserGroupInformation ugi 
    = UserGroupInformation.createRemoteUser("root"); 

    try { 


     ugi.doAs(new PrivilegedExceptionAction<Void>() { 

      public Void run() throws Exception { 
       Configuration conf = new Configuration(); 

       Job job = new Job(conf); 

       conf.set("hadoop.job.ugi", "root"); 

       // write your remaining piece of code here. 

       return null; 
      } 
     }); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

也同時提交MapReduce工作,它應該Java類與他們相關的罐子Hadoop集羣複製,它執行的MapReduce job.You可以讀到更多here

所以你需要在清單類路徑中創建一個可運行的jar代碼(在你的情況下帶有主類分析)和所有相關的jar文件。然後從你的命令行使用你的jar文件使用

java -jar job-jar-with-dependencies.jar arguments 

HTH!

+0

源代碼鏈接無效 –