서비스 연결 등록하기¶
이 항목에서는 Snowflake 또는 서드 파티 서비스(예: Apache Spark™)에 서비스 연결 자격 증명을 등록하는 방법에 대해 다룹니다. Snowflake Open Catalog 관리자가 서비스 연결을 등록합니다.
이 항목의 예제 코드는 Spark에서 서비스 연결을 등록하는 방법을 보여주며, 예제 코드는 PySpark로 작성됩니다.
전제 조건¶
서비스 연결을 등록하려면 먼저 서비스 연결을 구성해야 합니다. 지침은 서비스 연결 구성하기 섹션을 참조하십시오.
서비스 연결 등록하기¶
다음 예제 코드는 단일 서비스 연결을 등록하기 위한 것입니다.
참고
여러 서비스 연결을 등록할 수도 있으며, 자세한 내용은 예 2: 2개의 서비스 연결 등록하기 섹션을 참조하십시오.
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.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()
매개 변수¶
매개 변수 |
설명 |
---|---|
|
연결할 카탈로그의 이름을 지정합니다. |
|
외부 클라우드 저장소 공급자의 Maven 좌표를 지정합니다.
|
|
서비스 주체가 사용할 클라이언트 ID를 지정합니다. |
|
서비스 주체가 사용할 클라이언트 시크릿을 지정합니다. |
|
Open Catalog 계정에 대한 계정 식별자를 지정합니다. 계정의 리전과 클라우드 플랫폼에 따라, 이 식별자는 그 자체로 계정 로케이터가 되거나(예: |
|
서비스 주체에게 부여되는 주체 역할을 지정합니다. |
리전 간 서비스 연결 등록하기(Amazon S3만 해당)¶
아래의 예제 코드는 다음 조건이 true인 경우 서비스 연결을 등록하기 위한 것입니다.
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.credential','<client_id>:<client_secret>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:<principal_role_name>') \
.getOrCreate()
매개 변수¶
매개 변수 |
설명 |
---|---|
|
연결할 카탈로그의 이름을 지정합니다. |
|
서비스 주체가 사용할 클라이언트 ID를 지정합니다. |
|
서비스 주체가 사용할 클라이언트 시크릿을 지정합니다. |
|
Open Catalog 계정에 대한 계정 식별자를 지정합니다. 계정의 리전과 클라우드 플랫폼에 따라, 이 식별자는 그 자체로 계정 로케이터가 되거나(예: |
|
Apache Iceberg 테이블이 포함된 S3 버킷이 있는 리전 코드를 지정합니다. 리전 코드는 AWS 서비스 엔드포인트를 확인하고 테이블의 Region 열을 참조하십시오. |
|
서비스 주체에게 부여되는 주체 역할을 지정합니다. |
예¶
이 섹션에는 Spark에서 서비스 연결을 등록하는 예가 수록되어 있습니다.
예 1: 단일 서비스 연결 등록하기(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.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_engineer') \
.getOrCreate()
예 2: 2개의 서비스 연결 등록하기(S3)¶
중요
여러 서비스 연결을 등록하는 경우 첫 번째 연결의 코드에서
opencatalog
인스턴스를 각각의 후속 연결을 위한 코드에서 고유한 텍스트로 변경해야 합니다. 예를 들어, 다음 코드에서 첫 번째 연결의opencatalog
인스턴스는 두 번째 연결의opencatalog1
로 변경됩니다.
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.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_scientist') \
.config('spark.sql.catalog.opencatalog1', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog1.type', 'rest') \
.config('spark.sql.catalog.opencatalog1.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog1.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog1.credential','222222222222222222222222222=:3333333333333333333333333333333333333333333=') \
.config('spark.sql.catalog.opencatalog1.warehouse','Catalog2') \
.config('spark.sql.catalog.opencatalog1.scope','PRINCIPAL_ROLE:data_scientist') \
.getOrCreate()
예 3: 단일 서비스 연결 등록하기(Google의 Cloud Storage)¶
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.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_engineer') \
.getOrCreate()
예 4: 단일 서비스 연결 등록하기(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.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_engineer') \
.getOrCreate()
Open Catalog에 대한 연결 확인하기¶
Spark가 Open Catalog에 연결되었는지 확인하려면 카탈로그의 네임스페이스를 나열합니다. 자세한 내용은 네임스페이스 목록 섹션을 참조하십시오.