Hive 테이블의 많은 수의 작은 파일들 합치기

1 분 소요

아래의 문제들을 해결하기 위한 Hive 테이블을 구성하는 많은 수의 작은 파일들을 적은 수의 큰 파일들로 병합하는 2가지 방법

  • Hive로 여러개의 테이블을 생성해서 사용하다보면 어느 순간 쿼리 실행 시간이 늘어나는 현상 발생
  • HDFS에서 관련 테이블을 찾아보면 수 많은 파일들로 인해서 성능이 느려진것을 알 수 있음
  • 특히 실시간 로그 데이터를 Hive 테이블에 삽입 하다보면 기하급수적으로 파일 숫자가 늘어나서 문제가 될 수 있음

쿼리를 사용한 방법: INSERT OVERWRITE

  • 간단하게 Hive 쿼리를 통해서 테이블을 구성하는 작은 크기의 많은 수의 파일들을 합쳐주는 방법
  • 먼저 MapReduce 작업 수를 설정
    set mapred.reduce.tasks=1
    
  • 그리고 아래 쿼리를 실행해서 테이블 내용을 읽어서 다시 작은 수의 파일들로 병합
    insert overwrite table <table_name> select * from <table_name> limit 999999999
    
  • limit 다음에는 쿼리 실행 결과 출력되는 레코드 수보다 큰 값을 지정

Hive Merge 설정을 통한 방법

Hive 쿼리 실행 결과 출력 파일 수에 대한 설정

hive.merge 설정

아래 설정을 적용하여 Hive 쿼리 수행 후 많은 수로 생성된 결과 파일들을 병합

hive.merge.mapredfiles=true (default: false)
hive.merge.mapfiles=true (default: true)
hive.merge.size.per.task=256000000 (default: 256000000)
hive.merge.smallfiles.avgsize=200000000 (default: 16000000)
  • 출력 파일들의 평균 크기가 hive.merge.smallfiles.avgsize 보다 작으면 병합
  • 합병된 파일의 최대 크기는 hive.merge.size.per.task 의 설정 값을 따름

중간 결과 파일 압축 설정

압축을 활용하여 파일 처리 성능 향상

hive.exec.compress.intermediate=true
hive.intermediate.compression.codec=org.apache.hadoop.io.compress.GzipCodec
hive.intermediate.compression.type=BLOCK

References

댓글남기기