티스토리 뷰
하둡 클러스터 이전을 위해 ETL 을 등록하는데 이상하게 old 서버에서는 잘되는게, new 서버에서는 너~~무 느린문제가 있었다. 일단 성능개선을 위해 동일한 Hive 버전도 아니었고, 플랜도 다르게 돌아가는 상황이라 답답한 상황이었다.
우선 결론부터 말하면 리듀서가 14~26개 정도가 할당되었는데, JOIN 과 카디널리티가 높은 Group By 였기 때문에 이정도수로는 어림도 없는 수준이었기 때문에 너무 오래걸린 문제였다.
----------------------------------------------------------------------------------------------
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container SUCCEEDED 372 372 0 0 0 0
Map 7 .......... container SUCCEEDED 5 5 0 0 0 0
Reducer 2 . container RUNNING 24 6 18 0 0 0
Reducer 3 container INITED 26 0 0 26 0 0
Reducer 4 container INITED 26 0 0 26 0 0
Reducer 5 container INITED 14 0 0 14 0 0
Reducer 6 container INITED 14 0 0 14 0 0
----------------------------------------------------------------------------------------------
VERTICES: 02/07 [====================>>------] 79% ELAPSED TIME: 2234.24 s
----------------------------------------------------------------------------------------------
원인과 해결방법
근본적인 원인은 쿼리 조건의 특정한 필드값이 ENUM 과 같은 코드값이라 매우 적은 분포를 갖고 있는데(2~3개의 타입만 존재)
HIVE 에서 리소스를 이 필드를 보고 추정치를 계산하면서 리소스를 너무 적게 할당해서 병렬화가 충분하지 않은 문제였다.
근본적으로 보면 통계정보를 생성하지 않아서, HIVE 에서 잘못된 최적화를 유도하면서 나타난 문제였다.
(과거 버전에서 문제가 없던이유는 비용기반의 최적화를 기본으로 안사용해서 문제가 없었던 것이었다)
즉, HIVE 에서 올바른 최적화를 유도하기 위해 source 테이블을 집계후 통계정보도 만들도록 하면 된다.
ANALYZE TABLE 디비명.테이블명 PARTITION(ymd='2023-01-01', hh24='00') COMPUTE STATISTICS FOR COLUMNS;
또 다른 해결방법
결국은 HIVE 의 옵티마이저가 제대로 동작하게 하기위해 ANALYZE 를 돌렸는데, 결국은 추가 정보를 생성하는것이라 집계할때 생성하면 조회할때 유용하게 잘쓰지만 비용이 비싼 작업이다.
여러곳에서 쓰지 않는 테이블을 모두 통계정보를 만드는건 비용이 큰 작업이라는 말...
이럴때 할 수 있는 방법은 Cost Base Optimizer 관련된 옵션을 끄고 Rule Base Optimizer 를 사용하면 된다.
내가 겪었던 케이스에서는 아래 옵션만 false 로 바꾸면 되었는데, 혹시 비슷한데 단 케이스라면 hive 의 다른 CBO 관련 옵션을 false 처리후 돌려보도록 하자.
set hive.stats.fetch.column.stats=false;
'데이터처리 > Hive' 카테고리의 다른 글
[Hive] 파일포맷(orc, parquet, avro..) 별 테이블 생성과 압축방법 (0) | 2023.05.22 |
---|---|
[HIVE] HiveAccessControlException Permission denied 원인 (0) | 2023.02.16 |
[에러] beeline 에서 오류 원인 : Unexpected end of file when reading from HS2 server (0) | 2023.02.08 |
[Hive] select * from table 에서 필드 일부만 제외하는 방법? - 블랙리스트 방식 (0) | 2022.10.25 |
[HIVE] distinct count 문제 해결 및 튜닝방법 정리 (0) | 2022.06.08 |