[英]output of one mapreduce program as input to another mapreduce program
我正在嘗試一個簡單的例子,其中一個 MapReduce 作業的輸出應該是另一個 MapReduce 作業的輸入。
流程應該是這樣的: Mapper1 --> Reducer1 --> Mapper2 --> Reducer2
( Mapper1 --> Reducer1 --> Mapper2 --> Reducer2
的輸出必須是Reducer1的輸入。Reducer1的輸出必須是Mapper2的輸入。Mapper2的輸出必須是Reducer2 的輸入。Reducer2 的輸出必須存儲在輸出文件中)。
如何將多個 Mappers 和 Reducers 添加到我的程序中,以便像上面一樣維護流程?
我需要使用 Chain Mappers 或 Chain Reducers 嗎? 如果是這樣,我該如何使用它們?
您需要為此實現兩個單獨的 MapReduce 作業。 第一個作業的結果需要寫入一些持久存儲(如 HDFS),並由第二個作業讀取。 SequenceOutputFormat/InputFormat 通常用於此目的。 兩個 MapReduce 作業都可以從同一個驅動程序執行。
我猜你要找的是 ControlledJob 和 JobControl。 它恰如其分地符合您的目的。 在單個 Driver 類中,您可以構建多個相互依賴的作業。 以下代碼可能會幫助您理解。
Job jobOne = Job(jobOneConf, "Job-1");
FileInputFormat.addInputPath(jobOne, jobOneInput);
FileOutputFormat.setOutputPath(jobOne, jobOneOutput);
ControlledJob jobOneControl = new ControlledJob(jobOneConf);
jobOneControl.setJob(jobOne);
Job jobTwo = Job(jobTwoConf, "Job-2");
FileInputFormat.addInputPath(jobTwo, jobOneOutput); // here we set the job-1's output as job-2's input
FileOutputFormat.setOutputPath(jobTwo, jobTwoOutput); // final output
ControlledJob jobTwoControl = new ControlledJob(jobTwoConf);
jobTwoControl.setJob(jobTwo);
JobControl jobControl = new JobControl("job-control");
jobControl.add(jobOneControl);
jobControl.add(jobTwoControl);
jobTwoControl.addDependingJob(jobOneControl); // this condition makes the job-2 wait until job-1 is done
Thread jobControlThread = new Thread(jobControl);
jobControlThread.start();
jobControlThread.join();
/* The jobControl.allFinished() can also be used to wait until all jobs are done */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.