해결책
하둡 기반 분석은 레코드를 행 단위로 읽었기 때문에, 급여 하나만 필요한 쿼리도 각 직원의 전체 레코드를 끌어와야 했고, 이질적인 레코드는 압축이 잘 되지 않았다. 트위터 자체 데이터셋은 7단계 깊이로 중첩되어 있었고 80개가 넘는 리프 노드를 가졌다.
트위터와 클라우데라는 하둡을 위한 오픈소스 칼럼형 저장 포맷인 Parquet를 만들었다. 행 대신 칼럼을 쓴다. 즉 모든 이름을 쓰고, 그다음 모든 나이를 쓰고, 그다음 모든 급여를 쓴다. 가장 큰 성과는 구글의 Dremel 레코드 분해(record-shredding) 알고리즘과 공유 인코딩 명세를 사용해 중첩 데이터를 칼럼으로 잘라내는 것이었다.
칼럼은 하나의 타입만 담기 때문에 범용 압축과 타입별 압축이 모두 개선되고, 쿼리 엔진은 필요 없는 칼럼을 로드하지 않는다. 자동 사전 인코딩에 비트 패킹과 런 길이 인코딩을 더해 나머지를 줄인다. Parquet는 사용자를 특정 직렬화 라이브러리에 묶지 않으므로 많은 엔진이 이를 채택한다.
Parquet 1.0은 트위터, 클라우데라, 크리테오, 버클리 AMPLab, 스트라이프의 기여자들이 2013년 7월에 출시했으며, 이미 트위터에서 프로덕션으로 실행되고 있었다.
이룬 것
칼럼 단위로 저장해 분석이 필요 없는 부분을 건너뛰게 한다
동질적인 칼럼 값은 뒤섞인 행보다 훨씬 잘 압축되므로 파일이 훨씬 작아진다.
쿼리는 필요한 칼럼만 로드하므로 I/O와 비용이 급격히 줄어든다.
Dremel을 통해 중첩 데이터를 잘라내므로 복잡한 스키마도 칼럼에 맞출 수 있다.
프레임워크에 종속되지 않아 모든 엔진이 다시 작성하지 않고도 채택할 수 있었다.
병목이 읽기와 압축이라면 로직이 아니라 물리적 레이아웃을 바꿔라. 동질적인 값을 함께 저장하면 비싼 I/O가 줄고 파일이 공짜로 더 작아진다.
그 후
Parquet 1.0은 2013년 7월에 출시되어 하둡과 스파크 생태계 전반에서, 이어서 데이터 레이크, 레이크하우스, 클라우드 웨어하우스 내부에서 빠르게 기본 칼럼형 포맷이 되었다. 현재는 가장 폭넓게 지원되는 오픈 저장 포맷 중 하나로, 분석이 넓은 테이블을 빠르고 저렴하게 스캔해야 하는 곳이면 어디서든 사용된다.
근거 확인하기
출처
- Announcing Parquet 1.0: Columnar Storage for Hadoop Twitter Blog · web.archive.org ·
- Parquet Format Specification Apache Parquet · apache.googlesource.com