2013-03-21 77 views
2

我想弄清楚如何鏈接多個hadoop作業,輸入一個步驟輸入下一步的輸入。我通過google搜索發現了很多東西,我應該從一個線程一次一個地調用它們,然後等待完成,或者我應該使用Job.addDependingJob(),然後提交它們。我選擇了後者,但我似乎無法在前一個作業完成後執行後續作業。鏈接多個hadoop作業,無需等待提交

這裏是我的代碼:

List<Job> jobs = new ArrayList<Job>(); 

for(int i = 0; i < stepCount; i++) { 
    JobConf jc = new JobConf(clusterConfig); 

    ... set up mappers and reducers here ... 

    ... set up input and output paths here ... 

    Job j = new Job(jc); 
    j.addDependingJob(jobs.get(jobs.size() - 1); 
    jobs.add(j); 
} 

for(Job j : Jobs) { 
    JobClient client = new JobClient(); 
    client.init(j.getJobConf()); 
    client.submit(j.getJobConf()); 
} 

所有作業同時運行,而我得到的輸出是這樣的:

  • 沒有工作的jar文件集。用戶類可能找不到。請參閱JobConf(Class)或JobConf#setJar(String)。
  • 要處理的總輸入路徑:1
  • 使用GenericOptionsParser解析參數。應用程序應該實現相同的工具。
  • 沒有作業jar文件集。用戶類可能找不到。請參閱JobConf(Class)或JobConf#setJar(String)。
  • 要處理的總輸入路徑:0
  • 使用GenericOptionsParser解析參數。應用程序應該實現相同的工具。
  • 沒有作業jar文件集。用戶類可能找不到。請參閱JobConf(Class)或JobConf#setJar(String)。
  • 要處理的總輸入路徑:0
  • 使用GenericOptionsParser解析參數。應用程序應該實現相同的工具。
  • 沒有作業jar文件集。用戶類可能找不到。請參閱JobConf(Class)或JobConf#setJar(String)。
  • 總輸入路徑的過程:0

我在做什麼錯?

注:我使用Hadoop 0.20.205

編輯澄清:我需要能夠將作業提交鏈的集羣,然後立即返回,而不等待作業鏈來完成。

回答

2

JobControl應該用來設置作業之間的依賴關係。在給定的代碼中沒有設置依賴項,所以作業並行運行,而不是按順序運行。如果有更復雜的工作流程,那麼可以使用Oozie。

Here是一個有趣的文章。

+0

JobControl適用於作業排序,但我需要能夠將作業鏈提交到羣集並立即返回(而不是等待作業完成)。 JobControl或其他一些madoop機制能夠做到這一點嗎? – Seth 2013-03-21 16:43:37

-1

以下是鏈接地圖縮小作業的方式。在這裏,我們對第一份工作的輸出運行的第二份工作:

 Job job1 = new Job(conf, "job1"); 
    Job job2 = new Job(conf,"job2"); 
    job1.setJarByClass(driver.class); 
    job1.setMapperClass(Map.class); 
    job1.setCombinerClass(Reduce.class); 
    job1.setReducerClass(Reduce.class); 
    job1.setOutputKeyClass(Text.class); 
    job1.setOutputValueClass(IntWritable.class); 
    String outputpath="/user/hadoop/firstjoboutput"; 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(outputpath)); 
    job1.waitForCompletion(true); 

    job2.setJarByClass(driver.class); 
    job2.setMapperClass(SecondMap.class); 
    job2.setReducerClass(SecondReducer.class); 
    job2.setMapOutputKeyClass(IntWritable.class); 
    job2.setMapOutputValueClass(Text.class); 
    job2.setOutputKeyClass(Text.class); 
    job2.setOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job2, new Path(outputpath)); 
    String finaloutput="/user/hadoop/finaloutput"; 
    FileOutputFormat.setOutputPath(job2, new Path(finaloutput)); 


    System.exit(job2.waitForCompletion(true) ? 0 : 1); 
1

這是一個幾年,因爲我已經經歷了這一點,但我看到有兩件事情:

  1. 你的錯誤,不要」與工作之間的鏈接沒有任何關係。確保您可以在擔心鏈接之前讓單個作業運行。
  2. Jobcontrol沒有(或者至少在2010年沒有)將作業順序提交給作業追蹤器,它只是一個工具來處理上游作業完成時的檢查,並自動提交作業追蹤器的下一個作業。你將無法運行它並退出。
  3. 你不應該打電話提交作業。提交它們運行。你應該把控制權交給那裏的某個地方的工作控制。

我認爲這很讓人困惑,並且開始在https://github.com/kevinpet/jobcontrol上編寫我自己的DAG幫助程序,您可能會也可能不會覺得有用。