본문 바로가기
빅데이터/hive

[hive] dynamic partition 에서 리듀서를 하나만 사용하는 오류 수정

by hs_seo 2017. 11. 15.

하이브에서 다이나믹 파티션을 이용할 때 리듀서가 100개가 생겨도 

하나의 리듀서만 이용하여 데이터를 생성하여 작업이 오래 걸리는 경우가 있다. 


예를 들어 작업중 다음과 같은 쿼리를 이용하여 데이터를 적재하면 dynamic_partition 칼럼의 값을 이용하여 

파티션을 생성하고 값을 입력하게 된다. 


INSERT INTO TABLE target_table PARTITION (dynamic_partition_col)

SELECT col1, col2, dynamic_partition FROM source_table;


이때 dynamic_partition 칼럼의 값이 2개여서 파티션이 2개만 생성되게 되는데 

리듀서가 100개 생성되어도 마지막 리듀서 2개만 사용하여 데이터를 쓰는 문제가 발생하였다. 


이때 static partition 을 이용하여 데이터를 입력해도 문제가 해결되었지만, 

꼭 dynamic partition을 이용해야 하는 경우가 있다. 

* static partition으로도 문제가 해결되지 않는 경우도 있다. 


이때 다음의 옵션을 false 로 설정하면 여러개의 리듀서를 이용하여 값을 쓰게 된다. 


SET hive.optimize.sort.dynamic.partition=false;

[hive configuration의 설명]

When enabled, dynamic partitioning column will be globally sorted. This way we can keep only one record writer open for each partition value in the reducer thereby reducing the memory pressure on reducers.


위의 설명에 따르면 "동적파티션 칼럼을 전역적으로 정렬하게 된다. 이렇게 되면 각 리듀서에 하나의 recrod writer만 열어서 메모리의 입력을 줄일수 있다."고 한다. 

동적파티션 대상 파티션이 수백, 수천개일 경우에 사용하게 되면 성능 향상을 기대할 수 있지 않을까 싶다. 


http://www.ericlin.me/2016/03/hive-dynamic-insert-query-only-uses-1-reducer-out-of-thousands-of-reducers/

반응형