복붙노트

[HADOOP] 어떤 기준으로지도 제작 프레임 워크가 결합기를 시작할지 여부를 결정합니다.

HADOOP

어떤 기준으로지도 제작 프레임 워크가 결합기를 시작할지 여부를 결정합니다.

정의에 따라 "Combiner는 매퍼와 감속기 사이의 각 키에서 0, 1 또는 여러 번 호출 될 수 있습니다." 나는 어떤 기준으로 mapreduce framework가 얼마나 많은 시간에 cobiner가 시작될 것인가를 결정하기를 원한다.

해결법

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

    1.단순히 디스크에 유출되는 횟수. 정렬은 MapOutputBuffer가 채워진 후에 발생하며, 동시에 결합이 수행됩니다.

    단순히 디스크에 유출되는 횟수. 정렬은 MapOutputBuffer가 채워진 후에 발생하며, 동시에 결합이 수행됩니다.

    io.sort.mb, io.sort.spill.percent, io.sort.record.percent 매개 변수를 사용하여 유출 횟수를 디스크에 맞게 조정할 수 있습니다.이 값은 설명서 (설명서 및 온라인 리소스)에서도 설명되어 있습니다.

    특정 수의 결합기 실행에 대한 예 :

    MapOutputBuffer가 완전히 채워지지 않더라도,이 버퍼는 맵 스테이지의 끝에서 플러시되어야하며, 따라서 결합기가 적어도 한 번 (정의 된 경우) 실행되도록 트리거합니다.

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

    2.우선, Thomas Jungblut의 대답은 훌륭합니다. 그리고 저는 저에게 upvote를주었습니다. 필자가 추가하고자하는 유일한 점은 매퍼 출력이 비어 있거나 한 쌍인 경우를 제외하고는 Combiner가 정의 된 경우 매퍼마다 항상 한 번 이상 실행된다는 것입니다. 따라서 매퍼에서 결합자를 실행하지 않는 것이 가능하지만 매우있을 법하지 않습니다.

    우선, Thomas Jungblut의 대답은 훌륭합니다. 그리고 저는 저에게 upvote를주었습니다. 필자가 추가하고자하는 유일한 점은 매퍼 출력이 비어 있거나 한 쌍인 경우를 제외하고는 Combiner가 정의 된 경우 매퍼마다 항상 한 번 이상 실행된다는 것입니다. 따라서 매퍼에서 결합자를 실행하지 않는 것이 가능하지만 매우있을 법하지 않습니다.

  3. ==============================

    3.조건에 따라 결합자를 호출하는 로직을 가진 소스 코드.

    조건에 따라 결합자를 호출하는 로직을 가진 소스 코드.

    1950 ~ 1955 라인 /hadoop/mapred/MapTask.java

     if (combinerRunner == null || numSpills < minSpillsForCombine) {
         Merger.writeFile(kvIter, writer, reporter, job);
     } else {
         combineCollector.setWriter(writer);
         combinerRunner.combine(kvIter, combineCollector);
     }
    

    따라서 Combiner는 다음 경우에 실행됩니다.

    정의되지 않았으며 스필이 minSpillsForCombine보다 큰 경우. minSpillForCombine은 기본값이 3 인 "mapreduce.map.combine.minspills"속성에 의해 구동됩니다.

  4. from https://stackoverflow.com/questions/17160852/on-what-basis-mapreduce-framework-decides-whether-to-launch-a-combiner-or-not by cc-by-sa and MIT license