복붙노트

[HADOOP] 매퍼의 단일 출력에서 ​​여러 감속기를 실행

HADOOP

매퍼의 단일 출력에서 ​​여러 감속기를 실행

map reduce를 사용하여 왼쪽 조인 기능을 구현하고 있습니다. 왼쪽에는 약 6 억 개의 레코드가 있고 오른쪽에는 약 2,300 만 개의 레코드가 있습니다. 매퍼에서 왼쪽 조인 조건에 사용 된 열을 사용하여 키를 만들고 키 값 출력을 매퍼에서 감속기로 전달합니다. 두 테이블의 값 수가 많은 매퍼 키가 거의 없기 때문에 성능 문제가 발생합니다 (예 : 각각 456789 및 78960). 다른 감속기가 작업을 마치더라도이 감속기는 더 오랜 시간 동안 계속 작동합니다. 성능을 향상시키기 위해 여러 리듀서가 매퍼의 동일한 키-값 출력에서 ​​병렬로 작업 할 수있는 방법이 있습니까?

이것은 내가 최적화하려는 Hive 쿼리입니다.

select distinct 
        a.sequence, 
        a.fr_nbr, 
        b.to_nbr, 
        a.fr_radius,
        a.fr_zip, 
        a.latitude as fr_latitude, 
        a.longitude as fr_longitude, 
        a.to_zip, 
        b.latitude as to_latitude, 
        b.longitude as to_longitude,
        ((2 * asin( sqrt( cos(radians(a.latitude)) * cos(radians(b.latitude)) * pow(sin(radians((a.longitude - b.longitude)/2)), 2) + pow(sin(radians((a.latitude - b.latitude)/2)), 2) ) )) * 6371 * 0.621371) as distance,
        a.load_year, 
        a.load_month
from common.sb_p1 a LEFT JOIN common.sb__temp0u b    
        on a.to_zip=b.zip
            and a.load_year=b.load_year
            and a.load_month=b.load_month
where   b.correction = 0 
        and a.fr_nbr <> b.to_nbr 
        and ((2 * asin( sqrt( cos(radians(a.latitude)) * cos(radians(b.latitude)) * pow(sin(radians((a.longitude - b.longitude)/2)), 2) + pow(sin(radians((a.latitude - b.latitude)/2)), 2) ) )) * 6371 * 0.621371 <= a.fr_radius)

다른 해결책도 인정 될 것이다.

해결법

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

    1.UNION ALL을 사용하여 기울어 진 키를 분리하십시오.

    UNION ALL을 사용하여 기울어 진 키를 분리하십시오.

    select * from table1 a left join table2 b on a.key=b.key
    where a.key not in (456789,78960)
    union all
    select * from table1 a left join table2 b on a.key=b.key
    where a.key = 456789
    union all
    select * from table1 a left join table2 b on a.key=b.key
    where a.key = 78960
    ;
    

    이러한 하위 쿼리는 병렬로 실행되며 기울어 진 키는 단일 감속기로 분배되지 않습니다.

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

    2.이를 위해 HiveQL 사용을 고려할 수도 있습니다. 그것은 위에서 언급 한 것과 같은 상황을 의미하며 맵 감소 구현의 복잡성을 처리합니다.

    이를 위해 HiveQL 사용을 고려할 수도 있습니다. 그것은 위에서 언급 한 것과 같은 상황을 의미하며 맵 감소 구현의 복잡성을 처리합니다.

  3. from https://stackoverflow.com/questions/40095103/run-multiple-reducers-on-single-output-from-mapper by cc-by-sa and MIT license