복붙노트

[HADOOP] 메모리의 하둡 환원제 가치?

HADOOP

메모리의 하둡 환원제 가치?

나는 감속기에 많은 수의 값으로 끝날지도 모르는 MapReduce 작업을 작성 중입니다. 한 번에 메모리에로드되는 모든 값이 걱정됩니다.

Iterable 값의 기본 구현은 필요에 따라 값을 메모리에로드합니까? Hadoop : Definitive Guide는 이것이 그렇다고 제안하는 것처럼 보이지만 "결정적인"답을주지는 않습니다.

감속기 출력은 입력 된 값보다 훨씬 더 클 것이지만 출력이 필요에 따라 디스크에 기록됩니다.

해결법

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

    1.너는 책을 올바르게 읽는 중이다. 감속기는 모든 값을 메모리에 저장하지 않습니다. 대신 Iterable 값 목록을 반복 할 때 각 Object 인스턴스가 다시 사용되므로 지정된 시간에 하나의 인스턴스 만 유지합니다.

    너는 책을 올바르게 읽는 중이다. 감속기는 모든 값을 메모리에 저장하지 않습니다. 대신 Iterable 값 목록을 반복 할 때 각 Object 인스턴스가 다시 사용되므로 지정된 시간에 하나의 인스턴스 만 유지합니다.

    예를 들어 후속 코드에서 obj ArrayList는 루프 이후에 예상되는 크기를 가지지 만 모든 요소는 동일하게 유지되며 Text val 인스턴스는 반복 될 때마다 다시 사용됩니다.

    public static class ReducerExample extends Reducer<Text, Text, Text, Text> {
    public void reduce(Text key, Iterable<Text> values, Context context) {
        ArrayList<Text> objs = new ArrayList<Text>();
                for (Text val : values){
                        objs.add(val);
                }
        }
    }
    

    (어떤 이유로 든 각 val에 대해 추가 작업을 수행하려는 경우 깊은 복사본을 만들어 저장해야합니다.)

    물론 단일 값조차도 메모리보다 클 수 있습니다. 이 경우 개발자가 위의 매퍼에서 데이터를 축소하여 값이 너무 크지 않도록 조치하는 것이 좋습니다.

    업데이트 : Hadoop The Definitive Guide 2nd Edition의 199-200 페이지를보십시오.

    This code snippet makes it clear that the same key and value objects are used on each 
    invocation of the map() method -- only their contents are changed (by the reader's 
    next() method). This can be a surprise to users, who might expect keys and vales to be 
    immutable. This causes prolems when a reference to a key or value object is retained 
    outside the map() method, as its value can change without warning. If you need to do 
    this, make a copy of the object you want to hold on to. For example, for a Text object, 
    you can use its copy constructor: new Text(value).
    
    The situation is similar with reducers. In this case, the value object in the reducer's 
    iterator are reused, so you need to copy any that you need to retain between calls to 
    the iterator.
    
  2. ==============================

    2.전체적으로 메모리에있는 것이 아니라 일부가 디스크에서 비롯된 것입니다. 프레임 워크가 Iterable을 세그먼트로 분리하고 디스크를 메모리 1에 하나씩로드하는 것처럼 코드를 살펴보아야합니다.

    전체적으로 메모리에있는 것이 아니라 일부가 디스크에서 비롯된 것입니다. 프레임 워크가 Iterable을 세그먼트로 분리하고 디스크를 메모리 1에 하나씩로드하는 것처럼 코드를 살펴보아야합니다.

    org.apache.hadoop.mapreduce.task.ReduceContextImpl org.apache.hadoop.mapred.BackupStore

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

    3.다른 사용자가 인용 한 것처럼 전체 데이터가 메모리에로드되지 않았습니다. Apache 설명서 링크에서 mapred-site.xml 매개 변수 중 일부를 살펴보십시오.

    다른 사용자가 인용 한 것처럼 전체 데이터가 메모리에로드되지 않았습니다. Apache 설명서 링크에서 mapred-site.xml 매개 변수 중 일부를 살펴보십시오.

    mapreduce.reduce.merge.inmem.threshold
    

    기본값 : 1000입니다. 이는 메모리 내 병합 프로세스의 파일 수로 임계 값입니다.

    mapreduce.reduce.shuffle.merge.percent
    

    기본값은 0.66입니다. 메모리 내 병합이 시작될 사용 임계 값으로, mapreduce.reduce.shuffle.input.buffer.percent에 정의 된대로 메모리 내 맵 출력 저장에 할당 된 총 메모리의 백분율로 표시됩니다.

    mapreduce.reduce.shuffle.input.buffer.percent
    

    기본값은 0.70입니다. shuffle 동안 최대 힙 크기에서 맵 출력 저장에 할당 할 메모리의 백분율.

    mapreduce.reduce.input.buffer.percent
    

    기본값은 0입니다. 최대 힙 크기에 상대적인 메모리 비율 - 축소 중에지도 출력을 유지합니다. 셔플이 완료되면 메모리에 남아있는 맵 출력은이 임계 값보다 작아 져야 감소가 시작될 수 있습니다.

    mapreduce.reduce.shuffle.memory.limit.percent
    

    기본값은 0.25입니다. 단일 셔플이 소비 할 수있는 메모리 내 한계의 최대 백분율

  4. from https://stackoverflow.com/questions/11024638/hadoop-reducer-values-in-memory by cc-by-sa and MIT license