기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
오픈 테이블 형식 지원
Amazon EMR 릴리스 6.15.0 이상에는 Spark SQL AWS Lake Formation 을 사용하여 데이터를 읽고 쓸 때 Hive 테이블, Apache Iceberg, Apache Hudi 및 Delta Lake를 사용하여를 기반으로 하는 세분화된 액세스 제어에 대한 지원이 포함되어 있습니다. Amazon EMR은 Apache Hudi를 통해 테이블, 행, 열 및 셀 수준 액세스 제어를 지원합니다. Amazon EMR 릴리스 6.15.0 이상부터 AWS Lake Formation을 기반으로 행, 열 또는 셀 수준에서 세분화된 액세스 제어에 대한 지원이 포함됩니다. EMR 7.12부터 Lake Formation 벤딩 자격 증명을 사용하여 Apache Hive, Apache Iceberg 및 Delta Lake 테이블에 대해 테이블 데이터를 수정하는 DML 및 DDL 작업이 지원됩니다.
이 섹션의 주제에서는 세분화된 액세스 제어를 통해 EMR Spark 작업 또는 대화형 세션에서 열린 테이블 형식으로 Lake Formation에 등록된 테이블에 액세스하는 방법을 다룹니다.
권한 요구 사항
에 등록되지 않은 테이블 AWS Lake Formation
에 등록되지 않은 테이블 AWS Lake Formation의 경우 작업 런타임 역할은 AWS Glue 데이터 카탈로그와 Amazon S3의 기본 테이블 데이터에 모두 액세스합니다. 이를 위해서는 작업 런타임 역할에 AWS Glue 및 Amazon S3 작업 모두에 대한 적절한 IAM 권한이 있어야 합니다.
에 등록된 테이블 AWS Lake Formation
에 등록된 테이블 AWS Lake Formation의 경우 작업 런타임 역할은 AWS Glue 데이터 카탈로그 메타데이터에 액세스하고 Lake Formation에서 제공하는 임시 자격 증명은 Amazon S3의 기본 테이블 데이터에 액세스합니다. 작업을 실행하는 데 필요한 Lake Formation 권한은 Spark 작업이 시작하는 AWS Glue 데이터 카탈로그 및 Amazon S3 API 호출에 따라 달라지며 다음과 같이 요약할 수 있습니다.
-
DROP 권한을 사용하면 런타임 역할이 데이터 카탈로그에서 테이블 또는 데이터베이스 메타데이터를 삭제할 수 있습니다.
-
SELECT 권한은 런타임 역할이 Amazon S3에서 테이블 데이터를 읽을 수 있도록 허용합니다.
-
INSERT 권한은 런타임 역할이 Amazon S3에 테이블 데이터를 쓸 수 있도록 허용합니다.
-
DELETE 권한은 런타임 역할이 Amazon S3에서 테이블 데이터를 삭제할 수 있도록 허용합니다.
Lake Formation은 Spark 작업이 AWS Glue를 호출하여 테이블 메타데이터를 검색하고 Amazon S3를 호출하여 테이블 데이터를 검색할 때 권한을 느리게 평가합니다. 권한이 부족한 런타임 역할을 사용하는 작업은 Spark가 누락된 권한이 필요한 AWS Glue 또는 Amazon S3를 호출할 때까지 실패하지 않습니다.
- Hive
-
| 연산 |
AWS Lake Formation 권한 |
지원 상태 |
| SELECT |
SELECT |
지원됨 |
| CREATE TABLE |
CREATE_TABLE |
지원됨 |
| CREATE TABLE LIKE |
CREATE_TABLE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| CREATE TABLE AS SELECT |
CREATE_TABLE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| DESCRIBE TABLE |
DESCRIBE |
지원됨 |
| SHOW TBLPROPERTIES |
DESCRIBE |
지원됨 |
| SHOW COLUMNS |
DESCRIBE |
지원됨 |
| SHOW PARTITIONS |
DESCRIBE |
지원됨 |
| SHOW CREATE TABLE |
DESCRIBE |
지원됨 |
테이블 변경 tablename |
SELECT 및 ALTER |
지원됨 |
테이블 tablename 세트 위치 변경 |
- |
지원되지 않음 |
테이블 변경 파티션 tablename추가 |
SELECT, INSERT 및 ALTER |
지원됨 |
| REPAIR TABLE |
SELECT 및 ALTER |
지원됨 |
| 데이터 로드 |
|
지원되지 않음 |
| INSERT |
INSERT 및 ALTER |
지원됨 |
| INSERT OVERWRITE |
SELECT, INSERT, DELETE 및 ALTER |
지원됨 |
| DROP TABLE |
SELECT, DROP, DELETE 및 ALTER |
지원됨 |
| TRUNCATE TABLE |
SELECT, INSERT, DELETE 및 ALTER |
지원됨 |
| 데이터프레임 라이터 V1 |
해당 SQL 작업과 동일 |
기존 테이블에 데이터를 추가할 때 지원됩니다. 자세한 내용은 고려 사항 및 제한 사항을 참조하세요.
|
| Dataframe Writer V2 |
해당 SQL 작업과 동일 |
기존 테이블에 데이터를 추가할 때 지원됩니다. 자세한 내용은 고려 사항 및 제한 사항을 참조하세요.
|
- Iceberg
-
| 연산 |
AWS Lake Formation 권한 |
지원 상태 |
| SELECT |
SELECT |
지원됨 |
| CREATE TABLE |
CREATE_TABLE |
지원됨 |
| CREATE TABLE LIKE |
CREATE_TABLE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| CREATE TABLE AS SELECT |
CREATE_TABLE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| 테이블을 선택으로 바꾸기 |
SELECT, INSERT 및 ALTER |
지원됨 |
| DESCRIBE TABLE |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW TBLPROPERTIES |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW CREATE TABLE |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| ALTER TABLE |
SELECT, INSERT 및 ALTER |
지원됨 |
| ALTER TABLE SET LOCATION |
SELECT, INSERT 및 ALTER |
Amazon S3 위치에 대한 IAM 권한 지원 |
| 에서 정렬한 테이블 쓰기 변경 |
SELECT, INSERT 및 ALTER |
Amazon S3 위치에 대한 IAM 권한 지원 |
| 에서 배포한 테이블 쓰기 변경 |
SELECT, INSERT 및 ALTER |
Amazon S3 위치에 대한 IAM 권한 지원 |
| 테이블 이름 변경 테이블 |
CREATE_TABLE 및 DROP |
지원됨 |
| INSERT INTO |
SELECT, INSERT 및 ALTER |
지원됨 |
| INSERT OVERWRITE |
SELECT, INSERT 및 ALTER |
지원됨 |
| DELETE |
SELECT, INSERT 및 ALTER |
지원됨 |
| UPDATE |
SELECT, INSERT 및 ALTER |
지원됨 |
| MERGE INTO |
SELECT, INSERT 및 ALTER |
지원됨 |
| DROP TABLE |
SELECT, DELETE 및 DROP |
지원됨 |
| DataFrame Writer V1 |
- |
지원되지 않음 |
| DataFrame Writer V2 |
해당 SQL 작업과 동일 |
기존 테이블에 데이터를 추가할 때 지원됩니다. 자세한 내용은 고려 사항 및 제한 사항을 참조하세요.
|
| 메타데이터 테이블 |
SELECT |
지원 특정 테이블은 숨겨집니다. 자세한 내용은 고려 사항 및 제한 사항을 참조하세요. |
| 저장 프로시저 |
- |
다음 조건을 충족하는 테이블에 지원됩니다.
-
에 등록되지 않은 테이블 AWS Lake Formation
-
register_table 및를 사용하지 않는 테이블 migrate
자세한 내용은 고려 사항 및 제한 사항을 참조하세요.
|
Iceberg의 Spark 구성: Iceberg 형식을 사용하려면 다음 구성을 설정합니다. DB_LOCATION을 Iceberg 테이블이 있는 Amazon S3 경로로 바꾸고 리전 및 계정 ID 자리 표시자를 자체 값으로 바꾸세요.
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog
--conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION
--conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog
--conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
--conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.client.region=AWS_REGION
이전 EMR 버전에서 Iceberg 형식을 사용하려면 다음 명령을 대신 사용하세요.
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog
--conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION
--conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog
--conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
--conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.client.assume-role.region=AWS_REGION
--conf spark.sql.catalog.spark_catalog.lf.managed=true
예:
다음은 Iceberg 테이블 작업의 몇 가지 예입니다.
-- Create an Iceberg table
CREATE TABLE my_iceberg_table (
id BIGINT,
name STRING,
created_at TIMESTAMP
) USING ICEBERG;
-- Insert data
INSERT INTO my_iceberg_table VALUES (1, 'Alice', current_timestamp());
-- Query the table
SELECT * FROM my_iceberg_table;
- Hudi
-
| 연산 |
AWS Lake Formation 권한 |
지원 상태 |
| SELECT |
SELECT |
지원됨 |
| CREATE TABLE |
CREATE_TABLE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| CREATE TABLE LIKE |
CREATE_TABLE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| CREATE TABLE AS SELECT |
- |
지원되지 않음 |
| DESCRIBE TABLE |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW TBLPROPERTIES |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW COLUMNS |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW CREATE TABLE |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| ALTER TABLE |
SELECT |
Amazon S3 위치에 대한 IAM 권한 지원 |
| INSERT INTO |
SELECT 및 ALTER |
Amazon S3 위치에 대한 IAM 권한 지원 |
| INSERT OVERWRITE |
SELECT 및 ALTER |
Amazon S3 위치에 대한 IAM 권한 지원 |
| DELETE |
- |
지원되지 않음 |
| UPDATE |
- |
지원되지 않음 |
| MERGE INTO |
- |
지원되지 않음 |
| DROP TABLE |
SELECT 및 DROP |
Amazon S3 위치에 대한 IAM 권한 지원 |
| DataFrame Writer V1 |
- |
지원되지 않음 |
| DataFrame Writer V2 |
해당 SQL 작업과 동일 |
Amazon S3 위치에 대한 IAM 권한 지원 |
| 메타데이터 테이블 |
- |
지원되지 않음 |
| 테이블 유지 관리 및 유틸리티 기능 |
- |
지원되지 않음 |
Hudi에 대한 Spark 구성:
EMR 7.10 이상 버전에서 Spark 쉘을 시작하려면 다음 명령을 사용합니다.
spark-sql
--jars /usr/lib/hudi/hudi-spark-bundle.jar \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension
이전 EMR 버전에서 Spark 쉘을 시작하려면 대신 아래 명령을 사용합니다.
spark-sql
--jars /usr/lib/hudi/hudi-spark-bundle.jar \
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \
--conf spark.sql.catalog.spark_catalog.lf.managed=true
예:
다음은 Hudi 테이블 작업의 몇 가지 예입니다.
-- Create a Hudi table
CREATE TABLE my_hudi_table (
id BIGINT,
name STRING,
created_at TIMESTAMP
) USING HUDI
TBLPROPERTIES (
'type' = 'cow',
'primaryKey' = 'id'
);
-- Insert data
INSERT INTO my_hudi_table VALUES (1, 'Alice', current_timestamp());
-- Query the latest snapshot
SELECT * FROM my_hudi_table;
copy-on-write 테이블의 최신 스냅샷을 쿼리하려면:
SELECT * FROM my_hudi_cow_table
spark.read.table("my_hudi_cow_table")
압축된 최신 MOR 테이블 데이터를 쿼리하려면 _ro 접미사가 붙은 읽기 최적화 테이블을 쿼리하면 됩니다.
SELECT * FROM my_hudi_mor_table_ro
spark.read.table("my_hudi_mor_table_ro")
- Delta Lake
-
| 연산 |
AWS Lake Formation 권한 |
지원 상태 |
| SELECT |
SELECT |
지원됨 |
| CREATE TABLE |
CREATE_TABLE |
지원됨 |
| CREATE TABLE LIKE |
- |
지원되지 않음 |
| CREATE TABLE AS SELECT |
CREATE_TABLE |
지원됨 |
| 테이블을 선택으로 바꾸기 |
SELECT, INSERT 및 ALTER |
지원됨 |
| DESCRIBE TABLE |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW TBLPROPERTIES |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW COLUMNS |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| SHOW CREATE TABLE |
DESCRIBE |
Amazon S3 위치에 대한 IAM 권한 지원 |
| ALTER TABLE |
SELECT 및 INSERT |
지원됨 |
| ALTER TABLE SET LOCATION |
SELECT 및 INSERT |
Amazon S3 위치에 대한 IAM 권한 지원 |
로 테이블 tablename 클러스터 변경 |
SELECT 및 INSERT |
Amazon S3 위치에 대한 IAM 권한 지원 |
테이블 변경 제약 조건 tablename 추가 |
SELECT 및 INSERT |
Amazon S3 위치에 대한 IAM 권한 지원 |
테이블 tablename 삭제 제약 조건 변경 |
SELECT 및 INSERT |
Amazon S3 위치에 대한 IAM 권한 지원 |
| INSERT INTO |
SELECT 및 INSERT |
지원됨 |
| INSERT OVERWRITE |
SELECT 및 INSERT |
지원됨 |
| DELETE |
SELECT 및 INSERT |
지원됨 |
| UPDATE |
SELECT 및 INSERT |
지원됨 |
| MERGE INTO |
SELECT 및 INSERT |
지원됨 |
| DROP TABLE |
SELECT, DELETE 및 DROP |
지원됨 |
| DataFrame Writer V1 |
- |
지원되지 않음 |
| DataFrame Writer V2 |
해당 SQL 작업과 동일 |
지원됨
|
| 테이블 유지 관리 및 유틸리티 기능 |
- |
지원되지 않음 |
Delta Lake의 Spark 구성:
Lake Formation on EMR 7.10 이상에서 Delta Lake를 사용하려면 다음 명령을 실행합니다.
spark-sql \
--conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
Lake Formation on EMR 6.15~7.9와 함께 Delta Lake를 사용하려면 다음 명령을 실행합니다.
spark-sql \
--conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \
--conf spark.sql.catalog.spark_catalog.lf.managed=true
Lake Formation에서 레코드 서버를 사용하여 Spark 카탈로그를 관리하도록 하려면 spark.sql.catalog.<managed_catalog_name>.lf.managed를 true로 설정합니다.
예:
다음은 Delta Lake 테이블 작업의 몇 가지 예입니다.
-- Create a Delta Lake table
CREATE TABLE my_delta_table (
id BIGINT,
name STRING,
created_at TIMESTAMP
) USING DELTA;
-- Insert data
INSERT INTO my_delta_table VALUES (1, 'Alice', current_timestamp());
-- Query the table
SELECT * FROM my_delta_table;
-- Update data
UPDATE my_delta_table SET name = 'Alice Smith' WHERE id = 1;
-- Merge data
MERGE INTO my_delta_table AS target
USING (SELECT 2 as id, 'Bob' as name, current_timestamp() as created_at) AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
AWS Glue 데이터 카탈로그에서 Delta Lake 테이블 생성
Lake Formation을 사용하는 Amazon EMR은 7.12 이전 EMR 릴리스에서 DDL 명령 및 Delta 테이블 생성을 지원하지 않습니다. 다음 단계에 따라 AWS Glue 데이터 카탈로그에서 테이블을 생성합니다.
-
다음 예제 코드를 사용하여 델타 테이블을 생성합니다. S3 위치가 존재하는지 확인합니다.
spark-sql \
--conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \
--conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
> CREATE DATABASE if not exists <DATABASE_NAME> LOCATION 's3://<S3_LOCATION>/transactionaldata/native-delta/<DATABASE_NAME>/';
> CREATE TABLE <TABLE_NAME> (x INT, y STRING, z STRING) USING delta;
> INSERT INTO <TABLE_NAME> VALUES (1, 'a1', 'b1');
-
테이블의 세부 정보를 보려면 https://console.aws.amazon.com/glue/로 이동합니다.
-
왼쪽 탐색에서 Data Catalog를 확장하고 테이블을 선택한 다음, 사용자가 생성한 테이블을 선택합니다. 스키마에서 Spark로 생성한 Delta 테이블이 AWS Glue의 데이터 형식에 모든 열을 저장한다는 것을 알 array<string> 수 있습니다.
-
Lake Formation에서 열 및 셀 수준 필터를 정의하려면 스키마에서 col 열을 제거한 다음, 테이블 스키마에 있는 열을 추가합니다. 이 예제에서는 x, y, z 열을 추가합니다.
이 기능을 사용하면 copy-on-write 테이블에서 스냅샷 쿼리를 실행하여 지정된 커밋 또는 압축 인스턴스에서 테이블의 최신 스냅샷을 쿼리할 수 있습니다. 현재 Lake Formation 지원 Amazon EMR 클러스터는 증분 쿼리 및 시간 이동 쿼리를 수행하려면 Hudi의 커밋 시간 열을 검색해야 합니다. Spark의 timestamp as of 구문과 Spark.read() 함수는 지원하지 않습니다. 올바른 구문은 select * from table where _hoodie_commit_time <=
point_in_time입니다. 자세한 내용은 Point in time Time-Travel queries on Hudi table을 참조하세요.
지원되지 않는 최적화로 인해 Lake Formation 클러스터의 읽기 성능이 느려질 수 있습니다. 이러한 기능에는 Hudi 메타데이터를 기반으로 하는 파일 목록 및 데이터 건너뛰기가 포함됩니다. 애플리케이션 성능을 테스트하여 요구 사항을 충족하는지 확인하는 것이 좋습니다.