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 데이터 소스에 연결된 영구 외부 테이블에 대한 액세스를 공유할 수 있습니다. 임시 외부 테이블에 대한 액세스는 공유할 수 없습니다.

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

  • 외부 테이블을 포함하는 데이터세트에 대한 READER 또는 bigquery.dataViewer 액세스 권한
  • 쿼리 작업 실행을 위해 데이터세트를 포함하는 프로젝트에 대한 bigquery.user 액세스 권한
  • 메타데이터와 테이블에 읽기 전용으로 액세스할 수 있게 하는 Cloud Bigtable에 대한 bigtable.reader 액세스 권한

Compute Engine 인스턴스의 범위

Compute Engine 인스턴스를 만들 때 인스턴스의 범위 목록을 지정할 수 있습니다. 범위는 Cloud Bigtable 등의 Google Cloud Platform 제품에 대한 인스턴스의 액세스를 제어합니다. 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 데이터세트에 테이블을 만듭니다. 테이블은 영구적이므로 데이터세트 수준의 액세스 제어를 사용하여 기본 외부 데이터 소스에 대한 액세스 권한도 가진 다른 사용자와 테이블을 공유하고 언제든지 테이블을 쿼리할 수 있습니다.

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

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

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

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

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

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

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

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

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

콘솔

현재 GCP 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(열 그룹 및 한정자) 상자에서 Add Family(그룹 추가)를 사용하여 열 그룹 및 한정자를 지정하거나 Edit as text(텍스트로 편집)를 클릭하고 열 그룹 및 한정자의 JSON 배열을 입력합니다. 이 목록은 쿼리에서 참조할 수 있는 열 그룹을 제한하고 해당 값 유형을 지정합니다. 예를 들면 다음과 같습니다.

      [
        {
          "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 테이블처럼 테이블을 대상으로 쿼리를 실행할 수 있습니다. 웹 UI에서 테이블을 쿼리하려면 Compose Query(쿼리 작성)를 클릭하고 New Query(새 쿼리) 상자에 쿼리를 입력한 후 Run Query(쿼리 실행)를 클릭합니다.

쿼리가 완료되면 결과를 CSV 또는 JSON 파일로 내보내거나, 테이블로 저장하거나, Google 스프레드시트에 저장할 수 있습니다. 자세한 내용은 데이터 다운로드, 저장, 내보내기를 참조하세요.

CLI

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

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

    bq mk --external_table_definition=[DEFINITION_FILE] [DATASET].[TABLE_NAME]
    

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

    • [DEFINITION_FILE]은 로컬 머신에 있는 테이블 정의 파일 경로입니다.
    • [DATASET]는 테이블이 들어 있는 데이터세트의 이름입니다.
    • [TABLE_NAME]은 만들고 있는 테이블의 이름입니다.

    그런 다음 외부 데이터 소스에 대한 제한이 적용되는 네이티브 BigQuery 테이블처럼 테이블에 대해 쿼리를 실행할 수 있습니다.

API

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

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

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

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

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

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

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

CLI

테이블 정의 파일을 사용하여 임시 테이블을 쿼리하려면 다음 명령어를 입력하세요.

bq --location=[LOCATION] query --use_legacy_sql=false --external_table_definition=[TABLE_NAME]::[DEFINITION_FILE] '[QUERY]'

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

  • [LOCATION]은 사용자 위치의 이름입니다. 데이터가 US 또는 EU 다중 리전 위치에 있는 경우 --location 플래그는 선택사항입니다.
  • [TABLE_NAME]은 만들고 있는 임시 테이블의 이름입니다.
  • [DEFINITION_FILE]은 로컬 머신에 있는 테이블 정의 파일의 경로입니다.
  • [QUERY]는 임시 테이블에 제출하는 쿼리입니다.

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

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

API

성능에 대한 고려사항

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

생성된 스키마

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

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

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

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

SELECT COUNT(1) FROM `[DATASET].[TABLE_NAME]`
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_NAME]`
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_NAME]` WHERE rowkey = "alice";

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

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

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

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