No Story, No Ecstasy

구글 빅쿼리(BigQuery) 데이터 저장 및 접근 방법 최적화 본문

Data Science Series

구글 빅쿼리(BigQuery) 데이터 저장 및 접근 방법 최적화

heave_17 2021. 10. 6. 14:12

http://www.yes24.com/Product/Goods/95562895

 

구글 빅쿼리 완벽 가이드 - YES24

빅데이터, 데이터 엔지니어링, 머신러닝을 위한 대용량 데이터 분석과 처리의 모든 것협업과 신속함을 갖춘 작업 공간을 구축하는 동시에 페타바이트 규모의 데이터셋을 처리해보자. 이 책은

www.yes24.com

* '구글 빅쿼리 완벽 가이드' 내용 중 일부를 정리한 글입니다.

 

네트워크 오버헤드 최소화하기

GCP 외부에서 빅쿼리를 호출한다면, 네트워크 토폴로지를 고려하고, 클라이언트 머신과 데이터셋을 생성한 GCP 데이터센터 사이에 네트워크 경로를 최대한 단축한다.

 

압축한 부분 응답

REST API를 직접 호출할 때 압축한 부분 응답을 승인해 네트워크 오버헤드를 최소화할 수 있다. 압축한 응답을 수락하려면 HTTP 헤더에서 gzip을 수락하도록 지정하고 사용자 에이전트 이름에 'gzip' 문자열이 나타나는지 확인한다.

 

여러 요청 일괄 처리하기

REST API를 사용할 때는 multipart/mixed 콘텐츠 타입을 사용해 파트별로 HTTP 요청을 중첩해서 여러 빅쿼리 API 호출을 일괄 처리할 수 있다. 각 파트의 본문은 HTTP 작업, URL의 경로 부분, 헤더 그리고 본문을 지정한다.

 

빅쿼리 스토리지 API를 사용한 대량 읽기

이제 외부 도구는 빅쿼리의 관리형 스토리지에 대한 빠르고 효율적인 대량 접근을 요구하고, 이런 대량 읽기 접근은 RPC 기반 프로토콜을 사용하는 빅쿼리 스토리지 API가 제공한다. 이 것을 사용하면, 데이터가 저장된 컬럼 형식과 더욱 유사하게 매핑되는 이진 직렬화 형식으로 구조화된 데이터를 전달한다. 따라서, 결과 집합에 대해 여러 소비자 간에 추가적인 병렬화가 가능하다.

%pip install google-cloud-bigquery-storage[fastavro,pandas]

%%bigquery df --user_bgstorage_api --project $PROJECT

노트북 세션의 모든 매직 셀에서 --use_bqstorage_api를 기본적으로 활성화하려면 컨텍스트 플래그를 설정한다.

import google.cloud.bigquery.magics
google.cloud.bigquery.magics.context.use_bqstorage_api = True

 

효율적인 저장 포맷 선택하기

쿼리가 검색이나 타입 변환을 거의 수행할 필요가 없는 방식으로 데이터를 저장하면 가장 빠른 성능을 얻을 수 있다.

 

네부 데이터 소스와 외부 데이터 소스의 비교

빅쿼리는 대부분의 외부 소스에 대한 직접 쿼리를 지원하지만, 네이티브 테이블을 사용하는 것이 가장 빠른 쿼리 성능을 얻을 수 있다. 구글 클라우드 스토리지에서 데이터를 쿼리해야 할 때는 가능하면 압축된 컬럼 형식으로 저장한다. JSON 같은 행 기반 형식은 마지막 수단으로 사용한다.

 

스테이징 버킷에서 수명 주기 관리 설정하기

 

데이터를 구조체의 배열로 저장하기

데이터를 구조체의 배열로 저장하면, 읽어야 하는 행의 개수가 기하급수적으로 감소하기에 극적인 성능 향상을 이뤄낼 수 있다.

 

스캔 크기를 줄이기 위해 테이블 파티셔닝하기

안티 패턴: 테이블 접미사 및 와일드 카드 (비추천, 스키마 관리 및 동기화 어려움)

만약 연도별 필터링이 매우 일반적이라면, 읽고 있는 데이터를 줄이는 한 가지 방법은 연도별로 접미사를 각 테이블의 이름에 붙여서, 여러 테이블에 데이터를 저장하는 것이다.

 

파티션을 나눈 테이블

Partitioned Table을 활용하면, 모든 관련 데이터를 단일 논리 테이블에 저장하면서도 해당 데이터의 하위 집합을 효율적으로 관리할 수 있다. 만약 데이터를 시간 별로 분할하면 지난 7일 분량의 파티션만 스캔할 수 있어지고, 이렇게 하면 쿼리 비용과 슬롯 활용 및 시간 면에서 비용을 절감할 수 있다. 이 경우 항상 WHERE절에 파티션 컬럼의 조건을 사용해야 한다.

 

높은 카디널리티 키에 기반한 클러스터링 테이블

파티션된 테이블은 여러 개의 록립 테이블과 유사하게 작동하지만, 클러스터링된 테이블은 정렬된 형식을 단일 테이블로 저장한다. 이렇게 데이터가 정렬되어 있으면 성능 저하 없이 무제한의 고유한 값을 저장할 수 있으며 필터를 적용할 때 빅쿼리가 요청된 값의 범위를 포함하지 않는 파일을 열지 않고 건너뛸 수 있다. 클러스터링은 반복되지 않으며 기본 데이터 타입을 가진 컬럼에서 수행할 수 있다. (예: customerId)

 

파티션 컬럼으로 클러스터링하기

가장 일반적인 패턴이다. 예를 들어, timestamp 컬럼으로 파티션을 나누면 파티셔닝에 사용된 날짜 경계보다 작은 임의의 기간에 대해 매우 빠르고 효율적인 쿼리를 수행할 수 있다.

 

재클러스터링

클러스터된 테이블에서 클러스터링 컬럼의 값을 기준으로 데이터를 정렬한다. 그러나 스트리밍될 때는 정렬을 유지하지 않기 때문에, 효율적인 데이터 정리 및 스캔 속도를 유지하기 위해 주기적으로 데이터를 재클러스터링한다.

즉, DML을 사용해 테이블을 업데이트하면 파티션의 재클러스터가 강제로 업데이트된다.

 

클러스터링의 부가적인 장점

클러스터링된 테이블은 전체 데이터 읽기를 방지할 수 있다(비효율적인 데이터 읽기를 방지하는 모든 최적화를 수행한다). 즉, 쿼리 비용을 줄이고 성능을 높이고 싶다면 클러스터링을 적극 이용해야 한다.