빅쿼리는 Columnar Storage이다.
따라서 컬럼별로 메모리 블록이 나뉘어 있는 경우가 많은데 여러 개의 메모리 블락을 업데이트하기엔 부담이 있다.
그래서 Bulk Update 를 해야 하는데 Bulk Update의 경우 Columnar Storage 가 빠르다.
아래는 BigQuery Streaming Ingestion 에 대한 구조이다. 쿼리 엔진이 streaming buffer 와 본테이블(columnar storage)에 모두 붙어있기 때문에 양쪽에서 데이터를 조회할 수 있다.
Streaming Ingestion Workers
- Streaming Insert 트래픽을 처리하는 API 부분. 주요 역할은 스트리밍 레코드의 JSON 표현을 가져와 스트리밍 버퍼에 삽입하고 작업의 성공/실패를 보고하는 역할을 한다.
Streaming Buffer
- 최근에 삽입된 행을 유지하는 버퍼로, 열 기반 접근보다 high-throughput 쓰기에 최적화되어 있다.
Instant Availability Reader
- 쿼리 엔진이 스트리밍 버퍼에서 직접 레코드를 읽을 수 있게 한다.
Extraction Workers
- 버퍼에 있는 레코드 그룹을 수집하여 열 기반 형식으로 변환하고, 해당 데이터를 BigQuery의 본 테이블에 커밋하는 프로세스
Query Engine
- 쿼리 엔진 자체(BigQuery Dremel)
Streaming Buffer 에 저장하면 좋은 이유
비용 최적화
스트리밍 버퍼를 사용하면 데이터를 본 테이블에 적재하기 전에 먼저 버퍼에 저장하게 된다.
이는 작은 크기의 데이터를 여러 번 적재하는 것보다 데이터 적재 횟수를 줄이고 비용을 절감할 수 있는 장점을 제공한다.
일정량의 데이터를 버퍼에 모아 한 번에 적재하면, 네트워크 및 BigQuery 작업 비용을 절감할 수 있다.
롤백 및 재시작 가능
스트리밍 버퍼를 사용하면 본 테이블에 바로 데이터를 적재하는 대신, 데이터가 버퍼에 저장되었을 때 롤백 및 재시작 기능을 활용할 수 있다. 예를 들어, 잘못된 데이터가 스트리밍 되었을 때, 버퍼에 저장된 데이터를 롤백하여 데이터 무결성을 유지하거나, 작업을 중지했던 시점부터 재시작하여 데이터의 일관성을 유지할 수 있다.
최근에 삽입된 행을 유지
스트리밍 버퍼의 경우 열 기반 접근보다는 high-throughput 쓰기에 최적화되어 있다. 데이터를 쓸 때는 columnar 방식보다는 row store 가 더 빠르기 때문이다. 다만 bulk update의 경우에는 columnar storage 가 더 빠르다.
Python에서 BigQuery Streaming Insert 활용하여 Streaming Buffer 에 저장하기
https://cloud.google.com/bigquery/docs/samples/bigquery-table-insert-rows?hl=ko
Python load_table_from_dataframe vs Streaming Insert
load_table_from_dataframe
BigQuery의 대량의 데이터를 한 번에 적재하는 방법으로 DataFrame에서 BigQuery 테이블로 일괄적으로 적재하는데 적합
이 방식은 데이터를 로컬 환경에서 전처리하고 변환한 후 BigQuery로 전송하여 적재
이 방법은 대량의 데이터를 처리할 때 효과적이며, 로컬에서 처리 후 한 번에 적재하므로 Streaming Insert 보다 속도가 빠를 수 있다.
Streaming Insert
데이터를 실시간으로 BigQuery에 스트리밍하는 방식. 이 방법은 개별 레코드나 작은 배치로 데이터를 보내며, 데이터가 도착하는대로 실시간으로 적재. Streaming Insert의 경우 실시간 데이터 처리 및 모니터링, 실시간 분석 등의 용도에 적합.
Streaming Insert 의 경우 insert_rows_json 메서드를 사용하여 Python에서 수행 가능
📚참고
'Cloud' 카테고리의 다른 글
[BigQuery] STRUCT, ARRAY 구조에 대해 알아보기 | LIM (0) | 2023.06.10 |
---|---|
[BigQuery] Surrogate key를 활용하여 JOIN 성능 높이기 | LIM (0) | 2023.06.09 |
[GCP] BigQuery 란 무엇이며 생겨나게 된 배경 알아보기 | LIM (0) | 2023.05.21 |
[BigQuery] Partition 과 Cluster 에 대해 알아보고 적용하기 | LIM (0) | 2023.03.12 |
[GCP] VM Instance SSH 접속 (feat. Pycharm) | LIM (0) | 2023.01.20 |
댓글