Cloud Bigtable 데이터 쿼리

이 페이지에서는 BigQuery를 사용하여 Cloud Bigtable에 저장된 데이터를 쿼리하는 방법을 설명합니다.

Cloud Bigtable은 수십억 개의 행, 수천 개의 열, 수 페타바이트의 데이터까지 확장할 수 있으며 데이터 밀도가 낮은 Google의 NoSQL 데이터베이스입니다. Cloud Bigtable은 Apache HBase와 유사한 데이터 모델을 가지고 있으며 HBase 호환 클라이언트 라이브러리를 제공합니다. Cloud Bigtable 데이터 모델에 대한 자세한 내용은 스토리지 모델을 참조하세요.

지원되는 리전 및 영역

현재 다음 리전 및 영역에서만 Cloud Bigtable의 데이터 쿼리를 사용할 수 있습니다.
리전 영역
us-central1

us-central1-a

us-central1-b

us-central1-c

us-central1-f

europe-west1

europe-west1-b

europe-west1-c

europe-west1-d

Cloud Bigtable URI 검색

Cloud Bigtable 데이터 소스의 외부 테이블을 만들려면 Cloud Bigtable URI를 제공해야 합니다. Cloud Bigtable URI를 검색하려면 다음 안내를 따르세요.

  1. Cloud Bigtable 콘솔을 엽니다.

    Cloud Bigtable 콘솔 열기

  2. Cloud Bigtable 데이터 소스에 대한 다음 세부정보를 검색합니다.

    • 프로젝트 ID
    • Cloud Bigtable 인스턴스 ID
    • Cloud Bigtable 테이블의 이름
  3. 다음 형식으로 Cloud Bigtable URI를 작성합니다. 각 항목의 의미는 다음과 같습니다.

    • project_id는 Cloud Bigtable 인스턴스가 들어 있는 프로젝트입니다.
    • instance_id는 Cloud Bigtable 인스턴스 ID입니다.
    • table_name은 만들고자 하는 테이블의 이름입니다.

    https://googleapis.com/bigtable/projects/project_id/instances/instance_id/tables/table_name

액세스 제어 및 범위

영구 외부 테이블 액세스 제어

Google Cloud Bigtable 데이터 소스에 연결된 영구 외부 테이블에 대한 액세스를 공유할 수 있습니다. 임시 외부 테이블에 대한 액세스는 공유할 수 없습니다.

사용자(서비스 계정 포함) 또는 그룹과 영구 외부 테이블에 대한 액세스를 공유할 수 있습니다. 외부 테이블을 쿼리하려면 사용자 또는 그룹에 최소한 다음 권한이 필요합니다.

  • 데이터세트 또는 그 이상 수준의 bigquery.dataViewer 역할: 외부 테이블이 포함된 데이터세트에 액세스
  • 프로젝트 또는 그 이상 수준의 bigquery.user 역할: 쿼리 작업 실행
  • Cloud Bigtable의 bigtable.reader 역할: 메타데이터 및 테이블에 대한 읽기 전용 액세스 제공

Compute Engine 인스턴스의 범위

Compute Engine 인스턴스를 만들 때 인스턴스의 범위 목록을 지정할 수 있습니다. 범위는 Cloud Bigtable 등의 Google Cloud 제품에 대한 인스턴스의 액세스를 제어합니다. VM에서 실행되는 애플리케이션은 서비스 계정을 사용하여 Google Cloud API를 호출합니다.

서비스 계정으로 실행되도록 Compute Engine 인스턴스를 설정하고 서비스 계정이 Cloud Bigtable 데이터 소스에 연결된 외부 테이블에 액세스하는 경우 인스턴스에 Cloud Bigtable 읽기 전용 데이터 액세스 범위(https://www.googleapis.com/auth/bigtable.data.readonly)를 추가해야 합니다. 자세한 내용은 Cloud Bigtable용 Compute Engine 인스턴스 만들기를 참조하세요.

Compute Engine 인스턴스에 범위를 적용하는 방법은 인스턴스의 서비스 계정 및 액세스 범위 변경을 참조하세요. Compute Engine 서비스 계정에 대한 자세한 내용은 서비스 계정을 참조하세요.

영구 외부 테이블과 임시 외부 테이블

영구 테이블이나 임시 테이블을 사용하여 BigQuery에서 외부 데이터 소스를 쿼리할 수 있습니다. 영구 테이블은 데이터세트에 생성되고 외부 데이터 소스에 연결된 테이블입니다. 테이블은 영구적이므로 데이터세트 수준의 액세스 권한 제어를 사용하여 기본 외부 데이터 소스에 대한 액세스 권한도 있는 다른 사용자와 테이블을 공유하고 언제든지 테이블을 쿼리할 수 있습니다.

임시 테이블을 사용하여 외부 데이터 소스를 쿼리하는 경우 쿼리를 포함하고 외부 데이터 소스에 연결된 비영구 테이블을 만드는 명령어를 사용합니다. 임시 테이블을 사용하는 경우 BigQuery 데이터세트 중 하나에 테이블을 만들지 않습니다. 테이블이 데이터세트에 영구적으로 저장되지 않으므로 다른 사용자와 테이블을 공유할 수 없습니다. 임시 테이블을 사용하여 외부 데이터 소스를 쿼리하면 외부 데이터를 대상으로 하는 일회성 임시 쿼리 또는 ETL(추출, 변환, 로드) 프로세스에 유용합니다.

영구 외부 테이블을 사용하여 Cloud Bigtable 데이터 쿼리

영구 테이블을 사용하여 Cloud Bigtable 데이터 소스를 쿼리하려면 Cloud Bigtable 데이터 소스에 연결된 BigQuery 데이터세트에 테이블을 만듭니다. 데이터는 BigQuery 테이블에 저장되지 않습니다. 테이블은 영구적이므로 데이터세트 수준의 액세스 제어를 사용하여 기본 Cloud Bigtable 데이터 소스에 대한 액세스 권한도 있는 다른 사용자와 테이블을 공유할 수 있습니다.

Cloud Bigtable 데이터 소스에 연결된 BigQuery에 영구 외부 테이블을 만들 때 테이블의 스키마를 지정하는 두 가지 방법이 있습니다.

  • API나 CLI를 사용하는 경우 외부 데이터 소스의 스키마와 메타데이터를 정의하는 테이블 정의 파일을 만듭니다.
  • Cloud Console 또는 기본 BigQuery 웹 UI를 사용하는 경우 Cloud Bigtable column family와 한정자를 직접 입력합니다.

영구 외부 테이블을 사용하여 Cloud Bigtable 데이터를 쿼리하려면 다음을 수행하세요.

  • 테이블 정의 파일을 만듭니다(CLI 또는 API의 경우).
  • 외부 데이터 소스에 연결된 BigQuery에 테이블을 만듭니다.
  • 영구 테이블을 사용하여 데이터를 쿼리합니다.

영구 외부 테이블 만들기 및 쿼리

영구 테이블을 만들고 쿼리하려면 다음 안내를 따르세요.

Console

현재 Cloud Console을 사용하여 Cloud Bigtable에서 데이터를 쿼리할 수 없습니다.

기본 UI

  1. BigQuery 웹 UI로 이동합니다.
    BigQuery 웹 UI로 이동

  2. 탐색 패널에서 데이터세트에 마우스를 가져간 다음 아래쪽 화살표 아이콘 아래쪽 화살표 아이콘 이미지을 클릭한 후 새 테이블 만들기를 클릭합니다.

  3. 테이블 만들기 페이지의 소스 데이터 섹션에서 다음을 수행합니다.

    • 위치에 Google Cloud Bigtable을 선택하고 소스 필드에 Cloud Bigtable URI를 https://googleapis.com/bigtable/projects/project_id/instances/instance_id/tables/table_name 형식으로 입력합니다. 여기에서 project_id는 Cloud Bigtable 인스턴스를 포함하는 프로젝트이고, instance_id는 Cloud Bigtable 인스턴스 ID이고, table_name은 쿼리하는 테이블의 이름입니다.
    • 파일 형식에 Cloud Bigtable이 선택되었는지 확인합니다.
  4. 테이블 만들기 페이지의 대상 테이블 섹션에서 다음을 수행합니다.

    • 테이블 이름으로 적당한 데이터세트를 선택하고 테이블 이름 필드에 BigQuery에서 생성 중인 영구 테이블 이름을 입력합니다.
    • 테이블 유형이 외부 테이블로 설정되어 있는지 확인합니다.
  5. Column Family and Qualifiers(column family 및 한정자) 상자에서 Add Family(family 추가)를 사용하여 column family 및 한정자를 지정하거나 텍스트로 편집을 클릭하고 column family 및 한정자의 JSON 배열을 입력합니다. 이 목록은 쿼리에서 참조할 수 있는 column family를 제한하고 해당 값 유형을 지정합니다. 예를 들면 다음과 같습니다.

      [
        {
          "familyId": "family_int",
          "type": "INTEGER",
          "encoding": "BINARY",
          "onlyReadLatest": "true",
          "columns": [
            {
              "qualifierString": "foo",
              "onlyReadLatest": "true"
            }
          ]
        }
      ]
    
    column qualifier 목록을 사용하여 유형 변환을 수행할 수 있습니다. 목록을 비워 두면 모든 column family가 테이블 스키마에 포함되고 해당 값은 BYTES로 읽힙니다. 자세한 내용은 API 문서에서 externalDataConfiguration의 Cloud Bigtable 옵션을 참조하세요.

  6. 옵션 섹션에서 관련 항목을 선택하고 테이블 만들기를 클릭합니다.

영구 테이블이 생성된 후에는 기본 BigQuery 테이블인 것처럼 이 테이블에 대해 쿼리를 실행할 수 있습니다. 쿼리가 완료되면 결과를 CSV 또는 JSON 파일로 내보내거나, 테이블로 저장하거나, Google 스프레드시트에 저장할 수 있습니다.

CLI

bq mk 명령어를 사용하여 BigQuery 명령줄 도구에서 테이블을 만듭니다. CLI를 사용하여 외부 데이터 소스에 연결된 테이블을 만드는 경우 테이블 정의 파일을 사용하여 테이블의 스키마를 식별합니다.

  1. bq mk 명령어를 사용하여 영구 테이블을 만듭니다.

    bq mk \
    --external_table_definition=definition_file \
    dataset.table
    

    각 항목의 의미는 다음과 같습니다.

    • definition_file은 로컬 머신에 있는 테이블 정의 파일의 경로입니다.
    • dataset는 테이블이 들어 있는 데이터세트의 이름입니다.
    • table은 만드는 테이블의 이름입니다.

    그러면 외부 데이터 소스에 대한 제한이 적용되는 기본 BigQuery 테이블처럼 테이블에 대해 쿼리를 실행할 수 있습니다.

API

  • 테이블 리소스sourceUris 속성으로 정확히 하나의 Cloud Bigtable URI를 지정할 수 있으며 이는 완전하게 지정된 유효한 HTTPS URL이어야 합니다.

  • sourceFormat 속성을 설정하여 데이터 형식 속성을 지정합니다. Cloud Bigtable의 경우 "BIGTABLE"을 지정합니다.

임시 외부 테이블을 사용하여 Cloud Bigtable 데이터 쿼리하기

영구 테이블을 만들지 않고 외부 데이터 소스를 쿼리하려면 다음을 결합하는 명령어를 실행합니다.

테이블 정의 파일이나 제공된 스키마는 임시 외부 테이블을 만드는 데 사용되며, 임시 외부 테이블을 대상으로 쿼리가 실행됩니다. 임시 테이블을 사용한 외부 데이터 소스 쿼리는 BigQuery CLI 및 API에서 지원됩니다.

임시 외부 테이블을 사용하는 경우, BigQuery 데이터세트 중 하나에 테이블을 만들지 마세요. 테이블이 데이터세트에 영구적으로 저장되지 않으므로, 다른 사용자와 테이블을 공유할 수 없습니다. 임시 테이블을 사용하여 외부 데이터 소스를 쿼리하면 외부 데이터를 대상으로 하는 일회성 임시 쿼리 또는 ETL(추출, 변환, 로드) 프로세스에 유용합니다.

임시 외부 테이블 만들기 및 쿼리하기

임시 외부 테이블을 사용하여 Cloud Bigtable 데이터를 쿼리하려면 다음을 수행하세요.

현재 CLI와 API를 사용하여 임시 외부 테이블을 만들고 쿼리할 수 있습니다.

CLI

테이블 정의 파일을 사용하여 임시 테이블을 쿼리하려면 --external_table_definition 플래그가 지정된 bq query 명령어를 입력합니다.

(선택사항) --location 플래그를 지정하고 값을 사용자의 위치로 설정합니다.

bq --location=location query \
--use_legacy_sql=false \
--external_table_definition=table::definition_file \
'query'

각 항목의 의미는 다음과 같습니다.

  • location은 사용자 위치의 이름입니다. --location 플래그는 선택사항입니다.
  • table은 만들고 있는 임시 테이블의 이름입니다.
  • definition_file은 로컬 머신에 있는 테이블 정의 파일의 경로입니다.
  • query는 임시 테이블에 제출하는 쿼리입니다.

예를 들어 다음 명령어는 follows_def라는 테이블 정의 파일을 사용하여 follows라는 임시 파일을 만들고 쿼리합니다.

bq query \
--use_legacy_sql=false \
--external_table_definition=follows::/tmp/follows_def \
'SELECT
  COUNT(rowkey)
 FROM
   follows'

API

  • 쿼리를 만듭니다. 쿼리 작업 생성에 대한 자세한 내용은 데이터 쿼리를 참조하세요.

  • (선택사항) 작업 리소스jobReference 섹션에 있는 location 속성에 사용자 위치를 지정합니다.

  • 테이블 리소스ExternalDataConfiguration 속성을 설정하여 외부 데이터 소스 속성을 지정합니다.

성능에 대한 고려사항

Cloud Bigtable 외부 데이터 소스를 대상으로 하는 쿼리의 성능은 다음 세 가지 요소에 따라 달라집니다.

  • 행 수
  • 읽은 데이터의 양
  • 동시 로드의 범위

BigQuery는 쿼리에서 참조하는 column family만 읽는 방식으로 최대한 적은 양의 데이터를 읽으려고 합니다. 동시 로드의 범위는 Cloud Bigtable 클러스터의 노드 수와 테이블의 분할 수에 따라 다릅니다.

Cloud Bigtable은 로드를 기준으로 분할을 자동 병합합니다. 테이블을 자주 읽지 않는 경우 시간 경과에 따라 분할 수가 감소하고 쿼리 성능이 차츰 저하됩니다. row key를 기준으로 테이블 분할에 대한 자세한 내용은 테이블 관리하기를 참조하세요.

BigQuery에서 Cloud Bigtable을 쿼리하면 Cloud Bigtable CPU 사이클이 소모됩니다. BigQuery의 CPU 사용량은 실시간 사용자 트래픽 제공 등의 다른 동시 요청의 지연 시간과 처리량에 영향을 줄 수 있습니다. 예를 들어 Cloud Bigtable의 CPU 사용량이 높으면 검색 빈도는 낮지만 꾸준히 이용되는 쿼리가 영향을 받고 99번째 백분위수에서 지연 시간이 늘어납니다.

Cloud Bigtable CPU 사용을 모니터링하여 Cloud Console의 Cloud Bigtable 모니터링 대시보드에 명시된 권장 범위 내에 있는지 확인해야 합니다. 인스턴스의 노드 수를 늘리면 BigQuery 트래픽과 다른 동시 요청의 트래픽을 보다 잘 처리할 수 있습니다.

생성된 스키마

기본적으로 BigQuery는 column family의 값을 열 배열과 그 안의 다른 타임스탬프에 작성된 값 배열로 노출합니다. 이 스키마는 Cloud Bigtable에서 데이터의 기본 레이아웃을 보존하지만 SQL 쿼리는 어려울 수 있습니다. 상위 column family 내의 하위 필드로 열을 승격하고 각 셀에서 최신 값만 읽을 수 있습니다. 이는 기본 스키마의 두 배열을 모두 스칼라 값으로 나타낼 수 있습니다.

예시

가상의 소셜 네트워크를 위한 사용자 프로필을 저장하고 있습니다. 이를 위한 한 가지 데이터 모델로 gender, age, email에 대한 개별 열이 있는 profile column family가 있습니다.

rowkey | profile:gender| profile:age| profile:email
-------| --------------| -----------| -------------
alice  | female        | 30         | alice@gmail.com

다음은 기본 스키마를 사용하여 30세가 넘는 남성 사용자 수를 계산하는 표준 SQL 쿼리입니다.

SELECT
  COUNT(1)
FROM
  `dataset.table`
OMIT
  RECORD IF NOT SOME(profile.column.name = "gender"
    AND profile.column.cell.value = "male")
  OR NOT SOME(profile.column.name = "age"
    AND INTEGER(profile.column.cell.value) > 30)

genderage가 하위 필터로 노출되는 경우 데이터 쿼리가 더 쉬워집니다. 이들을 하위 필드로 노출하려면 테이블을 정의할 때 profile column family에 genderage를 명명된 열로 나열합니다. 이 column family부터 최신 값을 노출하도록 BigQuery에 지시할 수도 있습니다. 대개 최신 값과 유일한 값에만 관심이 있습니다.

다음은 열을 하위 필드로 노출한 후 30세가 넘는 남성 사용자 수를 계산하는 표준 SQL 쿼리입니다.

SELECT
  COUNT(1)
FROM
  `dataset.table`
WHERE
  profile.gender.cell.value="male"
  AND profile.age.cell.value > 30

genderage가 어떻게 필드로 직접 참조되는지 확인하세요. 이 설정의 JSON 구성은 다음과 같습니다.

  "bigtableOptions": {
    "readRowkeyAsString": "true",
    "columnFamilies": [
      {
          "familyId": "profile",
          "onlyReadLatest": "true",
          "columns": [
              {
                  "qualifierString": "gender",
                  "type": "STRING"
              },
              {
                  "qualifierString": "age",
                  "type": "INTEGER"
              }
          ]
      }
    ]
  }

값 인코딩

Cloud Bigtable은 데이터를 데이터 인코딩에 관계없이 원시 바이트로 저장합니다. 그러나 바이트 값은 SQL 쿼리 분석에서 제한적으로 사용됩니다. Cloud Bigtable은 텍스트와 HBase-바이너리라는 두 가지 기본 유형의 스칼라 디코딩을 제공합니다.

텍스트 형식은 모든 값이 영숫자 텍스트 문자열로 저장된다고 가정합니다. 예를 들어 정수 768은 문자열 '768'로 저장됩니다. 바이너리 인코딩은 데이터를 인코딩하는 데 메서드의 HBase Bytes.toBytes 클래스가 사용되었다고 가정하고 적절한 디코딩 메서드를 적용합니다.

쿼리 필터

행 균등 필터가 있는 쿼리만 해당하는 특정 행을 읽습니다. 예를 들어 표준 SQL 구문에서는 다음과 같습니다.

SELECT
  COUNT(follows.column.name)
FROM
  `dataset.table`
WHERE
  rowkey = "alice";

rowkey > '1'rowkey < '8'과 같은 범위 필터도 지원되지만 readRowkeyAsString 옵션으로 rowkey가 문자열로 읽히는 경우에만 해당됩니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.