External OAuth로 Snowflake Open Catalog에 연결
External OAuth로 Snowflake Open Catalog에 연결
일반적으로 사용 가능(GA) — 정부 리전에서는 사용할 수 없어요.
이 주제는 클라이언트 애플리케이션을 사용해 External OAuth로 Snowflake Open Catalog에 연결하는 방법을 설명해요.
이 주제의 예제 코드는 Apache Spark™로 연결하는 방법을 보여주며 PySpark예요.
Snowflake를 사용해 Open Catalog 관리 테이블을 쿼리한다면 External OAuth를 사용하는 Snowflake용 카탈로그 통합을 만들 수 있어요. 자세한 내용은 Snowflake 문서의 CREATE CATALOG INTEGRATION (Snowflake Open Catalog)을 참조하세요.
본문
사전 요구 사항
External OAuth로 Open Catalog에 연결하려면 먼저 Open Catalog에서 External OAuth를 구성해야 해요. 지침은 Snowflake Open Catalog에서 External OAuth 구성을 참조하세요.
자동 리프레시 토큰으로 Open Catalog 연결 (권장 방법)
토큰을 수동으로 리프레시하지 않도록 자동 리프레시 토큰을 사용해 연결하는 방법이에요.
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,<maven_coordinate>') \
.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.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','<oauth2_server_uri>') \
.config('spark.sql.catalog.opencatalog.credential','<oauth_client_id>:<oauth_client_secret>') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:<custom_role>') \
.config('spark.sql.catalog.opencatalog.audience','https://<open_catalog_account_identifier>.snowflakecomputing.com') \
.getOrCreate()
매개변수
| 매개변수 | 설명 |
|---|---|
<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. 이 매개변수가 보이지 않으면 올바른 값이 코드 샘플에 이미 지정된 것임. |
<open_catalog_account_identifier> |
Open Catalog 계정의 계정 식별자를 지정. 계정의 리전과 클라우드 플랫폼에 따라 이 식별자는 계정 로케이터 단독(예: xy12345)이거나 추가 세그먼트를 포함할 수 있음. 자세한 내용은 식별자로 계정 로케이터 사용을 참조. |
<oauth2_server_uri> |
OAuth2 서버 URI. |
<oauth_client_id> |
OAuth2 클라이언트 ID. |
<oauth_client_secret> |
OAuth2 클라이언트 secret. |
<custom_role> |
서비스 주체에 부여할 권한을 가진 Open Catalog의 커스텀 역할 이름. |
액세스 토큰을 사용해 Open Catalog 연결
필요하면 액세스 토큰을 사용해 Open Catalog에 연결할 수 있어요. 하지만 액세스 토큰은 만료되며 수동으로 리프레시해야 해요. 대안으로 자동 리프레시 토큰을 사용해 연결할 수 있어요.
다음 예제 코드는 Spark를 사용해 Open Catalog에 연결하기 위한 것이에요.
매개변수
| 매개변수 | 설명 |
|---|---|
<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. 이 매개변수가 보이지 않으면 올바른 값이 코드 샘플에 이미 지정된 것임. |
<access_token> |
클라이언트 애플리케이션이 사용할 액세스 토큰을 지정. Open Catalog에서 External OAuth를 구성할 때 생성한 액세스 토큰을 입력. |
<open_catalog_account_identifier> |
Open Catalog 계정의 계정 식별자를 지정. 계정의 리전과 클라우드 플랫폼에 따라 이 식별자는 계정 로케이터 단독(예: xy12345)이거나 추가 세그먼트를 포함할 수 있음. 자세한 내용은 식별자로 계정 로케이터 사용을 참조. |
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,<maven_coordinate>') \
.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.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','<access_token>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.getOrCreate()
크로스 리전 연결로 연결 (Amazon S3만)
다음 예제 코드는 다음이 참일 때 Open Catalog에 연결하기 위한 것이에요:
- Open Catalog 계정이 Amazon S3에 호스팅됨.
- 외부 스토리지 제공자가 Amazon S3임.
- Open Catalog 계정이 Apache Iceberg™ 테이블을 포함하는 스토리지 버킷이 위치한 S3 리전과 다른 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') \
.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.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','<access_token>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
.getOrCreate()
매개변수
| 매개변수 | 설명 |
|---|---|
<catalog_name> |
연결할 카탈로그의 이름을 지정. 중요: <catalog_name>은 대소문자를 구분함. |
<access_token> |
클라이언트 애플리케이션이 사용할 액세스 토큰을 지정. Open Catalog에서 External OAuth를 구성할 때 생성한 액세스 토큰을 입력. |
<open_catalog_account_identifier> |
Open Catalog 계정의 계정 식별자를 지정. 계정의 리전과 클라우드 플랫폼에 따라 이 식별자는 계정 로케이터 단독(예: xy12345)이거나 추가 세그먼트를 포함할 수 있음. 자세한 내용은 식별자로 계정 로케이터 사용을 참조. |
<target_s3_region> |
Apache Iceberg 테이블을 포함하는 S3 버킷이 위치한 리전 코드를 지정. 리전 코드는 AWS 서비스 엔드포인트를 참조하고 표의 Region 열을 확인. |
예제
이 섹션은 Spark를 사용해 Open Catalog에 연결하는 예제를 포함해요:
예제 1: 연결 (S3)
다음을 참조하세요:
자동 리프레시로 연결 (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') \
.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.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
.config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:***') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
.config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
.getOrCreate()
액세스 토큰으로 연결 (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') \
.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.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.getOrCreate()
예제 2: 연결 (Cloud Storage from Google)
다음을 참조하세요:
자동 리프레시로 연결 (Cloud Storage from Google)
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,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
.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.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
.config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:***') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
.config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
.getOrCreate()
액세스 토큰으로 연결 (Cloud Storage from Google)
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,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
.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.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.getOrCreate()
예제 3: 연결 (Azure)
다음을 참조하세요:
자동 리프레시로 연결 (Azure)
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,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
.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.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
.config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:***') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
.config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
.getOrCreate()
액세스 토큰으로 연결 (Azure)
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,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
.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.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.getOrCreate()
Open Catalog 연결 확인
Spark가 Open Catalog에 연결됐는지 확인하려면 카탈로그의 네임스페이스를 나열하세요. 자세한 내용은 네임스페이스 나열을 참조하세요.