복붙노트

[HADOOP] Mapper and Reducer 클래스에서 변수를 공유하는 방법은 무엇입니까?

HADOOP

Mapper and Reducer 클래스에서 변수를 공유하는 방법은 무엇입니까?

매퍼와 감속기 클래스간에 변수를 공유하고 싶습니다. 시나리오는 다음과 같습니다 : -

내 입력 레코드가 A, B 및 C 유형이라고합시다.이 레코드를 처리 중이며 그에 따라 map 함수에서 output.collect의 키와 값을 생성합니다. 그러나 동시에 mapper 클래스에서 3 개의 정적 int 변수를 선언하여 A, B 및 C 레코드 유형의 수를 유지합니다. 이제 이러한 변수는 다양한 맵 스레드에 의해 업데이트됩니다. 모든 맵 작업이 끝나면 Reduce 함수에이 세 값을 전달하고 싶습니다.

어떻게 이것을 달성 할 수 있습니까? close () 메서드를 재정의하려고 시도했지만 모든 맵 함수가 실행 된 후 모든 맵 함수가 실행을 마친 후에 호출됩니다. 또는 변수를 공유하는 다른 방법이 있습니까? 내가 출력하고있는 처리 된 결과와 함께 각 레코드 유형의 총 수를 출력하고 싶습니다.

해결법

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

    1.카운터는 특별한 이유가 있습니다. 예를 들어, "NUMBER_OF_RECORDS_DISCARDED"와 같은 특정 상태의 수를 유지합니다. 그리고 나는이 카운터를 증가시키고 임의의 값으로 설정하지 않을 것입니다 (나는 틀릴 수도 있습니다). 하지만 메시지 전달자로 사용할 수는 있지만 더 나은 방법이 있습니다. 이는 작업 구성을 사용하여 변수를 완벽하게 설정하는 것입니다. 그러나 이것은 매퍼 (mapper) 또는 감속기 (reducer)에 맞춤 메시지를 전달하는 데에만 사용할 수 있으며 감속기에서는 매퍼 (mapper)의 변경 사항을 사용할 수 없습니다.

    카운터는 특별한 이유가 있습니다. 예를 들어, "NUMBER_OF_RECORDS_DISCARDED"와 같은 특정 상태의 수를 유지합니다. 그리고 나는이 카운터를 증가시키고 임의의 값으로 설정하지 않을 것입니다 (나는 틀릴 수도 있습니다). 하지만 메시지 전달자로 사용할 수는 있지만 더 나은 방법이 있습니다. 이는 작업 구성을 사용하여 변수를 완벽하게 설정하는 것입니다. 그러나 이것은 매퍼 (mapper) 또는 감속기 (reducer)에 맞춤 메시지를 전달하는 데에만 사용할 수 있으며 감속기에서는 매퍼 (mapper)의 변경 사항을 사용할 수 없습니다.

    이전 맵핑 된 API를 사용하여 메시지 / 변수 설정

    JobConf job = (JobConf) getConf();
    job.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
    

    새로운 mapreduce API를 사용하여 메시지 / 변수 설정하기 :

    Configuration conf = new Configuration();
    conf.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
    Job job = new Job(conf);
    

    Mapper and Reducer에서 이전 API를 사용하여 메시지 / 변수 가져 오기 : configure ()는 Mapper 및 Reducer 클래스에서 구현되어야하며 map () 또는 reduce () 내부에서 사용되도록 값을 클래스 멤버에 할당 할 수 있습니다.

    ...
    private String awesomeMessage;
    public void configure(JobConf job) {
        awesomeMessage = Long.parseLong(job.get("messageToBePassed-OR-anyValue"));
    }
    ...
    

    그런 다음 awesomeMessage 변수를 map 및 reduce 함수와 함께 사용할 수 있습니다.

    Mapper and Reducer에서 새 API를 사용하여 메시지 / 변수 가져 오기 : setup ()에서도 비슷한 일이 필요합니다.

    Configuration conf = context.getConfiguration();
    String param = conf.get("messageToBePassed-OR-anyValue");
    
  2. ==============================

    2.해결책을 얻었다.

    해결책을 얻었다.

    사용 된 카운터. Mapper와 Reducer의 기자반이 접근 할 수 있습니다.

  3. from https://stackoverflow.com/questions/14196097/how-to-share-a-variable-in-mapper-and-reducer-class by cc-by-sa and MIT license