성능

성능 (Performance)

아이스버그는 엄청나게 큰 테이블을 위해 설계됐고, 실제 운영 환경에서 단일 테이블이 수십 페타바이트(petabyte)에 달하는 데이터를 담기도 해요. 이 문서에서는 아이스버그가 어떻게 대용량 테이블을 단일 노드에서도 빠르게 스캔 계획을 세울 수 있는지 그 원리를 설명해드릴게요. 메타데이터 필터링과 데이터 필터링이라는 두 단계의 최적화가 핵심이에요.

출처: 문서

본문

  • 아이스버그는 거대한 테이블을 위해 설계됐고, 단일 테이블이 수십 페타바이트의 데이터를 담을 수 있는 운영 환경에서 사용되고 있어요.
  • 수 페타바이트 규모의 테이블도 분산 SQL 엔진으로 테이블 메타데이터를 뒤질 필요 없이, 단일 노드에서 바로 읽을 수 있어요.

스캔 계획 (Scan planning)

스캔 계획(scan planning)은 쿼리에 필요한 테이블의 파일들을 찾는 과정이에요.

아이스버그 테이블의 계획(planning)은 단일 노드에서 수행돼요. 아이스버그의 메타데이터로 불필요한 메타데이터 파일을 걸러낼 수 있을 뿐만 아니라, 일치하는 데이터가 없는 데이터 파일도 걸러낼 수 있기 때문이에요.

단일 노드에서 빠른 스캔 계획을 할 수 있으면 다음과 같은 장점이 생겨요.

  • 지연 시간이 낮은 SQL 쿼리 — 분산 스캔을 계획하기 위해 분산 스캔을 다시 수행할 필요가 없어져요
  • 어떤 클라이언트에서든 접근 가능 — 독립 실행형 프로세스가 아이스버그 테이블에서 직접 데이터를 읽을 수 있어요

메타데이터 필터링 (Metadata filtering)

아이스버그는 스냅샷에 포함된 파일을 추적하기 위해 두 단계의 메타데이터를 사용해요.

  • 매니페스트(manifest) 파일은 데이터 파일 목록과 함께 각 데이터 파일의 파티션 데이터 및 컬럼 단위 통계를 저장해요
  • 매니페스트 리스트(manifest list)는 스냅샷의 매니페스트 목록과 각 파티션 필드의 값 범위를 저장해요

빠른 스캔 계획을 위해 아이스버그는 먼저 매니페스트 리스트의 파티션 값 범위를 이용해 매니페스트를 필터링해요. 그런 다음 각 매니페스트를 읽어 데이터 파일을 얻어요. 이 방식에서 매니페스트 리스트는 매니페스트 파일에 대한 인덱스 역할을 해서, 모든 매니페스트를 읽지 않아도 계획을 세울 수 있게 해줘요.

파티션 값 범위 외에도 매니페스트 리스트는 매니페스트에서 추가되거나 삭제된 파일의 개수를 함께 저장해서, 스냅샷 만료와 같은 연산을 빠르게 처리할 수 있게 해줘요.

데이터 필터링 (Data filtering)

매니페스트 파일에는 각 데이터 파일에 대한 파티션 데이터와 컬럼 단위 통계의 튜플(tuple)이 포함돼요.

계획 단계에서 쿼리 조건(predicate)은 자동으로 파티션 데이터에 대한 조건으로 변환되고, 먼저 적용되어 데이터 파일을 걸러내요. 그다음 컬럼 단위의 값 개수(counts), null 개수(null counts), 하한값(lower bounds), 상한값(upper bounds)을 이용해 쿼리 조건과 일치할 수 없는 파일을 제거해요.

계획할 때 상한값과 하한값으로 데이터 파일을 걸러내는 덕분에, 아이스버그는 클러스터된 데이터를 활용해 작업(task)을 실행하지 않고도 스플릿(split)을 제거해요. 어떤 경우에는 성능이 10배까지 개선되기도 해요.

더 알아보기 (Learn more)