| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬
- matplotlib
- Google Excel
- string
- SQL
- Github
- Apache
- math
- PANDAS
- Kotlin
- django
- Redshift
- Java
- Google Spreadsheet
- Python
- Excel
- array
- PostgreSQL
- dataframe
- Presto
- google apps script
- gas
- c#
- PySpark
- GIT
- list
- numpy
- Tkinter
- hive
- Today
- Total
달나라 노트
Hive : _SUCCESS 파일 없애기 (set mapreduce.fileoutputcommitter.marksuccessfuljobs = false) 본문
Hive : _SUCCESS 파일 없애기 (set mapreduce.fileoutputcommitter.marksuccessfuljobs = false)
CosmosProject 2025. 12. 29. 20:11
* _SUCCESS 파일을 생성하지 않는 옵션을 보려면 맨 아래에 있는 4번으로 넘어가세요.
1. _SUCCESS 파일에 대해서
_SUCCESS 파일이 뭔지부터 알아봅시다.
Hive를 사용하다보면 특정 조건의 query를 실행했을 때 _SUCCESS 파일이 생성되곤 합니다.
모든 query를 실행했을 때 생성되는 것은 아니고, Hive에서 데이터를 쓰는(write) query를 실행할 때 _SUCCESS 파일이 생성됩니다.
대표적으로 다음과 같은 경우에 _SUCCESS 파일이 생성됩니다.
- insert into 등으로 테이블에 데이터를 삽입할 때
- create table ~~ as select ~ (CTAS) 와 같이 select 쿼리의 결과를 바탕으로 새 테이블을 만들 때
- 아래처럼 external table을 생성하고 데이터를 insert 할 때
drop table if exists test_table_1;
create external table test_table_1 (
col_1 bigint,
col_2 string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
location 's3://root_dir/test_dir/'
;
insert overwrite table test_table_1
select col_1
, col_2
from original_table
;
따라서 _SUCCESS 파일은 일반적인 select query에서는 생성되지 않고 데이터를 어딘가에 insert 하는 등 write할 때 생성됩니다.
_SUCCESS 파일은 일반적으로 비어있습니다.
아무런 데이터를 가지지 않은 그냥 파일의 이름이 _SUCCESS인 파일이 생성됩니다.
_SUCCESS 파일은 내용은 비어있지만 flag역할을 합니다.
_SUCCESS 파일이 존재한다면 "이 job이 성공적으로 수행되어 완료되었구나"라는 것을 판단할 수 있는 것이죠.
2. _SUCCESS 파일에 데이터가 있는 경우
사용하는 Hive 서버의 설정값이나 Hive 서버의 환경에 따라서 _SUCCESS 파일이 생성되는 것은 동일하지만 _SUCCESS 파일에 어떤 JSON 형태의 데이터가 담기는 경우가 있습니다.
(위에서 언급했던 비어있는 _SUCCESS 파일이 아니라는 것이죠.)
Hive의 설정값에 따라서 _SUCCESS 파일에 JSON 형태의 데이터를 담아주는 경우가 있습니다.
이 경우 주로 다음과 같은 내용들이 _SUCCESS 파일에 담겨있게 됩니다.
- committer: 사용된 커미터의 종류 (예: MagicCommitter, StagingCommitter)
- data: 실제로 생성된 파일 목록
- metrics: 작업 성능 지표 (쓰기 속도, 태스크 수 등)
- date: 작업 완료 시간
결국 정리해보면 Hive에서 write을 할 때 write 작업이 성공적으로 완료되면 _SUCCESS 파일이 생성되며 이 _SUCCESS 파일 안에는 수행되었던 write 작업의 내용이 JSON형태로 찍히게 되는 것입니다.
3. _SUCCESS 파일에 데이터가 있는 경우의 문제
drop table if exists test_table_1;
create external table test_table_1 (
col_1 bigint,
col_2 string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
location 's3://root_dir/test_dir/'
;
insert overwrite table test_table_1
select col_1
, col_2
from original_table
;
위같이 external table을 만들고 여기에 insert overwrite을 하여 S3의 어떤 경로에 데이터를 넣었다고 합시다.
이 경우에 일반적으로 location에 명시된 데이터가 저장되는 S3 경로(위 예시에서는 s3://root_dir/test_dir/)에 _SUCCESS 파일도 생성됩니다.
즉, s3://root_dir/test_dir/에는 단순히 insert overwrite을 했던 original_table에 담긴 데이터 뿐 아니라 _SUCCESS 파일도 존재하게 된다는 것이죠.
_SUCCESS 파일이 비어있다면 문제 없을 수 있지만 _SUCCESS 파일에 JSON 형태의 어떠한 데이터가 있다면 s3://root_dir/test_dir/ 경로에는 original_table 데이터 뿐 아니라 _SUCCESS 파일에 있는 JSON 로그까지 있게 됩니다.
보통 Hive에서 external table을 만들어 S3에 어떠한 데이터를 올리는 경우는 S3에 데이터를 업로드하여 업로드된 데이터를 다른 Database(e.g. Redshift etc)나 다른 곳에서 접근하게 하기 위함일 것입니다.
이때 _SUCCESS 파일에 있는 JSON 로그까지 읽어서 의도치 않은 데이터를 결과에 포함시키거나 아니면 data pipeline에 에러가 발생할 수 있습니다.
그래서 data pipeline을 구성할 때에는 굳이 Hive의 _SUCCESS 파일을 인식하기보다 Airflow의 dependency나 별도의 flagging file을 S3의 다른 directory에 모아두고 사용하는 것이 일반적입니다.
4. _SUCCESS 파일을 생성되지 않게 하는 방법
_SUCCESS 파일이 생성되지 않게 하려면 아래 옵션을 Hive query의 맨 위에 추가하여 같이 실행하면 됩니다.
set mapreduce.fileoutputcommitter.marksuccessfuljobs = false;
-- your query