테이블 옵션에 관해서 처음 글을 쓰는 거 같네요. Databricks에는 여러 가지 자동으로 최적화해주는 옵션이 있지만 해당 옵션을 추가하여 Small 파일을 방지하고 성능을 향상할 수 있을 것 같습니다. 실제로 파일의 개수가 1/2 가량 줄어드는 것을 보았고, KB의 파일들이 모여서 MB로 변경되는 것을 눈으로 직접 확인하였습니다.
제가 알고 있기로 Databricks에는(아니면 delta 옵션 일수도?) 다음과 같이 파일에 관련하여 옵션을 제공 합니다. 제가 아는 건 2개 정도였는데요. 이미 테이블에 옵션을 적용해 놨습니다.
실제로 위의 2개의 옵션으로 인해서 최적의 파일 크기를 조정해서 저장소에 저장 하는것으로 보입니다. 해당 옵션을 보고 크기가 매우 크고 중요한 테이블이 옵션을 적용하였는데, 생각보다 KB의 파일이 있어서 어쩔 수 없이 (파일을 나누다 보니 남는 데이터들?) 파일을 저렇게 저장하는구나 싶었습니다.
그래서 찾던 와중에 delta.targetFileSize 이라는 옵션을 찾았고, 해당 옵션을 적용하였는데 실제로 큰 효과를 봤습니다. 이 내용을 들어가기 앞서 왜 Small 파일이 성능에 안 좋은 영향을 미치는지 간단하게 그림으로 그려봤습니다.
Small 파일이 좋지 않은 이유?
예를 들어서 우리가 아이스크림을 퍼서 먹는다고 가정 하겠습니다. 아이스크림은 아주 작은 용기에 담겨 있습니다. 이 용기에서 아이스크림을 퍼야 합니다. 그런데 우리에게는 국자 크기의 수저밖에 없습니다.
파일이 작을때
위의 그림을 보면 작은 단위로 나눠져 있기 때문에 옮길 수 있는 크기는 크지만 8번을 옮겨야 합니다. 파일의 크기(아이스크림)가 작기 때문에 한 번에 읽을 수 있는 크기를 여러 번 옮겨야 합니다.
파일이 클때
하지만 파일의 크기(아이스크림의 크기)가 크면 한번에 옮기는 양도 많아지므로 국자 크기에 딱 맞게 옮길 수 있습니다. 그렇기 때문에 작업의 횟수가 줄어듭니다. 이게 파일을 읽는 횟수를 크게 줄여서 그만큼 더 이점이라고 볼 수 있습니다. 여러 가지 더 좋은 부분이 있겠지만 제가 알기로 가장 큰 이점이 이것으로 알고 있습니다.
실제 적용 후 비교
적용 테이블의 크기는 약 4.5TB였으며, 파일의 앞서 말씀드린 옵션이 2가지가 모두 적용 되었습니다. 해당 테이블의 경우 월별로 파티션이 걸려 있습니다. 이외의 몇 가지 옵션이 더 걸려 있지만 다른 옵션은 파일의 크기에 큰 상관이 없는 것으로 알고 있으므로 공유하지 않겠습니다.
일단 가장 중요한 파일의 개수는 다음의 구문으로 확인 하였습니다.
describe detail 테이블명
다음과 같이 검색하면 numFiles라는 칼럼이 나오는데, 해당 칼럼으로 파일의 개수를 확인 가능 합니다. 해당 옵션을 적용하는 구문은 다음과 같습니다.
ALTER TABLE 테이블명
SET TBLPROPERTIES (delta.targetFileSize = '1048576000')
위의 수치는 byte이며, 1GB가 parquet 파일의 최적의 파일 크기로 공식 문서에 언급되어 있어서 1GB로 설정하고자 하였습니다.
targerFileSize 설명
옵션을 적용하고 꼭OPTIMIZE를 해줘야 합니다. OPTIMIZE를 해주면 파일을 다시 최적으로 쓰기 시작합니다. OPTIMIZE는 시간이 조금 걸리니 꼭 다른 작업을 피해서 수행해주셔야 합니다.
테이블의 파일은 실행 전에 약 13,000개에서 약 7,000개로 거의 1/2 수준으로 줄어들었습니다. 실제로 파일의 크기가 KB 단위가 없어졌습니다. 적용한 시간이 그리 오래되지 않아서, 성능에 대한 체감과 정확한 비교를 하지는 못하였으나 이후에 성능에 대해서 굉장히 기대됩니다.
주의 사항
1. LOCK이 걸립니다.
해당 옵션은 LOCK에 걸립니다. DELETE 나 UPDATE와 OPTIMIZE와 같은 작업을 하는 도중에 해당 옵션을 설정하면 LOCK으로 작업이 실패할 수 있습니다. 아래의 문구와 같이 나오면서 해당 작업이 실패 할 수 있으니 다른 작업이 있을 때는 해당 옵션을 걸지 않는 게 좋습니다. 작업이 끝난 후에 걸도록 해야 합니다.
[DELTA_METADATA_CHANGED] MetadataChangedException: The metadata of the Delta table has been changed by a concurrent update. Please try the operation again.
2. 설정한 파일 크기만큼 필수적으로 파일을 만들지 않습니다.
파일의 크기를 1GB로 설정하였으나 다른 옵션들로 인해서 최적의 파일 크기로 Databricks가 설정하는 것으로 보입니다. 그래서 파일의 크기를 실제로 저장소에서 확인하면 1GB가 아닌 경우가 있습니다.
구글링 해보니 비슷한 질무을 한 사람들이 좀 있는데 당황하지 마시고, 최적화 상에서 이렇게 판단하여한 것으로 보입니다. (댓글 상으로는...) 그러니 내가 설정한 크기로 안된다고 너무 당황하지 않으시길 바랍니다.