Hive Mapper, Reduce 개수 최적화
Hive Mapper, Reduce 개수 최적화
· Version : Hive
하이브는 쿼리를 한 개 이상의 맵리듀스 잡으로 나누어 병렬로 처리한다. 맵리듀스는 다수의 맵퍼와 리듀서 태스크로 실행되는데 맵퍼와 리듀서의 수는 입력하는 데이터 크기, 데이터 수행 연산 종류 등 다양한 변수에 의존적이다. 너무 많은 맵퍼와 리듀서 태스크는 잡을 초기화 하고, 스케줄링하고 실행하기 위해 많은 오버헤드를 유발한다. 반대로 너무 적은 태스크는 클러스터가 가진 병렬처리의 장점을 잘 활용하지 못하게 된다.
리듀스 단계가 있는 하이브 쿼리를 실행하면 리듀서 수를 출력한다. GROUP BY는 항상 리듀서 단계가 필요하기 때문에 해당 구문이 포함한스크립트를 실행하면 사용된 맵퍼와 리듀서의 개수를 확인할 수 있다.
INFO : Hadoop job information for Stage-1: number of mappers: 5; number of reducers: 1 INFO : 2020-09-29 22:31:55,395 Stage-1 map = 0%, reduce = 0% INFO : 2020-09-29 22:32:04,712 Stage-1 map = 20%, reduce = 0%, Cumulative CPU 5.03 sec INFO : 2020-09-29 22:32:05,749 Stage-1 map = 60%, reduce = 0%, Cumulative CPU 12.13 sec INFO : 2020-09-29 22:32:09,885 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 19.8 sec INFO : 2020-09-29 22:32:16,080 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 25.89 sec INFO : MapReduce Total cumulative CPU time: 25 seconds 890 msec INFO : Ended Job = job_1591911716086_1525 INFO : MapReduce Jobs Launched: INFO : Stage-Stage-1: Map: 5 Reduce: 1 Cumulative CPU: 25.89 sec HDFS Read: 610485 HDFS Write: 775295 HDFS EC Read: 0 SUCCESS INFO : Total MapReduce CPU Time Spent: 25 seconds 890 msec INFO : Completed executing command(queryId=hive_20200929223144_877a1f4b-329b-4418-831d-89bcdc466f30); Time taken: 33.485 seconds INFO : OK |
하이브는 입력 크기에 따라 리듀서 개수를 정한다. fs -count 명령을 사용하여 하둡에서 사용하려는 파일을 지정하여 예상 리듀서의 개수를 확인할 수 있다.
hadoop fs -count /user/data/nclick/file.txt
결과 0 1 12469765 /user/data/nclick/file.txt |
리듀서의 개수는 하이브 속성중 hive.exec.reducers.bytes.per.reducer 에 설정된 수자를 파일 크기와 나눈값으로 계산할 수 있다. 설정 값은 사용자마다 다를 수 있다. 아래 스크립트는 hive.exec.reducers.bytes.per.reducer 속성값을 수정하는 명령이다. 단위가 바이트임을 주의한다.
set hive.exec.reducers.bytes.per.reducer=75000000 |
쿼리의 맵 단계에서 입력 데이터 크기보다 훨씬 많은 데이터를 만들어내는 경우가 있다. 맵 단계에서 과도한 데이터를 만들어내면 입력 데이터로 추정한 기본 리듀서의 수는 부족할 수 있으며 비슷하게 맵 함수가 입력 데이터의 많은 부분을 필터링 할 수도 있다. 그러면 기본값보다 적은 리듀서만 있어도 된다.리듀서의 태스크 수는 mapred.reduce.tasks 설정값으로 조절할 수 있다.
하둡 클러스터에는 태스크를 할당하는 고정된 크기의 슬롯이 있다. 한 개의큰 잡이 하둡의 모든 슬롯을 점유하면 다른 잡이 시작되지 못할 수 있다. hive.exec.reducers.max 설정 값을 조절하여 쿼리가 너무 많은 리듀서 자원을 사용하는 것을 예방할 수 있다.
하둡은 맵과 리듀스 태스크를 기동하고 스케줄링하는데 몇 초 정도 오버헤드가 발생한다. 성능 테스트를 수행할때 이러한 요인을 염두해 두어야 하며 특히 잡의 크기가 작을수록 이러한 부분을 염두해서 테스트를 진행해야한다.
2020-09-29 / Sungwook Kang / http://sungwookkang.com
Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, Hive, Hive tunning, 하이브 튜닝, MapReduce최적화, Map태스크, Reduce 태스크, 하이브 최적화