자습서: 첫 번째 Apache Iceberg™ 테이블 만들기¶
소개¶
이 자습서에서는 Snowflake를 카탈로그로 사용하고 읽기 및 쓰기 작업을 지원하는 Apache Iceberg™ 테이블 를 생성하는 방법에 대해 설명합니다. Snowflake용 Iceberg 테이블은 일반 Snowflake 테이블의 성능 및 쿼리 의미 체계를 사용자가 관리하는 외부 클라우드 저장소와 결합합니다.
Snowsight 의 워크시트를 사용하거나 SnowSQL 같은 Snowflake 클라이언트를 사용하여 이 자습서를 완료하십시오. 코드 예제를 복사하여 붙여넣은 다음 실행할 수 있습니다.
알아볼 내용¶
이 자습서에서는 다음을 수행하는 방법에 대해 알아봅니다.
Snowflake가 관리하는 Iceberg 테이블을 위한 외부 볼륨 을 만들고 구성합니다. 이 자습서에서는 데모 목적으로 Amazon S3에 대한 외부 볼륨을 생성합니다.
Snowflake를 Iceberg 카탈로그로 사용하는 2개의 Iceberg 테이블(Snowflake 관리 테이블)을 생성합니다.
Iceberg 테이블에 데이터를 삽입합니다.
Iceberg 테이블을 쿼리합니다.
Iceberg 테이블에서 행을 삭제합니다.
전제 조건¶
시작하기 전에 다음 사항을 숙지해야 합니다.
Snowflake 오브젝트 식별자 및 요구 사항.
Snowflake의 Apache Iceberg와 Iceberg 테이블. 자세한 내용은 Apache Iceberg™ 테이블 섹션을 참조하십시오.
클라우드 오브젝트 저장소.
S3를 사용하는 경우, AWS ID 및 액세스 관리(IAM) 및 IAM 정책 요소 를 잘 알고 있어야 합니다.
다음이 필요합니다.
다음 작업을 수행할 수 있는 권한이 있는 역할이 있는 Snowflake 사용자:
30일 평가판 계정을 사용 중인 경우 해당 계정에 대해 생성된 사용자로 로그인할 수 있습니다. 이 사용자는 오브젝트 생성에 필요한 권한이 있는 역할을 가집니다.
필요한 권한이 있는 사용자가 없는 경우, 권한이 있는 사용자에게 해당 사용자를 생성해 달라고 요청합니다. ACCOUNTADMIN 역할이 있는 사용자는 새 사용자를 생성하고 필요한 권한을 부여할 수 있습니다.
외부 볼륨을 구성하려면 클라우드 저장소 공급자에 대한 관리자 액세스 권한이 필요합니다.
사용자의 Snowflake 계정을 호스팅하는 동일한 리전에 위치한 동일한 클라우드 공급자의 저장소 버킷(또는 컨테이너)입니다.
계정의 SNOWFLAKE_SAMPLE_DATA 데이터베이스에 액세스합니다. Snowflake는 기본적으로 새 계정에 샘플 데이터베이스를 만듭니다. 귀하의 계정에 데이터베이스가 생성되지 않은 경우 샘플 데이터베이스 사용하기 섹션을 참조하십시오.
웨어하우스 및 데이터베이스 설정¶
이 자습서에서 사용할 웨어하우스와 데이터베이스를 만들어 환경을 설정합니다.
CREATE WAREHOUSE iceberg_tutorial_wh
WAREHOUSE_TYPE = STANDARD
WAREHOUSE_SIZE = XSMALL;
USE WAREHOUSE iceberg_tutorial_wh;
CREATE OR REPLACE DATABASE iceberg_tutorial_db;
USE DATABASE iceberg_tutorial_db;
외부 볼륨 만들기¶
Snowflake용 Apache Iceberg™ 테이블을 생성하려면 먼저 외부 볼륨이 있어야 합니다. 외부 볼륨은 외부 클라우드 저장소의 ID 및 액세스 관리(IAM) 엔터티를 저장하는 계정 수준 Snowflake 오브젝트입니다.
Snowflake는 외부 볼륨을 사용하여 클라우드 저장소에 안전하게 연결하여 테이블 데이터와 메타데이터에 액세스합니다.
데모 목적으로, 이 단계에서는 Amazon S3에 대한 외부 볼륨을 생성하는 방법을 다룹니다. 다른 클라우드 저장소 서비스에 대한 외부 볼륨을 생성하려면 다음 항목을 참조하십시오.
S3 위치에 대한 액세스 권한을 부여하는 IAM 정책 만들기¶
AWS Management Console에서 Snowflake에 대한 액세스 권한을 구성하려면 다음을 수행하십시오.
AWS Management Console에 로그인합니다.
홈 대시보드에서 IAM 을 검색하여 선택합니다.
왼쪽 탐색 창에서 Account settings 를 선택합니다.
Endpoints 목록의 Security Token Service (STS) 에서 사용자의 계정이 위치한 Snowflake 리전 을 찾습니다. STS status 가 비활성 상태인 경우 토글을 Active 로 이동합니다.
왼쪽 탐색 창에서 Policies 를 선택합니다.
Create Policy 를 선택합니다.
Policy editor 에서 JSON 을 선택합니다.
Snowflake에 S3 위치에서 데이터를 읽고 쓸 수 있는 필요한 권한을 제공하는 정책을 추가합니다.
다음 예제 정책은 지정된 버킷의 모든 위치에 대한 액세스 권한을 부여합니다.
참고
my_bucket
을 실제 버킷 이름으로 바꿉니다. 버킷에 경로를 지정할 수도 있습니다(예:my_bucket/path
)."s3:prefix":
조건을["*"]
로 설정하면 지정된 버킷의 모든 접두사에 대한 액세스 권한이 부여되고,["path/*"]
로 설정하면 버킷의 지정된 경로에 대한 액세스 권한이 부여됩니다.정부 리전 에 있는 버킷의 경우, 버킷 ARNs은
arn:aws-us-gov:s3:::
접두사를 사용합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::<my_bucket>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<my_bucket>", "Condition": { "StringLike": { "s3:prefix": [ "*" ] } } } ] }
Next 를 선택합니다.
Policy name (예:
snowflake_access
)과 선택 사항인 Description 을 입력합니다.Create policy 를 선택합니다.
IAM 역할 만들기¶
데이터 파일이 포함된 S3 버킷에 대한 권한을 부여하는 AWS IAM 역할을 생성합니다.
ID 및 액세스 관리(IAM) 대시보드의 왼쪽 탐색 창에서 Roles 를 선택합니다.
Create role 을 선택합니다.
신뢰할 수 있는 엔터티 유형에는 AWS account 를 선택합니다.
An AWS account 에서 This account 를 선택합니다. 이후 단계에서는 신뢰 관계를 수정하고 Snowflake에 대한 액세스 권한을 부여합니다.
Require external ID 옵션을 선택합니다. 선택한 외부 ID 를 입력합니다. 예:
iceberg_table_external_id
.AWS 리소스(예: S3 버킷)에 대한 액세스 권한을 Snowflake와 같은 서드 파티에 부여하는 데 외부 ID가 사용됩니다.
Next 를 선택합니다.
외부 볼륨에 대해 생성한 정책을 선택한 다음 Next 를 선택합니다.
역할의 Role name 및 설명을 입력한 다음 Create role 을 선택합니다.
S3 위치에 대한 IAM 정책을 생성하고 IAM 역할을 생성하며 정책을 역할에 연결했습니다.
View role 을 선택하여 역할 요약 페이지를 확인합니다. 역할의 ARN (Amazon 리소스 이름) 값을 찾아서 기록합니다.
Snowflake에서 외부 볼륨 만들기¶
CREATE EXTERNAL VOLUME 명령을 사용하여 외부 볼륨을 생성합니다. 다음 예제에서는 암호화가 적용된 단일 Amazon S3 저장소 위치를 정의하는 이름이 iceberg_external_volume
인 외부 볼륨을 생성합니다.
CREATE OR REPLACE EXTERNAL VOLUME iceberg_external_volume
STORAGE_LOCATIONS =
(
(
NAME = 'my-s3-us-west-2'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://<my_bucket>/'
STORAGE_AWS_ROLE_ARN = '<arn:aws:iam::123456789012:role/myrole>'
STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id'
)
);
예제에서는 외부 볼륨에 대해 생성한 IAM 역할과 연결된 외부 ID(iceberg_table_external_id
)를 지정합니다. 외부 ID를 지정하면 여러 외부 볼륨에서 동일한 IAM 역할(및 외부 ID)을 사용할 수 있습니다.
참고
AWS에서 제공한 대로 ARNs를 정확하게 지정합니다. ARNs는 대/소문자 구분합니다.
Snowflake 계정에 대한 AWS IAM 사용자 검색¶
DESCRIBE EXTERNAL VOLUME 명령을 사용하여 Snowflake 계정에 대해 자동으로 생성된 AWS IAM 사용자에 대한 ARN를 검색합니다. 외부 볼륨의 이름을 지정합니다.
다음 예제에서는 이름이
iceberg_external_volume
인 외부 볼륨을 설명합니다.DESC EXTERNAL VOLUME iceberg_external_volume;
Snowflake 계정에 대해 생성된 AWS IAM 사용자인
STORAGE_AWS_IAM_USER_ARN
속성의 값을 기록합니다(예:arn:aws:iam::123456789001:user/abc1-b-self1234
).Snowflake는 전체 Snowflake 계정에 대해 단일 IAM 사용자를 프로비저닝합니다. 계정의 모든 S3 외부 볼륨은 해당 IAM 사용자를 사용합니다.
참고
외부 볼륨을 생성할 때 외부 ID(
STORAGE_AWS_EXTERNAL_ID
)를 지정하지 않은 경우 Snowflake는 사용할 수 있는 ID를 생성합니다. 생성된 외부 ID로 IAM 역할 신뢰 정책을 업데이트할 수 있도록 값을 기록합니다.
버킷 오브젝트에 액세스할 수 있도록 IAM 사용자 권한 부여¶
이 단계에서는 Snowflake 계정의 IAM 사용자가 S3 버킷의 오브젝트에 액세스할 수 있도록 허용하는 권한을 구성합니다.
AWS Management Console에 로그인합니다.
홈 대시보드에서 IAM 을 검색하여 선택합니다.
왼쪽 탐색 창에서 Roles 를 선택합니다.
외부 볼륨에 대해 생성한 IAM 역할을 선택합니다.
Trust relationships 탭을 선택합니다.
Edit trust policy 를 선택합니다.
기록한 DESC EXTERNAL VOLUME 출력 값으로 정책 문서를 수정합니다.
IAM 역할에 대한 정책 문서
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<iceberg_table_external_id>" } } } ] }
여기서
snowflake_user_arn
은 사용자가 기록한 STORAGE_AWS_IAM_USER_ARN 값입니다.iceberg_table_external_id
는 사용자의 외부 ID입니다. 역할을 생성할 때 외부 ID를 이미 지정하고 동일한 ID를 사용하여 외부 볼륨을 생성한 경우에는 값을 그대로 둡니다. 그렇지 않으면, 기록해 둔 값으로sts:ExternalId
를 업데이트합니다.
참고
새 외부 볼륨을 생성하고(또는 CREATE OR REPLACE EXTERNAL VOLUME 구문을 사용하여 기존 외부 볼륨을 다시 생성하고) 자체 외부 ID를 제공하지 않는 경우 이 정책 문서를 업데이트해야 합니다. 보안상의 이유로, 새 외부 볼륨이나 다시 생성된 외부 볼륨에는 다른 외부 ID가 있으며 이 신뢰 정책을 업데이트하지 않으면 신뢰 관계를 확인할 수 없습니다.
Update policy 를 선택하여 변경 사항을 저장합니다.
테이블 만들기¶
이 단계에서는 표준 CREATE ICEBERG TABLE 구문을 사용하는 테이블과 CREATE ICEBERG TABLE … AS SELECT 베리언트를 사용하는 테이블 등 두 개의 Apache Iceberg™ 테이블을 생성합니다. 두 테이블 모두 이전 단계에서 구성한 외부 볼륨을 사용합니다.
또한 데이터베이스 수준에서 Iceberg 카탈로그와 외부 볼륨을 설정하는 방법도 알아봅니다.
표준 구문을 사용하여 테이블 만들기¶
우선, 표준 CREATE ICEBERG TABLE 구문을 사용하여 Iceberg 테이블을 만듭니다.
테이블이 Snowflake를 Iceberg 카탈로그로 사용하도록 CATALOG = 'SNOWFLAKE'
를 지정합니다.
테이블 데이터와 메타데이터를 어디에 쓸지 Snowflake에 알려주려면 BASE_LOCATION
매개 변수의 값을 지정합니다. 예제에서는 테이블 이름(customer_iceberg
)을 BASE_LOCATION
으로 설정합니다. 이런 방식으로, Snowflake는 외부 볼륨 위치에 있는 테이블과 같은 이름의 디렉터리에 데이터와 메타데이터를 기록합니다.
CREATE OR REPLACE ICEBERG TABLE customer_iceberg (
c_custkey INTEGER,
c_name STRING,
c_address STRING,
c_nationkey INTEGER,
c_phone STRING,
c_acctbal INTEGER,
c_mktsegment STRING,
c_comment STRING
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'iceberg_external_volume'
BASE_LOCATION = 'customer_iceberg';
자습서 후반부에서는 SNOWFLAKE_SAMPLE_DATA 데이터베이스의 snowflake_sample_data.tpch_sf1.customer
테이블에서 이 테이블로 데이터를 로드합니다. CREATE ICEBERG TABLE 문의 열 정의가 샘플 테이블과 일치합니다.
참고
클라우드 저장소 위치를 확인하면 이제 테이블을 만드는 동안 Snowflake가 작성한 이름이 BASE_LOCATION
인 디렉터리가 metadata/
아래에 표시됩니다. 해당 디렉터리는 테이블에 대한 메타데이터 파일을 저장합니다.
데이터베이스에 대한 카탈로그 통합 및 외부 볼륨 설정¶
다음으로, 이 자습서에서 생성한 iceberg_tutorial_db
에 대한 CATALOG
및 EXTERNAL_VOLUME
매개 변수를 설정합니다. 매개 변수를 설정하면 변경 후 생성된 모든 Iceberg 테이블에 대해 선택한 특정 카탈로그 및 외부 볼륨을 사용하도록 Snowflake에 지시합니다.
ALTER DATABASE iceberg_tutorial_db SET CATALOG = 'SNOWFLAKE';
ALTER DATABASE iceberg_tutorial_db SET EXTERNAL_VOLUME = 'iceberg_external_volume';
확인하려면 현재 데이터베이스의 매개 변수(iceberg_tutorial_db
)를 확인합니다.
SHOW PARAMETERS IN DATABASE ;
CTAS를 사용하여 테이블 만들기¶
마지막으로, CREATE ICEBERG TABLE … AS SELECT 구문을 사용하여 이름이 nation_iceberg
인 두 번째 Iceberg 테이블을 생성합니다. 새 테이블은 Snowflake 샘플 데이터베이스의 snowflake_sample_data.tpch_sf1.nation
테이블을 기반으로 합니다.
참고
방금 iceberg_tutorial_db
데이터베이스에 대해 CATALOG
및 EXTERNAL_VOLUME
매개 변수를 설정했으므로 CREATE ICEBERG TABLE 문에서 두 매개 변수를 모두 생략할 수 있습니다. nation_iceberg
테이블은 이 데이터베이스에서 값을 상속받습니다.
CREATE OR REPLACE ICEBERG TABLE nation_iceberg (
n_nationkey INTEGER,
n_name STRING
)
BASE_LOCATION = 'nation_iceberg'
AS SELECT
N_NATIONKEY,
N_NAME
FROM snowflake_sample_data.tpch_sf1.nation;
데이터 로드 및 테이블 쿼리¶
이 단계에서는 INSERT INTO <table>
를 사용하여 Snowflake 샘플 데이터베이스의 데이터를 customer_iceberg
테이블에 로드하는 것으로 시작합니다.
INSERT INTO customer_iceberg
SELECT * FROM snowflake_sample_data.tpch_sf1.customer;
참고
클라우드 저장소 위치를 확인하면 STORAGE_BASE_URL/BASE_LOCATION/customer_iceberg/data/
경로에 테이블 데이터 파일이 포함된 디렉터리가 표시됩니다.
이제 테이블에 데이터가 있으므로 테이블을 쿼리할 수 있습니다. 다음 쿼리는 customer_iceberg
테이블을 (이미 데이터가 포함된) nation_iceberg
테이블과 조인합니다.
SELECT
c.c_name AS customer_name,
c.c_mktsegment AS market_segment,
n.n_name AS nation
FROM customer_iceberg c
INNER JOIN nation_iceberg n
ON c.c_nationkey = n.n_nationkey
LIMIT 15;
출력:
+--------------------+----------------+----------------+
| CUSTOMER_NAME | MARKET_SEGMENT | NATION |
|--------------------+----------------+----------------|
| Customer#000015001 | HOUSEHOLD | MOROCCO |
| Customer#000015002 | BUILDING | VIETNAM |
| Customer#000015003 | BUILDING | INDONESIA |
| Customer#000015004 | FURNITURE | SAUDI ARABIA |
| Customer#000015005 | HOUSEHOLD | KENYA |
| Customer#000015006 | BUILDING | UNITED KINGDOM |
| Customer#000015007 | MACHINERY | FRANCE |
| Customer#000015008 | HOUSEHOLD | INDIA |
| Customer#000015009 | FURNITURE | EGYPT |
| Customer#000015010 | HOUSEHOLD | ETHIOPIA |
| Customer#000015011 | FURNITURE | UNITED KINGDOM |
| Customer#000015012 | BUILDING | FRANCE |
| Customer#000015013 | FURNITURE | SAUDI ARABIA |
| Customer#000015014 | HOUSEHOLD | KENYA |
| Customer#000015015 | MACHINERY | ROMANIA |
+--------------------+----------------+----------------+
행 삭제¶
이 단계에서는 DELETE 문을 사용하여 customer_iceberg
테이블에서 특정 행을 제거합니다.
먼저 테이블의 처음 10개의 행을 쿼리하여 4개의 행이 AUTOMOBILE
시장 세그먼트에 속하는 것을 확인합니다.
SELECT
c_name AS customer_name,
c_mktsegment AS market_segment
FROM customer_iceberg
LIMIT 10;
출력:
+--------------------+----------------+
| CUSTOMER_NAME | MARKET_SEGMENT |
|--------------------+----------------|
| Customer#000000001 | BUILDING |
| Customer#000000002 | AUTOMOBILE |
| Customer#000000003 | AUTOMOBILE |
| Customer#000000004 | MACHINERY |
| Customer#000000005 | HOUSEHOLD |
| Customer#000000006 | AUTOMOBILE |
| Customer#000000007 | AUTOMOBILE |
| Customer#000000008 | BUILDING |
| Customer#000000009 | FURNITURE |
| Customer#000000010 | HOUSEHOLD |
+--------------------+----------------+
다음으로 DELETE 문을 사용하여 테이블에서 시장 세그먼트가 AUTOMOBILE
인 모든 행을 제거해 보겠습니다.
DELETE FROM customer_iceberg WHERE c_mktsegment = 'AUTOMOBILE';
출력:
+------------------------+
| number of rows deleted |
|------------------------|
| 29752 |
+------------------------+
마지막으로 행이 제거되었는지 다시 한 번 확인합니다.
SELECT
c_name AS customer_name,
c_mktsegment AS market_segment
FROM customer_iceberg
WHERE c_mktsegment = 'AUTOMOBILE';
출력:
+---------------+----------------+
| CUSTOMER_NAME | MARKET_SEGMENT |
|---------------+----------------|
+---------------+----------------+
0 Row(s) produced. Time Elapsed: 1.426s
축하합니다!
방금 첫 번째 Snowflake 관리 Iceberg 테이블에 쓰고, 읽고, 수정했습니다. 또한 Iceberg 테이블 저장소를 위한 외부 볼륨을 구성하는 방법과 데이터베이스의 모든 Iceberg 테이블에 대한 Iceberg 카탈로그와 외부 볼륨을 설정하는 방법도 알아봤습니다.
정리¶
이 자습서를 위해 생성된 모든 오브젝트를 삭제하려면 다음 DROP 문을 실행합니다.
다음 값:
my_other_database
를 사용할 데이터베이스의 이름으로 바꾸면 이 자습서를 위해 생성된 데이터베이스를 삭제할 수 있습니다.my_other_warehouse
를 생성한 외부 볼륨의 이름으로 바꿉니다.
DROP ICEBERG TABLE customer_iceberg;
DROP ICEBERG TABLE nation_iceberg;
DROP EXTERNAL VOLUME iceberg_external_volume;
USE DATABASE <my_other_database>;
DROP DATABASE iceberg_tutorial_db;
USE WAREHOUSE <my_other_warehouse>;
DROP WAREHOUSE iceberg_tutorial_wh;
요약 및 추가 리소스¶
이 자습서에서는 Snowflake 관리 Apache Iceberg™ 테이블을 생성하고 사용하는 전체 워크플로를 따라했습니다.
이 과정에서 다음 작업을 완료했습니다.
Iceberg 테이블을 위한 외부 볼륨 생성됨 외부 볼륨 및 Iceberg 테이블 저장소에 대한 자세한 내용은 외부 볼륨 구성 섹션을 참조하십시오.
Snowflake 샘플 데이터베이스의 샘플 데이터를 사용하여 Snowflake가 관리하는 Iceberg 테이블을 생성 했습니다. 관련 정보는 다음 항목을 참조하십시오.
테이블에 데이터를 로드하는 방법에 대한 자세한 내용은 Snowflake에 데이터 로딩하기 섹션을 참조하십시오.
데이터베이스의 Iceberg 카탈로그와 외부 볼륨을 설정 합니다. 이러한 매개 변수를 설정하는 방법에 대한 자세한 내용은 다음 항목을 참조하십시오.
Iceberg 테이블에 데이터를 로드하고, 쿼리하고, 행을 삭제했습니다. Iceberg 테이블과 해당 데이터 관리에 대한 자세한 내용은 Apache Iceberg™ 테이블 관리하기 섹션을 참조하십시오.
Snowflake용 Iceberg 테이블에 대해 자세히 알아보려면 Iceberg 테이블 설명서 섹션을 참조하십시오. 추가 Iceberg 자습서 및 빠른 시작을 보려면 Snowflake 자습서 페이지를 참조하십시오.