簡體   English   中英

一個 mapreduce 程序的輸出作為另一個 mapreduce 程序的輸入

[英]output of one mapreduce program as input to another mapreduce program

我正在嘗試一個簡單的例子,其中一個 MapReduce 作業的輸出應該是另一個 MapReduce 作業的輸入。

流程應該是這樣的: Mapper1 --> Reducer1 --> Mapper2 --> Reducer2Mapper1 --> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM