LabHub
배우기 러닝패스 코스

데이터 파이프라인 · 파티션과 파일 크기 · 실습

파일이 놓인 모양이 조회 비용을 정한다 — 파티션과 묶기

LabHub 에서 이어서 보기

목표

파일 시스템 위의 파티션 레이크를 다루는 도구 pq.py 를 만든다. 키를 바꿔 가며 파일 수와 크기 분포를 재고, 파티션 키에 걸린 조건이 여는 파일 수를 얼마나 줄이는지 재고, 묶기를 돌리고, 묶는 도중에 읽는 쪽이 무엇을 보는지 확인하고, 키를 바꾸는 비용을 잰다.

왜 중요한가

같은 행을 넣어도 파일이 어떻게 놓여 있느냐에 따라 조회가 여는 파일 수가 수십 배 달라진다. 파티션은 값마다 디렉터리를 나눠 두는 것이고, 열지 않은 파일은 비용이 0 이다. 다만 그 이득은 디렉터리 이름에 들어 있는 칸으로 거를 때만 생긴다.
그렇다고 자주 쓰는 칸을 모두 키로 넣으면 파티션 수가 값의 곱만큼 늘어나고 파일 하나가 몇 줄짜리가 된다. 파일을 여는 고정 비용이 내용을 읽는 비용보다 커지고, 목록의 항목 수가 폭발하고, 압축이 먹지 않는다. 그래서 키를 고르는 일은 언제나 맞바꿈이다.
작은 파일이 쌓이면 묶기를 돌린다. 어려운 것은 묶는 일 자체가 아니라 그 도중에 읽는 사람이 무엇을 보는가다. 디렉터리를 훑어 파일을 모으는 독자는 옛 파일과 새 파일을 모두 집어 같은 줄을 두 번 센다. 읽는 쪽이 목록을 보게 만들고, 목록 교체를 마지막에 한 번만 하면 그 사이가 없어진다.
Parquet 은 쓰지 않는다. 실습 이미지에 pyarrow 가 없고 파드는 런타임 설치를 할 수 없다. 행 그룹 같은 개념은 읽기에서 공식 문서로 다뤘고, 여기서는 파티션 디렉터리와 매니페스트와 JSON Lines 로 같은 구조를 손으로 만든다.
채점기는 여러분이 적어 낸 문구를 믿지 않는다. 임시 작업 폴더에 채점기가 만든 원본을 차려 놓고 여러분의 도구를 실제로 돌려, 매니페스트에 적힌 크기가 디스크의 실제 크기와 맞는지, 줄이 보존되는지, 잘라 낸 파일 수가 맞는지를 본다. 원본과 목표 크기는 실행마다 바뀐다.

단계

1. /root/parts/gen_orders.py 를 만들어 실행해 /root/parts/work/raw.jsonl 을 만드세요.
2. /root/parts/pq.pywrite 를 만들어 키 하나로 쪼갠 레이크와 매니페스트를 만들게 하세요.
3. layout 을 더해 파일 수와 크기 분포와 작은 파일 개수를 내게 하세요.
4. write 가 키를 여럿 받고 한 파일의 줄 수를 제한할 수 있게 해 잘게 쪼갠 레이크를 만드세요.
5. query 를 더해 파티션 키에 걸린 조건으로 열 파일을 잘라 내게 하세요.
6. compact 를 더해 한 파티션 안의 작은 파일을 목표 크기에 가깝게 묶게 하세요.
7. --crash=before-swap--via=glob 을 더해 묶는 도중에 읽는 쪽이 무엇을 보는지 확인하세요.
8. repartition 을 더해 키를 바꿔 다시 쓰고 /root/parts/work/partition_report.md 에 비용을 적으세요.

참고

단계 8개

  1. 파티션 키 후보가 여럿인 원본 만들기
  2. 키 하나로 쪼개고 목록을 남기기
  3. 파일이 어떤 크기로 놓였는지 재기
  4. 잘게 쪼개 작은 파일 만들어 보기
  5. 열지 않은 파일은 비용이 0 이다
  6. 작은 파일 묶기
  7. 묶는 도중에 읽는 사람이 보는 것
  8. 키를 바꾸는 값 매기기