Snowflake Open Catalog 시작하기
Snowflake Open Catalog 시작하기
일반적으로 사용 가능(GA) — 정부 리전에서는 사용할 수 없어요.
새 고객은 Apache Iceberg™ 테이블 및 Iceberg와의 다중 엔진 상호 운용성을 위해 Snowflake Horizon Catalog를 사용해야 해요. 이전에 Snowflake Open Catalog 계정을 만든 적이 없는 고객은 첫 번째 Open Catalog 계정에 가입할 수 없어요.
기존 Snowflake Open Catalog 고객은 계속 사용할 수 있으며 필요한 경우 추가 Open Catalog 계정을 만들 수 있어요.
본문
개요
Snowflake Open Catalog는 Apache Iceberg™용 오픈 카탈로그예요. Open Catalog는 Snowflake에서 관리되는 SaaS 서비스로 제공돼요. 또한 직접 빌드해 배포할 수 있는 오픈소스 코드로도 제공돼요.
Open Catalog는 역할 기반 접근 제어를 통한 크로스 엔진 보안과 함께 Apache Iceberg REST 카탈로그 구현을 제공해요.
이 튜토리얼에서 Snowflake에서 관리되는 Open Catalog로 시작하는 방법을 배워요.
이 튜토리얼에서는 다음 용어와 개념을 사용해요:
- Open Catalog 계정: Iceberg 테이블을 호스팅하는 Open Catalog SaaS 서비스의 계정.
- Snowflake 계정: 테이블, 워크시트, 대시보드를 만들고 쿼리를 실행하는 Snowflake 계정.
- Snowflake 조직: 다른 Snowflake DB 계정을 만들고 관리하는 데 사용되는 Snowflake 조직(Org 계정이라고도 함).
- Snowflake 엔진: Open Catalog의 iceberg 테이블에서 쿼리를 실행하는 데 사용되는 Snowflake 계정에서 실행되는 쿼리 엔진.
배우게 될 내용
- Snowflake Open Catalog를 사용해 Iceberg 테이블을 만들고 쿼리하는 방법.
- Open Catalog 계정에 새 Iceberg 카탈로그를 만들고 RBAC로 보호하는 방법.
- Apache Spark™를 사용해 카탈로그에서 테이블을 만들고 쿼리를 실행하는 방법.
- Snowflake를 사용해 카탈로그의 테이블에서 쿼리를 실행하는 방법.
- Snowflake의 관리형 Iceberg 테이블을 Open Catalog로 미러링하거나 게시하는 방법.
필요한 것
- 기존 Snowflake Open Catalog 계정에 대한 접근, 또는 이미 Open Catalog 계정이 하나 이상 있고 추가 Open Catalog 계정을 만들 자격이 있는 조직에 대한 접근.
- Snowflake 계정의 ACCOUNTADMIN 권한(Open Catalog 계정에 연결하기 위함). 이 Snowflake 계정은 Snowflake 조직 계정과 같을 필요가 없어요.
수행할 작업
두 가지 사용 사례를 완료해요:
- 사용 사례 1: Open Catalog에서 카탈로그를 만들고 Apache Spark로 테이블을 만든 다음 Apache Spark와 Snowflake로 테이블을 쿼리합니다.
- 사용 사례 2: Snowflake로 Snowflake DB 계정에 Apache Iceberg 테이블을 만들고 Open Catalog에 게시해 Apache Spark가 쿼리를 실행할 수 있게 합니다.
환경 설정
노트북에 Conda, Spark, Jupyter 설치
이 튜토리얼에서 Conda를 사용해 개발 환경을 쉽게 만들고 필요한 패키지를 다운로드할 수 있어요. 이는 사용 사례 2를 따라 Apache Spark™로 Snowflake 관리 Apache Iceberg™ 테이블을 읽을 때만 필요해요. Snowflake에서 Iceberg 테이블을 만들거나 사용하는 데는 필요하지 않아요.
- Conda를 설치하려면 운영 체제에 특정한 지침을 사용하세요: Mac, Windows, Linux.
- 다음 내용으로
environment.yml이라는 파일을 만드세요:name: iceberg-lab channels: - conda-forge dependencies: - findspark=2.0.1 - jupyter=1.0.0 - pyspark=3.5.0 - openjdk=11.0.13 - 필요한 환경을 만들려면 셸에서 다음을 실행하세요:
conda env create -f environment.yml
추가 Open Catalog 계정 만들기
이 워크플로는 이미 Open Catalog 계정이 하나 이상 있는 기존 Snowflake Open Catalog 고객에게만 적용돼요. 이전에 Open Catalog 계정을 만든 적이 없는 고객은 이 워크플로를 사용해 첫 번째 Open Catalog 계정에 가입할 수 없어요.
추가 Open Catalog 계정은 ORGADMIN만 만들 수 있어요.
- Snowsight에서 탐색 창에 Admin > Account를 선택하세요. 이 주제에서 추가 계정 생성 절차를 계속하세요.
Open Catalog 계정에 로그인
- Open Catalog 계정 URL을 클릭하거나 https://app.snowflake.com으로 이동하세요.
- Sign into a different account를 클릭하고 Open Catalog 계정에 로그인하세요.
사용 사례 1: Apache Spark™로 테이블 만들기
S3 위치에 대한 접근을 부여하는 IAM 정책 만들기
아직 없다면 S3 위치에 대한 접근을 부여하는 IAM 정책을 만드는 것으로 시작하세요. 이 정책을 만드는 지침은 S3 위치에 대한 접근을 부여하는 IAM 정책 만들기를 참조하세요.
IAM 역할 만들기
아직 없다면 S3 버킷에 대한 권한을 부여할 Open Catalog용 AWS IAM 역할을 만드세요. 지침은 IAM 역할 만들기를 참조하세요. 지침이 정책을 선택하라고 하면 S3 위치에 대한 접근을 부여하는 IAM 정책을 선택하세요.
Open Catalog에서 내부 카탈로그 만들기
Open Catalog 계정의 내부 카탈로그를 사용해 테이블을 만들고, 쿼리하고, Apache Spark™ 또는 다른 쿼리 엔진으로 테이블에 DML을 실행할 수 있어요.
- Open Catalog 계정에 로그인하세요.
- 새 카탈로그를 만들려면 왼쪽 창에서 Catalogs를 선택하세요.
- 오른쪽 위에서 +Catalog를 선택하세요.
- Create Catalog 대화 상자에서 다음 세부 정보를 입력하세요:
- Name: 카탈로그 이름을 demo_catalog로 지정하세요.
- Default base location: 테이블 데이터가 저장될 위치.
- Additional locations (optional): 여러 스토리지 위치의 쉼표로 구분된 목록. 주로 이 카탈로그에서 서로 다른 위치의 테이블을 가져와야 할 때 사용. 비워 둘 수 있어요.
- S3 role ARN: 스토리지 위치에 대한 읽기-쓰기 접근이 있는 AWS 역할. Open Catalog용으로 만든 IAM 역할의 ARN을 입력하세요.
- External ID: (optional): 카탈로그 사용자와 스토리지 계정 사이의 신뢰 관계를 만들 때 제공하려는 비밀. 생략하면 자동 생성돼요. 이 튜토리얼에서는 abc123 같은 간단한 문자열을 사용하세요.
- Create를 선택하세요. 카탈로그가 생성되고 다음 값이 카탈로그에 추가돼요:
- Open Catalog 계정의 IAM user arn.
- 직접 External ID를 입력하지 않았다면 카탈로그에 대해 자동 생성된 External ID.
다음 섹션에서 신뢰 관계를 만들 때 이 값들이 필요해요.
신뢰 관계 만들기
카탈로그를 만든 후 위 구성에 지정된 S3 역할이 스토리지 위치의 데이터를 읽고 쓸 수 있도록 신뢰 관계를 설정해야 해요. 이 작업을 완료하려면 카탈로그의 S3 IAM user arn과 External ID가 필요해요.
- 카탈로그가 생성된 후 목록에서 카탈로그를 선택해 카탈로그의 S3 IAM user arn과 External ID를 표시하세요.
- 신뢰 관계를 만들려면 5단계: IAM 사용자에게 버킷 객체 접근 권한 부여의 지침을 완료하세요.
이 지침에 표시된 JSON 객체에서:
<open_catalog_user_arn>에는 Open Catalog UI의 IAM user arn 아래 값을 사용하세요.<open_catalog_external_id>에는 Open Catalog UI의 External ID 아래 값을 사용하세요.
Apache Spark™용 새 서비스 연결 구성
방금 만든 카탈로그에 대해 쿼리를 실행하도록 Apache Spark용 새 연결(client_id/client_secret 쌍)을 만드세요.
- Open Catalog에서 왼쪽 창의 Connections 탭을 선택한 다음 오른쪽 위의 + Connection을 선택하세요.
- Configure Service Connection 대화 상자에서 새 보안 주체 역할을 만들거나 사용 가능한 역할 중 하나를 선택하세요.
- Create를 선택하세요.
- Configure Service Connection 대화 상자에서 Client ID와 Client Secret을 텍스트 편집기에 복사하려면 As <CLIENT ID>:<SECRET> 필드 안의 Copy를 선택하세요.
이 텍스트 문자열은 나중에 Open Catalog 서비스에서 검색할 수 없으므로 지금 복사해야 해요. Spark를 구성할 때 이 텍스트 문자열을 사용해요.
이 튜토리얼에서는 서비스 연결로 Open Catalog에 연결해요. External OAuth 또는 키 페어 인증으로 Open Catalog에 연결해야 한다면 다음을 참조하세요:
- Snowflake Open Catalog에서 External OAuth 구성. 이 주제에는 External OAuth에 특정한 카탈로그 권한 설정과 Spark 설정 지침이 포함돼 있어요.
- Snowflake Open Catalog에서 키 페어 인증 구성. 이 주제에는 키 페어 인증에 특정한 카탈로그 권한 설정과 Spark 설정 지침이 포함돼 있어요.
연결용 카탈로그 권한 설정
이제 서비스 연결이 카탈로그에 접근할 수 있도록 권한을 부여해요. 접근 권한이 없으면 서비스 연결은 카탈로그에서 어떤 쿼리도 실행할 수 없어요.
- 탐색 창에서 Catalogs를 선택한 다음 목록에서 카탈로그를 선택하세요.
- 새 역할을 만들려면 Roles 탭을 선택하세요.
- + Catalog role을 선택하세요.
- Create Catalog Role 대화 상자의 Name에 spark_catalog_role을 입력하세요.
- Privileges에 CATALOG_MANAGE_CONTENT를 선택한 다음 Create를 선택하세요. 이렇게 하면 역할에 테이블을 만들고, 읽고, 쓸 권한이 부여돼요.
- Grant to Principal Role을 선택하세요.
- Grant Catalog Role 대화 상자의 Principal role to receive grant에 my_spark_admin_role을 선택하세요.
- Catalog role to grant에 spark_catalog_role을 선택한 다음 Grant를 선택하세요.
이 절차의 결과로 spark_catalog_role 역할이 my_spark_admin_role에 부여되며, 이는 이전 절차에서 만든 Spark 연결에 관리 권한을 부여해요.
Spark 설정
터미널에서 다음 명령을 실행해 설정에서 만든 가상 환경을 활성화하고 Jupyter Notebooks를 여세요:
conda activate iceberg-lab
jupyter notebook
Spark 구성
- 서비스 연결을 등록하려면 Jupyter 노트북에서 다음 명령을 실행하세요.
import os
os.environ['SPARK_HOME'] = '/Users/<username>/opt/anaconda3/envs/iceberg-lab/lib/python3.12/site-packages/pyspark'
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160,software.amazon.awssdk:url-connection-client:2.20.160') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.credential','<client_id>:<client_secret>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:<principal_role_name>') \
.getOrCreate()
#Show namespaces
spark.sql("show namespaces").show()
#Create namespace
spark.sql("create namespace spark_demo")
#Use namespace
spark.sql("use namespace spark_demo")
#Show tables; this will show no tables since it is a new namespace
spark.sql("show tables").show()
#create a test table
spark.sql("create table test_table (col1 int) using iceberg");
#insert a record in the table
spark.sql("insert into test_table values (1)");
#query the table
spark.sql("select * from test_table").show();
자세한 내용은 Spark에서 서비스 연결 등록을 참조하세요.
매개변수
| 매개변수 | 설명 |
|---|---|
<catalog_name> |
연결할 카탈로그의 이름을 지정. 중요: <catalog_name>은 대소문자를 구분함. |
<maven_coordinate> |
외부 클라우드 스토리지 제공자의 Maven 좌표를 지정: S3: software.amazon.awssdk:bundle:2.20.160, Cloud Storage(from Google): org.apache.iceberg:iceberg-gcp-bundle:1.5.2, Azure: org.apache.iceberg:iceberg-azure-bundle:1.5.2. 이 매개변수가 보이지 않으면 올바른 값이 코드 샘플에 이미 지정된 것임. |
<client_id> |
사용할 서비스 주체의 클라이언트 ID를 지정. 새 서비스 연결을 구성할 때 복사한 Client ID를 입력. |
<client_secret> |
사용할 서비스 주체의 클라이언트 secret을 지정. 새 서비스 연결을 구성할 때 복사한 Secret을 입력. |
<open_catalog_account_identifier> |
Open Catalog 계정의 계정 식별자를 지정. 계정의 리전과 클라우드 플랫폼에 따라 이 식별자는 계정 로케이터 단독(예: xy12345)이거나 추가 세그먼트를 포함할 수 있음. 자세한 내용은 식별자로 계정 로케이터 사용을 참조. |
<principal_role_name> |
서비스 주체에 부여된 보안 주체 역할을 지정. 이 보안 주체 역할을 보려면 Open Catalog에서 Connections 페이지를 선택하고 서비스 연결을 선택한 다음 Principal Details 대화 상자에서 Principal Roles를 참조. |
선택 사항: S3 크로스 리전
Open Catalog 계정이 Amazon S3에 호스팅되어 있지만 S3 스토리지 버킷이 위치한 리전과 다른 리전에 있다면 추가 Spark 구성 설정을 제공해야 해요:
.config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
<target_s3_region>은 S3 스토리지 버킷이 위치한 리전을 지정해요. 리전 코드 목록은 AWS 문서의 지역 엔드포인트를 참조하세요.
다음 코드 예제는 s3 리전을 포함하도록 수정된 것이에요:
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160,software.amazon.awssdk:url-connection-client:2.20.160') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.credential','<client_id>:<secret>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:<principal_role_name>') \
.config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
.getOrCreate()
Snowflake로 테이블 쿼리
Snowflake에서 카탈로그 통합 객체를 만들고 Open Catalog의 테이블을 나타내는 Apache Iceberg™ 테이블을 Snowflake에서 만들 수 있어요. 다음 예제에서 스파크가 방금 Open Catalog의 내부 카탈로그에 만든 Iceberg 테이블을 나타내는 Iceberg 테이블을 Snowflake에서 만들어요.
같은 Spark 연결 자격 증명을 사용하거나 새 Snowflake 연결을 만들 수 있어요. 새 연결을 만들면 그에 따라 역할과 권한을 설정해야 해요.
- 카탈로그 통합 객체를 만드세요:
CREATE OR REPLACE CATALOG INTEGRATION demo_open_catalog_int CATALOG_SOURCE = POLARIS TABLE_FORMAT = ICEBERG CATALOG_NAMESPACE = '<catalog_namespace>' REST_CONFIG = ( CATALOG_URI = 'https://<orgname>-<my-snowflake-open-catalog-account-name>.snowflakecomputing.com/polaris/api/catalog' CATALOG_NAME = '<catalog_name>' ) REST_AUTHENTICATION = ( TYPE = OAUTH OAUTH_CLIENT_ID = '<client_id>' OAUTH_CLIENT_SECRET = '<secret>' OAUTH_ALLOWED_SCOPES = ('PRINCIPAL_ROLE:ALL') ) ENABLED = TRUE;- 이전 단계에서 만든
<catalog_namespace>는 spark_demo예요. - 이전 단계에서 만든
<catalog_name>은 demo_catalog예요.
- 이전 단계에서 만든
- 위에서 만든 카탈로그 통합을 사용해 Snowflake에서 테이블 표현을 만들고 쿼리하세요:
CREATE OR REPLACE ICEBERG TABLE test_table CATALOG = 'demo_open_catalog_int' EXTERNAL_VOLUME = '<external_volume>' CATALOG_TABLE_NAME = 'test_table'; SELECT * FROM test_table;
사용 사례 2: Apache Iceberg™ 테이블을 Snowflake에서 Open Catalog로 동기화
Snowflake에 Iceberg 테이블이 있다면 이를 Open Catalog에 동기화해 다른 엔진이 그 테이블을 쿼리할 수 있게 할 수 있어요.
Open Catalog에서 외부 카탈로그 만들기
Snowflake의 Iceberg 테이블은 Open Catalog 계정의 외부 카탈로그에서 동기화될 수 있어요.
- Open Catalog 계정에 로그인하세요.
- 새 카탈로그를 만들려면 왼쪽 창에서 Catalogs를 선택하세요.
- 오른쪽 위에서 +Catalog를 선택하세요.
- Create Catalog 대화 상자에서 다음 세부 정보를 입력하세요:
- Name: 카탈로그 이름을 demo_catalog_ext로 지정하세요.
- External 토글을 On으로 설정하세요.
- Default base location: 테이블 데이터가 저장될 위치.
이 튜토리얼의 사용 사례 1에서 만든 내부 카탈로그와 비교해 다른 스토리지 위치를 사용해야 해요. 카탈로그에 정의된 접근 권한이 올바르게 적용되도록 하려면 두 다른 카탈로그는 겹치는 위치를 가질 수 없어요.
- Additional locations (optional): 여러 스토리지 위치의 쉼표로 구분된 목록. 주로 이 카탈로그에서 서로 다른 위치의 테이블을 가져와야 할 때 사용. 비워 둘 수 있어요.
- S3 role ARN: 스토리지 위치에 대한 읽기-쓰기 접근이 있는 AWS 역할.
- External ID: (optional): 카탈로그 사용자와 스토리지 계정 사이의 신뢰 관계를 만들 때 제공하려는 비밀. 생략하면 자동 생성돼요. 이 튜토리얼에서는 abc123 같은 간단한 문자열을 사용하세요.
- Create를 선택하세요. 다음 값이 카탈로그에 추가돼요:
- Open Catalog 계정의 IAM user arn.
- 직접 External ID를 입력하지 않았다면 카탈로그에 대해 자동 생성된 External ID.
Snowflake용 새 서비스 연결 구성
- Open Catalog에서 왼쪽 창의 Connections 탭을 선택한 다음 오른쪽 위의 + Connection을 선택하세요.
- Configure Service Connection 대화 상자에서 새 보안 주체 역할을 만들거나 사용 가능한 역할 중 하나를 선택하세요.
- Create를 선택하세요.
- Configure Service Connection 대화 상자에서 Client ID와 Client Secret을 텍스트 편집기에 복사하려면 As <CLIENT ID>:<SECRET> 필드 안의 Copy를 선택하세요.
이 텍스트 문자열은 나중에 Open Catalog 서비스에서 검색할 수 없으므로 지금 복사해야 해요. Spark를 구성할 때 이 텍스트 문자열을 사용해요.
이 튜토리얼에서는 서비스 연결로 Open Catalog에 연결해요. External OAuth 또는 키 페어 인증으로 Open Catalog에 연결해야 한다면 다음을 참조하세요:
- Snowflake Open Catalog에서 External OAuth 구성. 이 주제에는 External OAuth에 특정한 카탈로그 권한 설정과 Spark 설정 지침이 포함돼 있어요.
- Snowflake Open Catalog에서 키 페어 인증 구성. 이 주제에는 키 페어 인증에 특정한 카탈로그 권한 설정과 Spark 설정 지침이 포함돼 있어요.
카탈로그 권한 설정
Snowflake 연결이 외부 카탈로그에 대해 올바른 권한을 갖도록 외부 카탈로그에 권한을 설정하려면 다음 단계를 따르세요:
- 탐색 창에서 Catalogs를 선택한 다음 목록에서 외부 카탈로그를 선택하세요.
- 새 역할을 만들려면 Roles 탭을 선택하세요.
- + Catalog role을 선택하세요.
- Create Catalog Role 대화 상자의 Name에 spark_catalog_role을 입력하세요.
- Privileges에 CATALOG_MANAGE_CONTENT를 선택한 다음 Create를 선택하세요. 이렇게 하면 역할에 테이블을 만들고, 읽고, 쓸 권한이 부여돼요.
- Grant to Principal Role을 선택하세요.
- Grant Catalog Role 대화 상자의 Principal role to receive grant에 my_spark_admin_role을 선택하세요.
- Catalog role to grant에 spark_catalog_role을 선택한 다음 Grant를 선택하세요.
Snowflake에서 카탈로그 통합 객체 만들기
Snowflake에서 CREATE CATALOG INTEGRATION (Snowflake Open Catalog) 명령을 사용해 카탈로그 통합 객체를 만드세요.
CATALOG_NAME에는 Open Catalog 계정에서 구성한 외부 카탈로그의 이름(demo_catalog_ext)을 지정하세요. Snowflake는 테이블과 부모 네임스페이스를 Open Catalog의 이 외부 카탈로그로 동기화해요. 예를 들어 Snowflake에 open_catalog_demo.iceberg.test_table_managed Iceberg 테이블이 등록되어 있고 카탈로그 통합에서 demo_catalog_ext를 지정한다면, Snowflake는 테이블을 다음 정규화된 이름 demo_catalog_ext.open_catalog_demo.iceberg.test_table_managed로 Open Catalog에 동기화해요.
CREATE OR REPLACE CATALOG INTEGRATION demo_open_catalog_ext
CATALOG_SOURCE=POLARIS
TABLE_FORMAT=ICEBERG
REST_CONFIG = (
CATALOG_URI = 'https://<orgname>-<my-snowflake-open-catalog-account-name>.snowflakecomputing.com/polaris/api/catalog'
CATALOG_NAME = '<catalog_name>'
)
REST_AUTHENTICATION = (
TYPE = OAUTH
OAUTH_CLIENT_ID = '<client_id>'
OAUTH_CLIENT_SECRET = '<secret>'
OAUTH_ALLOWED_SCOPES = ('PRINCIPAL_ROLE:ALL')
)
ENABLED=TRUE;
이전 단계에서 만든 <catalog_name>은 demo_catalog_ext예요.
카탈로그 동기화 설정
Snowflake 관리 Iceberg 테이블을 Open Catalog로 동기화하기 전에 Snowflake가 테이블을 동기화해야 할 Open Catalog의 외부 카탈로그를 지정해야 해요.
카탈로그 동기화를 설정하려면 CATALOG_SYNC 매개변수와 함께 ALTER DATABASE 명령을 사용하세요. 이 매개변수의 값에는 Open Catalog용 카탈로그 통합의 이름을 지정하세요. 예를 들어:
ALTER DATABASE open_catalog_demo SET CATALOG_SYNC = 'demo_open_catalog_ext';
이 코드를 실행한 후 Snowflake는 open_catalog_demo 데이터베이스의 모든 Snowflake 관리 Iceberg 테이블을 demo_open_catalog_ext 카탈로그 통합에서 지정한 Open Catalog의 <catalog_name> 외부 카탈로그로 동기화해요.
Snowflake 관리 Iceberg 테이블 만들기
Snowflake 관리 Iceberg 테이블을 만들고 Snowflake에서 Open Catalog로 동기화하세요. 자세한 내용은 다음을 참조하세요:
외부 볼륨의 STORAGE_BASE_URL은 Open Catalog에서 만든 외부 카탈로그의 Default base location과 일치해야 해요.
use database open_catalog_demo;
use schema iceberg;
# Note that the storage location for this external volume will be different than the storage location for the external volume in use case 1
CREATE OR REPLACE EXTERNAL VOLUME snowflake_demo_ext
STORAGE_LOCATIONS =
(
(
NAME = '<storage_location_name>'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://<s3_location>'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::<aws_acct>:role/<rolename>'
STORAGE_AWS_EXTERNAL_ID = '<external_id>'
)
);
CREATE OR REPLACE ICEBERG TABLE test_table_managed (col1 int)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'snowflake_demo_ext'
BASE_LOCATION = 'test_table_managed'
Snowflake에서 테이블을 수정하면 변경 사항이 Open Catalog 계정의 외부 카탈로그에 자동으로 동기화돼요. Apache Spark™ 같은 다른 엔진은 Open Catalog에 연결해 테이블을 쿼리할 수 있어요.
테이블이 Open Catalog로 동기화되지 않으면 SYSTEM$SEND_NOTIFICATIONS_TO_CATALOG 시스템 함수를 실행해 동기화 실패의 원인을 진단하세요. 자세한 내용은 SYSTEM$SEND_NOTIFICATIONS_TO_CATALOG을 참조하세요.
결론
Open Catalog 계정의 내부 카탈로그를 사용해 테이블을 만들고, 쿼리하고, Apache Spark™ 또는 다른 쿼리 엔진으로 테이블에 DML을 실행할 수 있어요. Snowflake에서 Open Catalog용 카탈로그 통합을 만들어 다음 작업을 수행할 수 있어요:
- Open Catalog 관리 테이블에서 쿼리 실행.
- Snowflake 테이블을 Open Catalog 계정의 외부 카탈로그로 동기화.
배운 내용
-
Open Catalog 계정을 사용하거나, 조직이 이미 Open Catalog 고객이라면 추가 계정 만들기.
-
Open Catalog 계정에 내부 카탈로그 만들기.
-
내부 카탈로그에서 Spark로 테이블 만들기.
-
Snowflake를 사용해 Open Catalog용 카탈로그 통합을 만들어 Open Catalog 계정의 내부 카탈로그에서 만든 테이블에 대해 쿼리를 실행하기.
-
Open Catalog 계정에 외부 카탈로그 만들기.
-
Snowflake에서 관리형 Apache Iceberg™ 테이블을 만들고 두 부모 네임스페이스와 함께 Open Catalog 계정의 외부 카탈로그에 동기화하기. 이 튜토리얼에서는 데이터베이스 수준에서 카탈로그 동기화를 설정하는 방법을 배웠어요. 하지만 계정, 스키마 또는 테이블 수준에서도 설정할 수 있으며, 하나의 부모 네임스페이스와 함께 동기화할 수 있어요. 자세한 내용은 다음 주제를 참조하세요:
- 스키마 수준에서 카탈로그 동기화 설정 예시는 Snowflake 문서의 스키마 수준에서 카탈로그 동기화 설정을 참조하세요.
- 카탈로그 동기화 설정에 대한 자세한 내용은 Snowflake 문서의 CATALOG_SYNC을 참조하세요.
- 하나의 부모 네임스페이스와 테이블을 동기화하려면 CREATE DATABASE 명령으로 CATALOG_SYNC_NAMESPACE_MODE 속성을 설정하세요. 자세히 알아보려면 CREATE DATABASE를 참조하세요.
서드파티 쿼리 엔진이 카탈로그의 네임스페이스 두 번째 수준까지만 테이블을 쿼리할 수 있다면 테이블을 하나의 부모 네임스페이스와 함께 동기화해야 해요. 그렇지 않으면 Snowflake가 테이블을 Open Catalog의 네임스페이스 세 번째 수준으로 동기화하며 테이블을 쿼리할 수 없어요.