복붙노트

[HADOOP] 돼지에 유출 된 기억을 다루는 법

HADOOP

돼지에 유출 된 기억을 다루는 법

내 코드는 다음과 같습니다.

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt_grp = GROUP pymt BY key

results = FOREACH pymt_grp {

      /*
       *   some kind of logic, filter, count, distinct, sum, etc.
       */
}

하지만 지금은 많은 로그가 있습니다.

org.apache.pig.impl.util.SpillableMemoryManager: Spilled an estimate of 207012796 bytes from 1 objects. init = 5439488(5312K) used = 424200488(414258K) committed = 559284224(546176K) max = 559284224(546176K)

실제로 원인을 찾았습니다. 대다수의 이유는 IP 주소로 key = 0과 같은 "hot"키가 있지만이 키를 필터링하고 싶지 않기 때문입니다. 어떤 해결책이 있습니까? 내 UDF에 대수적 및 누적 기 인터페이스를 구현했습니다.

해결법

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

    1.심하게 왜곡 된 데이터 또는 FOREACH에 중첩 된 DISTINCT와 유사한 문제가있었습니다 (PIG는 메모리에서 별개의 작업을 수행함). 해결책은 FOREACH에서 DISTINCT를 빼내는 것이 었습니다. 예를 들어 PIG latin에서 그룹별로 구문을 최적화하는 방법에 대한 답을 참조하십시오.

    심하게 왜곡 된 데이터 또는 FOREACH에 중첩 된 DISTINCT와 유사한 문제가있었습니다 (PIG는 메모리에서 별개의 작업을 수행함). 해결책은 FOREACH에서 DISTINCT를 빼내는 것이 었습니다. 예를 들어 PIG latin에서 그룹별로 구문을 최적화하는 방법에 대한 답을 참조하십시오.

    SUM과 COUNT 이전에 DISTINCT를하지 않으려면 2 GROUP BY를 사용하는 것이 좋습니다. 첫 번째 그룹은 Key 열과 다른 열 또는 임의의 숫자 mod 100에 그룹화되며, Salt (단일 키의 데이터를 여러 Reducers로 확산) 역할을합니다. 두 번째 GROUP BY보다 키 열과 그룹 1 COUNT 또는 합계의 최종 SUM을 계산합니다.

    전의:

    inpt = load '/data.csv' using PigStorage(',') as (Key, Value);
    view = foreach inpt generate Key, Value, ((int)(RANDOM() * 100)) as Salt;
    
    group_1 = group view by (Key, Salt);
    group_1_count = foreach group_1 generate group_1.Key as Key, COUNT(view) as count;
    
    group_2 = group group_1_count by Key;
    final_count = foreach group_2 generate flatten(group) as Key, SUM(group_1_count.count) as count;
    
  2. from https://stackoverflow.com/questions/11999268/how-to-handle-spill-memory-in-pig by cc-by-sa and MIT license