BigLake


빅쿼리의 차세대 솔루션으로 데이터 웨어하우스 + 데이터 레이크의 형태

BigLake 는 멀티 클라우드 스토리지 및 개방형 형식을 통해 균일하고 세분화된 액세스 제어를 제공하여 데이터 웨어하우스 및 데이터 레이크에 대한 데이터 액세스를 단순화하는 통합 스토리지 엔진

Connection Resource만들기

BigLake 테이블은 Connection Resource를 사용하여 Google Cloud Storage 데이터에 액세스한다.
Connection Resource는 프로젝트의 단일 테이블 또는 임의의 테이블 그룹과 연결될 수 있다.


여기 옵션에서 볼 수 있다시피 빅쿼리 옴니를 이용해 여러 타 클라우드의 스토리지에서 데이터를 가져와서 빅쿼리에서 처리할 수 있다.

Cloud Storage 데이터 레이크에 대한 액세스 설정

BigQuery가 Cloud Storage 파일에 액세스할 수 있도록 새 Connection Resource에 Cloud Storage 데이터 레이크에 대한 읽기 전용 액세스 권한을 부여할 수 있다.
Connection Resource 서비스 계정에 Storage Object Viewer IAM 역할을 부여하여 서비스 계정이 Cloud Storage 버킷에 액세스할 수 있도록 하자.

BigLake 테이블 생성



위에서 만들어준 Connection Resource와 연결

스키마

[
{
    "name": "customer_id",
    "type": "INTEGER",
    "mode": "REQUIRED"
  },
  {
    "name": "first_name",
    "type": "STRING",
    "mode": "REQUIRED"
  },
  {
    "name": "last_name",
    "type": "STRING",
    "mode": "REQUIRED"
  },
  {
    "name": "company",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "address",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "city",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "state",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "country",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "postal_code",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "phone",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "fax",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "email",
    "type": "STRING",
    "mode": "REQUIRED"
  },
  {
    "name": "support_rep_id",
    "type": "INTEGER",
    "mode": "NULLABLE"
  }
]

BigLake 테이블 생성

액세스 제어 정책 설정

BigLake 테이블이 생성되면 BigQuery 테이블과 유사한 방식으로 관리가 가능하다.
BigLake 테이블에 대한 액세스 제어 정책을 생성하려면 먼저 Data Catalog 에서 정책 태그를 생성해야 한다.
그럼 그 정책 태그를 중요한 행이나 열에 적용할 수 있다.

열 수준의 정책을 만들어 보자.
여기선 이미 만들어놓은 Data Catalog의 태그가 존재.
위에서 만들어준 빅쿼리 biglake_table 테이블로 이동 후 스키마 편집



위 사진과 같은 형식으로 태그가 지정된다.

SELECT * FROM `<프로젝트 ID>.demo_dataset.biglake_table`

위의 쿼리를 돌리면 쿼리가 되지 않고 아래의 쿼리를 돌리면 쿼리가 성공하는 것을 확인할 수 있다.
권한이 있는 열에 대해서만 조회할 수 있기 때문.

SELECT *  EXCEPT(address, phone, postal_code)
FROM `<프로젝트 ID>.demo_dataset.biglake_table`

외부 테이블을 BigLake 테이블로 업그레이드


Connection Resource 사용 x
스키마

[
{
    "name": "invoice_id",
    "type": "INTEGER",
    "mode": "REQUIRED"
  },
  {
    "name": "customer_id",
    "type": "INTEGER",
    "mode": "REQUIRED"
  },
  {
    "name": "invoice_date",
    "type": "TIMESTAMP",
    "mode": "REQUIRED"
  },
  {
    "name": "billing_address",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "billing_city",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "billing_state",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "billing_country",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "billing_postal_code",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "total",
    "type": "NUMERIC",
    "mode": "REQUIRED"
  }
]

테이블 생성

Cloud Shell 활성화한 후 아래 쿼리 입력

export PROJECT_ID=$(gcloud config get-value project)
bq mkdef \
--autodetect \
--connection_id=$PROJECT_ID.US.my-connection \
--source_format=CSV \
"gs://$PROJECT_ID/invoice.csv" > /tmp/tabledef.json

테이블에서 스키마를 가져온다

bq show --schema --format=prettyjson  demo_dataset.external_table > /tmp/schema

새 외부 테이블 정의를 사용하여 테이블 업데이트

bq update --external_table_definition=/tmp/tabledef.json --schema=/tmp/schema demo_dataset.external_table

external_table 테이블에서 확인

기존 외부 테이블을 Connection Resource에 연결하여 BigLake 테이블로 성공적으로 업그레이드한 것을 확인할 수 있다.

profile
Solutions Architect (rlaalsgud97@gmail.com)

0개의 댓글