쓰기 시간에 값 집계
쓰기 시간에 Bigtable에서 카운터를 만들거나 데이터를 집계하려면 집계를 사용하면 됩니다. 집계는 데이터가 쓰여질 때 셀 값을 집계하는 Bigtable 테이블 셀입니다. 새 값을 추가하면 집계 함수가 해당 값을 이미 셀에 있는 집계된 값과 병합합니다. 다른 데이터베이스는 이와 비슷한 기능을 분산 카운터라고 지칭합니다.
cbt
CLI와 C++, Go, Java용 Bigtable 클라이언트 라이브러리를 사용하여 집계 값을 읽고 쓸 수 있습니다. SQL을 사용하여 집계 결과를 읽을 수도 있습니다. AddToCell
또는 MergeToCell
변형과 함께 MutateRow
요청을 전송하는 메서드를 사용하여 집계 셀을 업데이트합니다. MergeToCell
를 사용하면 누산기를 병합할 수 있고 AddToCell
를 사용하면 입력을 추가할 수 있습니다.
이 문서에서는 집계에 대한 개요를 제공하고 집계 열 패밀리를 만드는 방법을 설명합니다. 이 문서를 읽기 전에 Bigtable 개요 및 쓰기를 숙지해야 합니다.
집계를 사용해야 하는 경우
Bigtable 집계는 개별 데이터 포인트가 아닌 집계된 항목의 데이터에 관심이 있는 경우에 유용합니다.
카운터
집계 셀을 사용하여 카운터를 빌드하고 ReadModifyWriteRow
요청과 관련된 제한 없이 쓰기 시 값을 증분할 수 있습니다.
Apache Cassandra 또는 Redis와 같은 데이터베이스에서 Bigtable로 마이그레이션하는 경우 이전에 이러한 시스템에서 카운터를 사용했던 위치에 Bigtable 집계를 사용할 수 있습니다.
cbt
CLI를 사용하여 카운터를 구현하는 방법을 보여주는 빠른 시작을 진행하려면 카운터 만들기 및 업데이트를 참고하세요.
시간 버킷
시간 버킷을 사용하여 시간, 일, 주와 같은 기간에 대한 집계 값을 가져올 수 있습니다. 데이터를 테이블에 쓰기 전후에 집계하는 대신 테이블의 집계 셀에 새 값을 추가합니다.
예를 들어 자선단체에 자금을 조달하는 데 도움을 주는 서비스를 운영하는 경우 각 캠페인의 일일 온라인 기부 금액을 알고 싶지만 각 기부의 정확한 시간이나 시간당 금액을 알 필요가 없습니다. 테이블에서 행 키는 자선 단체 ID를 나타내고 donations
라는 집계 column family를 만듭니다. 행의 열 한정자는 캠페인 ID입니다.
캠페인에 대해 지정된 날에 받은 각 기부 금액은 해당 날짜의 열에 있는 집계 셀 합계에 추가됩니다. 셀에 대한 각 추가 요청은 하루의 시작 부분으로 잘린 타임스탬프를 사용하므로 결과적으로 각 요청에는 동일한 타임스탬프가 있습니다. 타임스탬프를 자르면 해당 일의 모든 기부가 동일한 셀에 추가됩니다. 다음 날 모든 요청이 새 날짜로 잘린 타임스탬프를 사용하여 새 셀로 이동하며 이 패턴은 계속됩니다.
사용 사례에 따라 새 집계를 위한 새 열을 대신 생성할 수도 있습니다. 누적할 버킷 수에 따라 다른 row key 설계를 고려할 수 있습니다.
시간 버킷에 관한 자세한 내용은 시계열 데이터에 대한 스키마 설계를 참고하세요.
워크플로 간소화
집계를 사용하면 Bigtable에 데이터를 쓰기 전후에 ETL 또는 스트리밍 처리 소프트웨어를 사용하여 데이터를 집계할 필요 없이 Bigtable 테이블에서 데이터를 집계할 수 있습니다. 예를 들어 애플리케이션이 이전에는 Pub/Sub에 메시지를 게시한 후 데이터를 Bigtable에 기록하기 전에 Dataflow를 사용하여 메시지를 읽고 데이터를 집계했다면 이제 데이터를 Bigtable의 집계 셀에 직접 전송할 수 있습니다.
Column family 집계
집계 셀을 만들고 업데이트하려면 테이블에 집계 셀만 포함된 집계 column family가 하나 이상 있어야 합니다. 테이블을 만들 때 만들거나 이미 사용 중인 테이블에 집계 column family를 추가할 수 있습니다. 열 패밀리를 만들 때 합계와 같은 집계 유형을 지정합니다.
집계되지 않은 데이터가 포함된 column family를 집계 column family로 변환할 수는 없습니다. 집계 column family 열에는 비집계 셀을 포함할 수 없으며 표준 column family에는 집계 셀을 포함할 수 없습니다.
집계 column family가 있는 새 테이블을 만들려면 테이블 만들기를 참고하세요. 테이블에 집계 column family를 추가하려면 column family 추가를 참고하세요.
집계 유형
Bigtable은 다음 집계 유형을 지원합니다.
합계
합계 집계 셀 (sum
)에 값을 쓰면 셀 값은 새로 추가된 값과 현재 셀 값의 합계로 대체됩니다. 합계에 지원되는 입력 유형은 Int64
입니다.
최소
최솟값 집계 셀 (min
)에 값을 쓰면 셀 값은 새로 추가된 값과 현재 셀 값 중 더 낮은 값으로 대체됩니다. min에 지원되는 입력 유형은 Int64
입니다.
최대
최대 집계 셀 (max
)에 값을 쓰면 셀 값은 새로 추가된 값과 현재 셀 값 중 더 큰 값으로 대체됩니다. max에 지원되는 입력 유형은 Int64
입니다.
HyperLogLog (HLL)
HLL 집계 셀 (inthll
)에 값을 쓰면 값이 가장 최근 재설정 이후 추가된 모든 값의 확률적 집합에 추가됩니다. 셀 값은 해당 집합의 상태를 나타냅니다. HLL 알고리즘에 관한 일반적인 정보는 HyperLogLog를 참고하세요.
Zetasketch 라이브러리를 사용하여 HLL 값을 읽을 수 있습니다. 자세한 내용은 Zetasketch GitHub 저장소를 참고하세요. HLL에 지원되는 입력 유형은 BYTES
입니다.
타임스탬프
집계 셀은 row key, column family, column qualifier, 타임스탬프로 정의됩니다. 셀에 데이터를 추가할 때마다 동일한 타임스탬프를 사용합니다. 동일한 row key, column family, column qualifier 및 다른 타임스탬프로 값을 전송하면 열에 새로운 집계 셀이 생성됩니다.
집계 셀로 전송되는 모든 요청에는 타임스탬프가 포함되어야 합니다.
입력 유형
쓰기 요청의 값 입력 유형은 column family를 만들 때 사용하는 입력 유형과 일치해야 합니다. 예를 들어 Int64
로 구성된 column family에 문자열 값을 전송하면 요청이 거부됩니다.
변형 유형
Bigtable MutateRow
요청에는 테이블 변경사항인 변형 유형이 포함됩니다. 집계 셀을 만들고 업데이트하기 위해 전송할 수 있는 변형 유형은 AddToCell
및 MergeToCell
입니다. 반면 집계되지 않은 쓰기에는 SetCell
변형이 포함됩니다. 삭제 변형을 사용하여 셀의 누적된 값을 지울 수도 있습니다.
복제된 테이블에서 집계 셀은 현재 복제 지연 내의 모든 클러스터에서 동일한 최종 값으로 수렴합니다. 최종 값은 마지막 삭제 작업 이후 또는 셀이 생성된 이후 모든 클러스터에서 해당 셀에 전송된 모든 AddToCell
변형의 집계입니다.
집계 작업에는 다른 테이블 변이와 동일한 작업 제한이 적용됩니다.
AddToCell
집계 셀에 데이터를 추가하려면(예: 카운터를 증가시키는 경우) MutateRow
요청에서 AddToCell
변형을 전송합니다. 자세한 내용은 Bigtable Data API 참조의 AddToCell
를 참고하세요.
MergeToCell
셀 간에 데이터를 복사하려면 MergeToCell
변형을 사용하세요. 예를 들어 셀 A에서 셀 B로 상태를 복사하려면 셀 A에서 읽은 값으로 [DeleteCell(B), MergeToCell(B)]
와 같은 작업을 실행하면 됩니다. 자세한 내용은 Bigtable Data API 참조의 MergeToCell
를 참고하세요.
삭제
집계되지 않은 데이터와 마찬가지로 Data API 변형을 사용하여 카운터를 재설정하거나 집계된 데이터를 삭제할 수 있습니다. 자세한 내용은 Bigtable Data API 참조의 변경을 참고하세요.
가비지 컬렉션
집계 셀은 가비지 컬렉션 중에 다른 셀과 마찬가지로 처리됩니다. 셀이 삭제 대상으로 표시되면 삭제가 인스턴스의 모든 클러스터에 복제됩니다. 자세한 내용은 복제 및 가비지 컬렉션을 참고하세요. 가비지 컬렉션에 의해 삭제된 집계 셀에 추가 요청이 전송되면 새 집계 셀이 생성됩니다.
다음 단계
- 빠른 시작을 통해
cbt
CLI를 사용하여 카운터를 만들고 업데이트하는 방법을 알아봅니다. - 집계 셀에 값을 추가하는 방법을 보여주는 코드 샘플을 참고하세요.
- 스키마 설계와 관련된 개념 검토