소규모 파일이 야기하는 문제점
HDFS에서 소규모 파일이过多하게 되면 다음과 같은 문제가 발생할 수 있습니다:
- 네임노드 메모리 부하: HDFS 파일은 데이터 블록과 메타정보(위치, 크기, 분할 정보 등)를 포함합니다. 이 메타정보는 네임노드 메모리에 저장되며, 각 객체당 약 150바이트를 차지합니다. 천만 개의 파일과 블록이 있으면 약 3GB의 메모리를 사용하게 되어 네임노드 성능이 저하됩니다.
- 입출력 성능 저하: 소규모 파일读写 시마다 네임노드에서 메타정보를 조회하고 해당 데이터노드에 연결을 수립해야 하므로 시간이 소요됩니다.
- MapReduce 성능 영향: Hive 관점에서 소규모 파일은 많은 map 태스크를 생성합니다. 각 map은 별도의 JVM에서 실행되므로 초기화, 실행 비용이 발생하여 성능이 저하됩니다.
Hive에서 소규모 파일이 생성되는 원인
소규모 파일이 발생하는 주요 원인은 다음과 같습니다:
- 원본 데이터 자체에 많은 소규모 파일이 포함되어 있는 경우
- 동적 파티션 사용 시 과도한 소규모 파일 생성
- reduce 개수가 많을수록 출력 파일 수도 증가
- 파티션별 데이터 삽입 시 파일 수 = map 태스크 수 × 파티션 수
참고: map 수 설정은 소규모 파일 증대에 직접적인 영향을 주지 않습니다. map은 처리 과정의 초기 단계이며,reduce 단계에서 소규모 파일 문제가 발생할 수 있습니다.
Hive는 hive.exec.reducers.bytes.per.reduce 기본값 1GB를 기준으로 reducer 개수를 산정합니다. reducer 수가 증가하면 결과 파일 수도 증가하여 소규모 파일 문제가 발생합니다.
해결 방안
소규모 파일 문제는 두 가지 방향으로 해결할 수 있습니다:
- Map 입력 전 파일 병합
- 출력 결과 파일 병합
Map 입력 파일 병합 설정
--map 태스크당 최대 입력 크기 설정 (256MB)
set mapred.max.split.size=268435456;
--단일 노드에서 스플릿 최소 크기 (100MB)
set mapred.min.split.size.per.node=104857600;
--단일 랙rack)에서 스플릿 최소 크기
set mapred.min.split.size.per.rack=104857600;
--Map 실행 전 소규모 파일 병합 활성화
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
출력 파일 병합 설정
--Map 전용 작업 완료 후 소규모 파일 병합
set hive.merge.mapfiles=true;
--MapReduce 작업 완료 후 소규모 파일 병합
set hive.merge.mapredfiles=true;
--병합 시 생성되는 파일 크기 (256MB)
set hive.merge.size.per.task=268435456;
--출력 파일 평균 크기가 이 값(16MB) 미만일 경우 병합 태스크 실행
set hive.merge.smallfiles.avgsize=16777216;
예시: 잘못된 파티션 설정
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
set hive.auto.convert.join=false;
set mapreduce.map.memory.mb=6144;
set mapreduce.reduce.memory.mb=6144;
set mapred.child.java.opts=-Xmx2048m;
set mapreduce.job.reduce.slowstart.completedmaps=0.7;
set mapred.reduce.tasks=50;
set hive.exec.parallel=true;
위 설정에서 mapred.reduce.tasks=50으로 설정하면 결과적으로 50개의 출력 파일이 생성됩니다.
수동 reducer 설정이 필요한 경우
일반적으로 reducer 수는 자동으로 산정되지만, 클러스터 자원이 부족하여 OOM(메모리 부족)이 발생하는 경우 수동으로 reducer数を増や여 처리할 수 있습니다. 이 경우 실행 속도는 느려지지만 최소한의 실행을 보장할 수 있습니다.