BigQuery의 테이블에서 BigQuery metastore 사용
이 문서에서는 BigQuery 테이블과 Spark에서 BigQuery metastore를 사용하는 방법을 설명합니다.
BigQuery metastore를 사용하면 BigQuery에서 표준(기본 제공) 테이블, Apache Iceberg용 BigQuery 테이블, BigLake 외부 테이블을 만들고 사용할 수 있습니다.
시작하기 전에
- Google Cloud 프로젝트에 결제를 사용 설정합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
BigQuery 및 Dataproc API를 사용 설정합니다.
선택사항: BigQuery metastore의 작동 방식과 이를 사용해야 하는 이유를 알아봅니다.
선택사항: Iceberg를 사용하는 경우 다음을 사용하여 BigQuery metastore Iceberg 테이블을 BigQuery의 다른 유사한 테이블과 비교합니다.
표준 BigQuery 테이블 | BigLake 외부 테이블 | Apache Iceberg용 BigLake 외부 테이블 (BigLake Iceberg 테이블이라고도 함) | BigQuery metastore Iceberg 테이블 (미리보기) | Apache Iceberg용 BigQuery 테이블(Iceberg 관리 테이블/BigQuery Iceberg 테이블이라고도 함)(미리보기) | |
---|---|---|---|---|---|
주요 특징 | 완전 관리형 환경 | 오픈소스 및 BigQuery 엔진 전반에서 거버넌스(세분화된 액세스 제어) 및 기능이 적용됨 | BigLake 외부 테이블 기능 + 데이터 일관성, 스키마 업데이트. Spark 또는 기타 공개 엔진에서는 만들 수 없습니다. | BigLake Iceberg 테이블 기능 + 외부 엔진에서 변경 가능. DDL 또는 bq 명령줄 도구에서는 만들 수 없습니다. | BigLake Iceberg 테이블 기능 + 공공 데이터 및 메타데이터를 통한 낮은 관리 오버헤드 |
데이터 스토리지 | BigQuery 관리형 스토리지 | 사용자 관리형 버킷에서 호스팅되는 개방형 형식 데이터 | |||
개방형 모델 | (커넥터를 통한) BigQuery Storage Read API | 개방형 파일 형식(Parquet) | 개방형 라이브러리(Iceberg) | 오픈소스 호환(Iceberg 메타데이터 스냅샷) | |
거버넌스 | 통합 BigQuery 거버넌스 | ||||
쓰기(DML 및 스트리밍) | BigQuery 커넥터, API, 높은 처리량 DML, CDC를 통해 | 외부 엔진을 통해서만 쓰기 | BigQuery 커넥터, API, 높은 처리량 DML, CDC를 통해 |
필요한 역할
BigQuery metastore를 메타데이터 저장소로 사용하여 Spark 및 Dataproc를 사용하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.
-
Spark에서 BigQuery metastore 테이블을 만듭니다.
-
프로젝트의 Dataproc Serverless 서비스 계정에 대한 Dataproc 작업자(
roles/dataproc.worker
) -
프로젝트의 Dataproc Serverless 서비스 계정에 대한 BigQuery 데이터 편집자(
roles/bigquery.dataEditor
) -
프로젝트의 Dataproc Serverless 서비스 계정에 대한 스토리지 객체 관리자(
roles/storage.objectAdmin
)
-
프로젝트의 Dataproc Serverless 서비스 계정에 대한 Dataproc 작업자(
-
BigQuery에서 BigQuery metastore 테이블을 쿼리합니다.
-
프로젝트에 대한 BigQuery 데이터 뷰어(
roles/bigquery.dataViewer
) -
프로젝트에 대한 BigQuery 사용자(
roles/bigquery.user
) -
프로젝트의 스토리지 객체 뷰어(
roles/storage.objectViewer
)
-
프로젝트에 대한 BigQuery 데이터 뷰어(
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
테이블에 연결
Google Cloud 콘솔에서 데이터 세트를 만듭니다.
CREATE SCHEMA `PROJECT_ID`.DATASET_NAME;
다음을 바꿉니다.
PROJECT_ID
: 데이터 세트를 만들 Google Cloud 프로젝트의 IDDATASET_NAME
: 데이터 세트의 이름
클라우드 리소스 연결을 만듭니다.
표준 BigQuery 테이블을 만듭니다.
CREATE TABLE `PROJECT_ID`.DATASET_NAME.TABLE_NAME (name STRING,id INT64);
다음을 바꿉니다.
TABLE_NAME
: 테이블의 이름
표준 BigQuery 테이블에 데이터를 삽입합니다.
INSERT INTO `PROJECT_ID`.DATASET_NAME.TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
Apache Iceberg용 BigQuery 테이블을 만듭니다.
예를 들어 테이블을 만들려면 다음
CREATE
문을 실행합니다.CREATE TABLE `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME( name STRING,id INT64 ) WITH CONNECTION `CONNECTION_NAME` OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'STORAGE_URI');
다음을 바꿉니다.
ICEBERG_TABLE_NAME
: Iceberg 테이블의 이름(예:iceberg_managed_table
)CONNECTION_NAME
: 이전 단계에서 만든 연결의 이름 (예:myproject.us.myconnection
)STORAGE_URI
: 정규화된 Cloud Storage URI (예:gs://mybucket/table
)
Apache Iceberg용 BigQuery 테이블에 데이터를 삽입합니다.
INSERT INTO `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
읽기 전용 Iceberg 테이블을 만듭니다.
예를 들어 읽기 전용 Iceberg 테이블을 만들려면 다음
CREATE
문을 실행합니다.CREATE OR REPLACE EXTERNAL TABLE `PROJECT_ID`.DATASET_NAME.READONLY_ICEBERG_TABLE_NAME WITH CONNECTION `CONNECTION_NAME` OPTIONS ( format = 'ICEBERG', uris = ['BUCKET_PATH'], require_partition_filter = FALSE);
다음을 바꿉니다.
READONLY_ICEBERG_TABLE_NAME
: 읽기 전용 테이블의 이름BUCKET_PATH
: 외부 테이블의 데이터가 포함된 Cloud Storage 버킷 경로(['gs://bucket_name/[folder_name/]file_name']
형식)
PySpark에서 표준 테이블, 관리형 Iceberg 테이블, 읽기 전용 Iceberg 테이블을 쿼리합니다.
from pyspark.sql import SparkSession # Create a spark session spark = SparkSession.builder \ .appName("BigQuery Metastore Iceberg") \ .config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \ .config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \ .getOrCreate() spark.conf.set("viewsEnabled","true") # Use the bqms_catalog spark.sql("USE `CATALOG_NAME`;") spark.sql("USE NAMESPACE DATASET_NAME;") # Configure spark for temp results spark.sql("CREATE namespace if not exists MATERIALIZATION_NAMESPACE"); spark.conf.set("materializationDataset","MATERIALIZATION_NAMESPACE") # List the tables in the dataset df = spark.sql("SHOW TABLES;") df.show(); # Query a standard BigQuery table sql = """SELECT * FROM DATASET_NAME.TABLE_NAME""" df = spark.read.format("bigquery").load(sql) df.show() # Query a BigQuery Managed Apache Iceberg table sql = """SELECT * FROM DATASET_NAME.ICEBERG_TABLE_NAME""" df = spark.read.format("bigquery").load(sql) df.show() # Query a BigQuery Readonly Apache Iceberg table sql = """SELECT * FROM DATASET_NAME.READONLY_ICEBERG_TABLE_NAME""" df = spark.read.format("bigquery").load(sql) df.show()
다음을 바꿉니다.
WAREHOUSE_DIRECTORY
: 데이터 웨어하우스가 포함된 Cloud Storage 폴더의 URICATALOG_NAME
: 사용 중인 카탈로그의 이름MATERIALIZATION_NAMESPACE
: 임시 결과를 저장하기 위한 네임스페이스
서버리스 Spark를 사용하여 PySpark 스크립트를 실행합니다.
gcloud dataproc batches submit pyspark SCRIPT_PATH \ --version=2.2 \ --project=PROJECT_ID \ --region=REGION \ --deps-bucket=YOUR_BUCKET \ --jars=https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.1-beta.jar
다음을 바꿉니다.
SCRIPT_PATH
: 일괄 작업에서 사용하는 스크립트의 경로PROJECT_ID
: 일괄 작업을 실행할 Google Cloud 프로젝트의 IDREGION
: 워크로드가 실행되는 리전YOUR_BUCKET
: 워크로드 종속 항목을 업로드할 Cloud Storage 버킷의 위치. 버킷의gs://
URI 프리픽스는 필요하지 않습니다. 버킷 경로 또는 버킷 이름을 지정할 수 있습니다(예:mybucketname1
).