들어가며
ETL 처리에서 수백만 건, 수십 GB 규모의 데이터를 파일로 출력할 때, 하나의 거대한 파일로 만들어 버리면 후속 시스템에서 가져오는 데 시간이 오래 걸리거나 메모리 부족, 타임아웃의 원인이 되기도 합니다. Amazon S3나 SFTP 등으로 출력할 때는 적절한 크기로 분할된 여러 파일로 저장하는 것이 운영상의 모범 사례입니다.
Xplenty에서는 시스템 변수를 설정하는 것만으로 출력 파일의 분할을 제어할 수 있습니다. 분할 방법은 크게 두 가지입니다.
- 파일 개수로 분할하기 …
_DEFAULT_PARALLELISM
- 파일 크기로 분할하기 …
_BYTES_PER_REDUCER
본 기사에서는 각각의 원리와 설정 방법, 사용 구분 포인트를 설명합니다.
출력 파일 분할의 원리
Xplenty의 작업(Job)은 내부적으로 Hadoop의 MapReduce 처리로 실행됩니다. File Storage Destination 컴포넌트에서 파일을 출력할 때, 최종 단계를 처리하는 태스크의 수만큼 출력 파일이 생성되는 것이 기본 원리입니다.
즉, Reducer 단계에서 작업이 종료되는 경우, “Reducer의 수 = 출력 파일의 수”가 됩니다. 이번에 소개하는 두 시스템 변수는 모두 이 Reducer의 수를 제어함으로써 파일 분할을 구현합니다.
_DEFAULT_PARALLELISM … Reducer의 수를 직접 지정 → 파일 개수를 지정
_BYTES_PER_REDUCER … Reducer 1개가 처리하는 데이터양(바이트)을 지정하여 Reducer 수를 자동 계산 → 파일 크기의 기준을 지정
공식 문서에도 _DEFAULT_PARALLELISM의 기본값은 0이며, 이 경우 Reducer 수는 _BYTES_PER_REDUCER를 기준으로 계산된다고 명시되어 있습니다.
중요한 전제 조건: Reducer 단계를 거쳐야 함
이 변수들은 Reducer 단계에 작용하므로, 데이터 플로우에 Reducer가 발생하는 처리가 포함되어 있어야 한다는 전제가 필요합니다. Mapper만으로 완결되는 단순한 플로우(예: Source → Select → Destination)에서는 Reducer가 실행되지 않아, 이 변수들을 설정해도 출력 파일의 분할 수에는 반영되지 않습니다.
Reducer 단계를 확실히 거치도록 하는 가장 간단한 방법은 Destination 직전에 Sort 컴포넌트를 배치하는 것입니다. Sort, Aggregate, Join 등의 처리는 Reducer에서 실행되므로, 이 중 하나라도 플로우에 포함되어 있으면 변수 설정이 유효하게 작동합니다.
방법 1: 파일 개수로 분할하기
_DEFAULT_PARALLELISM은 패키지 내에서 사용할 병렬 Reduce 태스크의 수를 지정하는 시스템 변수입니다. 여기에 설정한 수가 Reducer의 수가 되며, 그대로 출력 파일의 개수가 됩니다.
| 항목 | 내용 |
|---|
| 변수명 | _DEFAULT_PARALLELISM |
| 설정값 | 출력하고자 하는 파일의 개수(정수) |
| 기본값 | 0 (_BYTES_PER_REDUCER에 의한 자동 계산) |
설정 절차
- 패키지 디자이너를 열고, 패키지의 변수 설정(System Variables) 화면을 엽니다.
- System 변수
_DEFAULT_PARALLELISM에 출력하고자 하는 파일 수(예: 10)를 설정합니다.
- 데이터 플로우의 Destination 직전에 Sort 컴포넌트가 배치되어 있는지 확인합니다.
- 패키지를 저장하고 작업을 실행합니다.
- 작업 실행 후, 출력 대상 디렉터리에는 지정한 개수만큼의 파일이 생성됩니다.
사용 사례
- 후속 처리 시스템이 “N개의 파일을 병렬로 읽어 들인다”는 전제로 설계된 경우
- Amazon Redshift 등으로 병렬 로드하기 위해 클러스터의 슬라이스 수에 맞춰 파일 수를 맞추고 싶은 경우
- 파일 수를 일정하게 유지하여 운영·모니터링을 단순하게 하고 싶은 경우
주의 사항
공식 문서에도 명시된 바와 같이, Reducer 수의 효과는 데이터의 양과 분포에 따라 달라집니다. 데이터에 치우침(스큐)이 있는 경우, 예를 들어 특정 키에 레코드가 집중되어 있으면 Reducer 수를 늘려도 처리가 분산되지 않아 파일 크기에도 편차가 발생할 수 있습니다.
방법 2: 파일 크기로 분할하기
_BYTES_PER_REDUCER는 Reducer 1개가 처리하는 데이터양을 바이트 단위로 지정하는 시스템 변수입니다. _DEFAULT_PARALLELISM이 0(기본값)인 경우, Xplenty는 “처리 대상의 총 데이터양 ÷ _BYTES_PER_REDUCER”로부터 Reducer 수를 자동 계산합니다. 그 결과, 각 출력 파일이 지정한 크기 전후로 수렴하도록 분할됩니다.
| 항목 | 내용 |
|---|
| 변수명 | _BYTES_PER_REDUCER |
| 설정값 | 파일 1개당 기준 크기(바이트 단위 정수) |
| 유효 조건 | _DEFAULT_PARALLELISM이 0(미설정 또는 기본값)일 것 |
_BYTES_PER_REDUCER 설정 예시
| 기준 크기 | 설정값(바이트) |
|---|
| 128 MB | 134217728 |
| 256 MB | 268435456 |
| 512 MB | 536870912 |
| 1 GB | 1073741824 |
예를 들어 총량 약 2.5GB의 데이터에 대해 256MB를 지정한 경우, Reducer는 약 10개 실행되며 출력 파일도 약 10개로 분할됩니다.
설정 절차
- 패키지의 변수 설정(Variables) 화면을 엽니다.
- System 변수
_BYTES_PER_REDUCER에 파일 1개당 기준 크기를 바이트로 설정합니다(예: 512MB라면 536870912).
_DEFAULT_PARALLELISM을 설정한 경우 삭제하거나 0으로 변경합니다(개수 지정이 우선되기 때문).
- Destination 직전에 Sort 컴포넌트를 배치하고 작업을 실행합니다.
- 작업 실행 후, 출력 대상 디렉터리에는 지정한 기준 크기로 파일이 생성되었는지 확인합니다.
사용 사례
- 후속 시스템에 “파일 1개당 권장 크기/상한 크기”가 있는 경우(예: 데이터 웨어하우스 로드 최적화)
- 날마다 데이터양이 변동하는 작업에서, 파일 수가 아니라 파일 크기를 일정하게 유지하고 싶은 경우
- 파일 크기 상한 초과로 인한 업로드·전송 오류를 피하고 싶은 경우
주의 사항
- 지정한 크기는 어디까지나 기준값입니다. 데이터의 분포나 압축 설정(Gzip/Bzip2)에 따라 실제 출력 파일 크기는 전후로 달라집니다. 특히 압축을 활성화한 경우, 출력 파일은 지정값보다 훨씬 작아집니다(지정 크기는 압축 전 데이터양을 기준으로 하기 때문).
- 레코드 단위로 분할되므로, 하나의 레코드가 중간에 잘리는 일은 없습니다.
두 가지 방법의 사용 구분
| 관점 | _DEFAULT_PARALLELISM(개수 지정) | _BYTES_PER_REDUCER(크기 지정) |
|---|
| 제어 대상 | 출력 파일의 개수 | 파일 1개당 데이터양의 기준 |
| 데이터양이 변동하는 경우 | 파일 수는 고정, 파일 1개의 크기가 변동 | 파일 크기는 일정한 기준, 파일 수가 변동 |
| 우선순위 | 0보다 큰 값을 설정하면 이쪽이 우선 | _DEFAULT_PARALLELISM이 0일 때 유효 |
| 적합한 경우 | 병렬 로드 대상의 슬롯 수에 맞추고 싶은 경우 | 파일 크기의 상한·권장값에 맞추고 싶은 경우 |
판단 기준:
- “파일은 반드시 N개로 만들고 싶다” →
_DEFAULT_PARALLELISM
- “파일 1개를 XXX MB 정도로 억제하고 싶다” →
_BYTES_PER_REDUCER
- 두 가지를 모두 설정한 경우,
_DEFAULT_PARALLELISM(0보다 큰 값)이 우선되며, _BYTES_PER_REDUCER에 의한 자동 계산은 이루어지지 않습니다.
모범 사례
-
Sort 컴포넌트 배치를 잊지 않기
분할이 적용되지 않는 경우, 먼저 Reducer 단계가 발생하고 있는지 의심해 보세요. Destination 직전의 Sort가 가장 확실합니다. 정렬 키는 출력 순서를 겸하여 업무상 의미 있는 컬럼(타임스탬프나 ID 등)을 지정하면 일석이조입니다.
-
출력 파일명 접두사 활용하기
File Storage Destination의 “File name prefix”에서 기본값인
part-[mr]-을 원하는 접두사로 변경할 수 있습니다. 변수를 조합하여 타임스탬프가 포함된 파일명으로 만들면 분할 파일 관리가 쉬워집니다.
-
지나치게 작은 분할은 피하기
파일을 지나치게 잘게 분할하면, 출력 대상(특히 S3 등의 오브젝트 스토리지)에서 작은 파일이 대량으로 생성되어 후속 읽기 효율이 오히려 나빠집니다. 후속 시스템의 권장 크기에 맞춰 설정하세요.
-
작업 실행 후 실제 출력 확인하기
초기 설정 시에는 작업 완료 후 출력 대상 디렉터리의 파일 수와 크기를 확인하여, 예상대로 분할되었는지 검증하는 것을 권장합니다.
Xplenty에서는 두 개의 시스템 변수를 상황에 맞게 사용하는 것만으로 출력 파일의 분할을 유연하게 제어할 수 있습니다.
- 개수로 분할 →
_DEFAULT_PARALLELISM에 파일 수를 설정
- 크기로 분할 →
_BYTES_PER_REDUCER에 바이트 수를 설정(_DEFAULT_PARALLELISM은 0인 상태 유지)
어느 경우든 Sort 컴포넌트 등을 사용하여 Reducer 단계를 거치도록 하는 것이 전제 조건입니다. 후속 시스템의 요구 사항(파일 수 고정인지, 크기 상한인지)에 따라 적절한 방법을 선택하세요.Last modified on July 10, 2026