복붙노트

[HADOOP] 하나의 mapreduce 프로그램을 다른 mapreduce 프로그램에 입력으로 출력

HADOOP

하나의 mapreduce 프로그램을 다른 mapreduce 프로그램에 입력으로 출력

하나의 MapReduce 작업의 출력이 다른 MapReduce 작업의 입력이어야하는 간단한 예제를 시도하고 있습니다.

흐름은 다음과 같아야합니다 : Mapper1 -> Reducer1 -> Mapper2 -> Reducer2 (Mapper1의 출력은 Reducer1의 입력이어야합니다.) Reducer1의 출력은 Mapper2의 입력이어야하며, Mapper2의 출력은 Reducer2의 출력은 Reducer2의 출력을 출력 파일에 저장해야합니다.

흐름이 위와 같이 유지되도록 프로그램에 여러 개의 매퍼와 환원 장치를 추가하려면 어떻게합니까?

Chain Mappers 또는 Chain Reducer를 사용해야합니까? 그렇다면 어떻게 사용할 수 있습니까?

해결법

  1. ==============================

    1.이를 위해 두 개의 별도 MapReduce 작업을 구현해야합니다. 첫 번째 작업의 결과는 일부 영구 저장소 (예 : HDFS)에 기록되어야하며 두 번째 작업에서 읽을 수 있어야합니다. SequenceOutputFormat / InputFormat이 자주 사용됩니다. 두 MapReduce 작업 모두 동일한 드라이버 프로그램에서 실행할 수 있습니다.

    이를 위해 두 개의 별도 MapReduce 작업을 구현해야합니다. 첫 번째 작업의 결과는 일부 영구 저장소 (예 : HDFS)에 기록되어야하며 두 번째 작업에서 읽을 수 있어야합니다. SequenceOutputFormat / InputFormat이 자주 사용됩니다. 두 MapReduce 작업 모두 동일한 드라이버 프로그램에서 실행할 수 있습니다.

  2. ==============================

    2.나는 당신이 찾고있는 것이 ControlledJob과 JobControl이라고 생각한다. 그것은 당신의 목적에 알 맞습니다. 단일 Driver 클래스에서는 서로에 대한 종속성이있는 여러 작업을 빌드 할 수 있습니다. 다음 코드는 여러분이 이해하는 데 도움이 될 것입니다.

    나는 당신이 찾고있는 것이 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 */
    
  3. from https://stackoverflow.com/questions/30852335/output-of-one-mapreduce-program-as-input-to-another-mapreduce-program by cc-by-sa and MIT license