복붙노트

[HADOOP] MR 작업의 축소 작업에서 성공적인지도 작업 수에 액세스하는 방법이 있습니까?

HADOOP

MR 작업의 축소 작업에서 성공적인지도 작업 수에 액세스하는 방법이 있습니까?

하둡 감속기에서는 현재 작업에서 얼마나 많은지도 작업이 실행되었는지 알 필요가 있습니다. 나는 내가 할 수있는 한 잘 작동하지 않는다는 다음을 생각 해냈다.

    Counter totalMapsCounter = 
        context.getCounter(JobInProgress.Counter.TOTAL_LAUNCHED_MAPS);
    Counter failedMapsCounter = 
        context.getCounter(JobInProgress.Counter.NUM_FAILED_MAPS);
    long nSuccessfulMaps = totalMapsCounter.getValue() - 
                           failedMapsCounter.getValue();

양자 택일로, 만약 내가 (다시, 내 reducers 내에서) 입력 분할의 총 수 (아니 파일의 수를 하나의 파일에 대한 분할이 아니라, 작업에 대한 총 분할)을 검색 할 수있는 좋은 방법이있다, 그 아마 또한 작업. (내 직업이 정상적으로 완료되었다고 가정하면, 그 숫자는 같아야합니다.)

해결법

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

    1.편집 : 맵에서 카운터를 검색하고 Job 또는 JobConf를 사용하여 작업을 줄이는 것이 좋지 않은 것처럼 보입니다. 매퍼 (mapper)에서 감속기 (reducer)로 요약 정보를 전달하기위한 대체 접근법입니다. 이 접근법은 코드 작성 노력이 필요하지만 실행 가능합니다. 이 기능이 Hadoop에 포함되어 있고 코드를 건네 줄 필요가 없다면 좋았을 것입니다. 이 기능을 Hadoop에 넣고 응답을 기다리라고 요청했습니다.

    편집 : 맵에서 카운터를 검색하고 Job 또는 JobConf를 사용하여 작업을 줄이는 것이 좋지 않은 것처럼 보입니다. 매퍼 (mapper)에서 감속기 (reducer)로 요약 정보를 전달하기위한 대체 접근법입니다. 이 접근법은 코드 작성 노력이 필요하지만 실행 가능합니다. 이 기능이 Hadoop에 포함되어 있고 코드를 건네 줄 필요가 없다면 좋았을 것입니다. 이 기능을 Hadoop에 넣고 응답을 기다리라고 요청했습니다.

    JobCounter.TOTAL_LAUNCHED_MAPS는 구형 MR API가있는 Reducer 클래스의 아래 코드를 사용하여 검색되었습니다.

    private String jobID;
    private long launchedMaps;
    
    public void configure(JobConf jobConf) {
    
        try {
            jobID = jobConf.get("mapred.job.id");
    
            JobClient jobClient = new JobClient(jobConf);
    
            RunningJob job = jobClient.getJob(JobID.forName(jobID));
    
            if (job == null) {
                System.out.println("No job with ID found " + jobID);
            } else {
                Counters counters = job.getCounters();
                launchedMaps = counters.getCounter(JobCounter.TOTAL_LAUNCHED_MAPS);
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    새 API를 사용하면 Reducer 구현은 JobContext # getConfiguration ()을 통해 작업 구성에 액세스 할 수 있습니다. 위의 코드는 Reducer # setup ()에서 구현할 수 있습니다.

    이전 MR API의 Reducer # configure () 및 새 MR API의 Reducer # setup ()은 Reducer.reduce ()가 호출되기 전에 각 reduce 작업마다 한 번 호출됩니다.

    BTW, 작업을 쫓아 낸 카운터 옆에있는 다른 JVM에서 카운터를 가져올 수도 있습니다.

    JobInProgress는 아래와 같이 정의되어 있으므로 사용해서는 안됩니다. 이 API는 제한된 프로젝트에만 사용되며 인터페이스가 변경 될 수 있습니다.

    @ InterfaceAudience.LimitedPrivate ({ "MapReduce"}) @ InterfaceStability.Unstable

    그렇지 않습니다. JobCounter.TOTAL_LAUNCHED_MAPS에는 추측 실행으로 시작된지도 작업도 포함됩니다.

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

    2.새 API를 사용하여 하나의 사용자 정의 카운터 (Enum in Mapper)와 Inbuilt 카운터를 검색했습니다. 이것은 내 감속기의 코드입니다 : 이것은 감속기의 설치 방법에 있습니다. 거기에 Old API (맵핑 된 패키지)의 일부 클래스를 사용해야하지만,

    새 API를 사용하여 하나의 사용자 정의 카운터 (Enum in Mapper)와 Inbuilt 카운터를 검색했습니다. 이것은 내 감속기의 코드입니다 : 이것은 감속기의 설치 방법에 있습니다. 거기에 Old API (맵핑 된 패키지)의 일부 클래스를 사용해야하지만,

        JobContext jobContext= new JobContext(context.getConfiguration(), context.getJobID());
        Configuration c= jobContext.getConfiguration();
    
        jobID=c.get("mapred.job.id");
        //jobId= JobID.forName(jobID);
    
        JobClient jobClient = new JobClient(new JobConf(c));
    
        RunningJob job = jobClient.getJob((org.apache.hadoop.mapred.JobID) JobID.forName(jobID));
    
        Counters counters = job.getCounters();
    
        long customCounterCount= counters.getCounter(WordCountMapper.CustomCounters.COUNT);
    
        long totalMapInputRecords = counters.getCounter(Task.Counter.MAP_INPUT_RECORDS);
    
        System.out.println("customCounterCount==> " + customCounterCount);
        System.out.println("totalMapInputRecords==> " + totalMapInputRecords);
    
  3. from https://stackoverflow.com/questions/8009802/is-there-a-way-to-access-number-of-successful-map-tasks-from-a-reduce-task-in-an by cc-by-sa and MIT license