AWS Glue로 Amazon S3 테이블에서 ETL 작업 실행하기
AWS Glue로 Amazon S3 테이블에서 ETL 작업 실행하기 (Running ETL jobs on Amazon S3 tables with AWS Glue)
AWS Glue는 분석 사용자가 여러 소스의 데이터를 발견·준비·이동·통합하기 쉽게 해주는 서버리스 데이터 통합 서비스예요. AWS Glue 작업을 사용해 추출·변환·적재(ETL) 파이프라인을 실행해 데이터 레이크로 데이터를 로드할 수 있어요. AWS Glue에 대한 자세한 내용은 AWS Glue Developer Guide의 "What is AWS Glue?" 문서를 참고하세요.
출처: 문서
본문
AWS Glue 작업은 소스 데이터에 연결하고, 처리하고, 데이터 대상으로 작성하는 스크립트를 캡슐화해요. 일반적으로 작업은 추출·변환·적재(ETL) 스크립트를 실행해요. 작업은 Apache Spark 런타임 환경용으로 설계된 스크립트를 실행할 수 있어요. 작업 실행을 모니터링해 완료 상태, 지속 시간, 시작 시간 같은 런타임 메트릭을 이해할 수 있어요.
AWS Glue 작업에서 AWS 분석 서비스 통합으로 테이블에 연결하거나, Amazon S3 Tables Iceberg REST 엔드포인트나 Amazon S3 Tables Catalog for Apache Iceberg를 통해 직접 연결해 S3 테이블의 데이터를 처리할 수 있어요. 이 안내서는 AWS Glue를 S3 Tables와 함께 사용하는 기본 단계를 다뤄요.
접근 방법 선택
특정 AWS Glue ETL 작업 요구 사항에 따라 접근 방법을 고르세요.
- AWS 분석 서비스 통합(권장) – 여러 AWS 분석 서비스에 걸친 중앙 집중식 메타데이터 관리가 필요하거나, 기존 AWS Glue Data Catalog 권한과 선택적으로 Lake Formation을 활용해야 하거나, Athena나 Amazon EMR 같은 다른 AWS 서비스와 통합되는 프로덕션 ETL 파이프라인을 구축할 때 권장돼요.
- Amazon S3 Tables Iceberg REST 엔드포인트 – Apache Iceberg를 지원하는 서드파티 쿼리 엔진에서 S3 테이블에 연결해야 하거나, 직접 REST API 접근이 필요한 커스텀 ETL 애플리케이션을 구축하거나, AWS Glue Data Catalog에 의존하지 않고 카탈로그 작업을 제어해야 할 때 권장돼요.
- Amazon S3 Tables Catalog for Apache Iceberg – Java 클라이언트 라이브러리가 필요한 레거시 애플리케이션이나 특정 프로그래밍 시나리오에만 사용해요. 추가 JAR 종속성 관리와 복잡성 때문에 새 AWS Glue ETL 작업 구현에는 권장되지 않아요.
참고: S3 Tables는 AWS Glue 5.0 이상 버전에서 지원돼요.
1단계 – 사전 조건
AWS Glue 작업에서 테이블을 쿼리하기 전에 AWS Glue가 작업을 실행하는 데 사용할 IAM 역할을 구성해야 해요. 접근 방법을 선택해 해당 방법의 구체적인 사전 조건을 확인하세요.
AWS 분석 서비스 통합(권장)
AWS Glue 작업을 실행하기 위해 S3 Tables AWS 분석 통합을 사용하는 데 필요한 사전 조건이에요.
- 테이블 버킷을 AWS 분석 서비스와 통합해요.
- AWS Glue용 IAM 역할을 만들어요. 역할에
AmazonS3TablesFullAccess관리형 정책을 연결해요. 역할에AmazonS3FullAccess관리형 정책도 연결해요.
Amazon S3 Tables Iceberg REST 엔드포인트
AWS Glue ETL 작업을 실행하기 위해 Amazon S3 Tables Iceberg REST 엔드포인트를 사용하는 사전 조건이에요.
- AWS Glue용 IAM 역할을 만들어요. 역할에
AmazonS3TablesFullAccess관리형 정책을 연결해요. 역할에AmazonS3FullAccess관리형 정책도 연결해요.
Amazon S3 Tables Catalog for Apache Iceberg
AWS Glue ETL 작업을 실행하기 위해 Amazon S3 Tables Catalog for Apache Iceberg를 사용하는 사전 조건이에요.
- AWS Glue용 IAM 역할을 만들어요. 역할에
AmazonS3TablesFullAccess관리형 정책을 연결해요. 역할에AmazonS3FullAccess관리형 정책도 연결해요. - Amazon S3 Tables Catalog for Apache Iceberg를 사용하려면 클라이언트 카탈로그 JAR를 다운로드해 S3 버킷에 업로드해야 해요.
- 카탈로그 JAR 다운로드하기 – Maven Central에서 최신 버전을 확인해요. 브라우저를 사용하거나 다음 명령으로 Maven Central에서 JAR를 다운로드할 수 있어요. 버전 번호를 최신 버전으로 바꾸는 것을 잊지 마세요.
wget https://repo1.maven.org/maven2/software/amazon/s3tables/s3-tables-catalog-for-iceberg-runtime/0.1.5/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar - 다운로드한 JAR를 AWS Glue IAM 역할이 접근할 수 있는 S3 버킷에 업로드해요. 다음 AWS CLI 명령으로 JAR를 업로드할 수 있어요. 버전 번호를 최신 버전으로, 버킷 이름과 경로를 자신의 것으로 바꾸세요.
aws s3 cp s3-tables-catalog-for-iceberg-runtime-0.1.5.jar s3://amzn-s3-demo-bucket/jars/
- 카탈로그 JAR 다운로드하기 – Maven Central에서 최신 버전을 확인해요. 브라우저를 사용하거나 다음 명령으로 Maven Central에서 JAR를 다운로드할 수 있어요. 버전 번호를 최신 버전으로 바꾸는 것을 잊지 마세요.
2단계 – 테이블 버킷에 연결하는 스크립트 만들기
AWS Glue ETL 작업을 실행할 때 테이블 데이터에 접근하려면 S3 테이블 버킷에 연결하는 Apache Iceberg용 Spark 세션을 구성해요. 기존 스크립트를 수정해 테이블 버킷에 연결하거나 새 스크립트를 만들 수 있어요. AWS Glue 스크립트 작성에 대한 자세한 내용은 AWS Glue Developer Guide의 "Tutorial: Writing an AWS Glue for Spark script" 문서를 참고하세요.
다음 S3 Tables 접근 방법 중 하나로 세션을 테이블 버킷에 연결하도록 구성할 수 있어요.
- S3 Tables AWS 분석 서비스 통합(권장)
- Amazon S3 Tables Iceberg REST 엔드포인트
- Amazon S3 Tables Catalog for Apache Iceberg
AWS 분석 서비스 통합(권장)
AWS 분석 서비스 통합을 사용해 AWS Glue의 Spark로 테이블을 쿼리하려면 사전 조건으로 테이블 버킷을 AWS 분석 서비스와 통합해야 해요.
작업의 Spark 세션이나 대화형 세션의 AWS Glue Studio magics를 통해 테이블 버킷에 대한 연결을 구성할 수 있어요. 다음 예시를 사용할 때는 자리표시자 값을 자신의 테이블 버킷 정보로 바꾸세요.
PySpark 스크립트 사용하기
통합을 사용해 AWS Glue 작업을 테이블 버킷에 연결하도록 구성하는 PySpark 스크립트의 코드 조각은 다음과 같아요.
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog","s3tables") \
.config("spark.sql.catalog.s3tables", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tables.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.s3tables.glue.id", "111122223333:s3tablescatalog/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3tables.warehouse", "s3://amzn-s3-demo-table-bucket/warehouse/") \
.getOrCreate()
대화형 AWS Glue 세션 사용하기
AWS Glue 5.0을 사용하는 대화형 노트북 세션이라면 코드 실행 전 셀에서 %%configure magic으로 동일한 구성을 지정해요.
%%configure
{
"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3tables --conf spark.sql.catalog.s3tables=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3tables.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.s3tables.glue.id=111122223333:s3tablescatalog/amzn-s3-demo-table-bucket --conf spark.sql.catalog.s3tables.warehouse=s3://amzn-s3-demo-table-bucket/warehouse/"}
Amazon S3 Tables Iceberg REST 엔드포인트
작업의 Spark 세션이나 대화형 세션의 AWS Glue Studio magics를 통해 테이블 버킷에 대한 연결을 구성할 수 있어요. 다음 예시를 사용할 때는 자리표시자 값을 자신의 테이블 버킷 정보로 바꾸세요.
PySpark 스크립트 사용하기
엔드포인트를 사용해 AWS Glue 작업을 테이블 버킷에 연결하도록 구성하는 PySpark 스크립트의 코드 조각은 다음과 같아요.
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3_rest_catalog") \
.config("spark.sql.catalog.s3_rest_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3_rest_catalog.type", "rest") \
.config("spark.sql.catalog.s3_rest_catalog.uri", "https://s3tables.<Region>.amazonaws.com/iceberg") \
.config("spark.sql.catalog.s3_rest_catalog.warehouse", "arn:aws:s3tables:<Region>:111122223333:bucket/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled", "true") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-name", "s3tables") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-region", "<Region>") \
.config('spark.sql.catalog.s3_rest_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
대화형 AWS Glue 세션 사용하기
AWS Glue 5.0을 사용하는 대화형 노트북 세션이라면 코드 실행 전 셀에서 %%configure magic으로 동일한 구성을 지정해요. 자리표시자 값을 자신의 테이블 버킷 정보로 바꾸세요.
%%configure
{
"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3_rest_catalog --conf spark.sql.catalog.s3_rest_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3_rest_catalog.type=rest --conf spark.sql.catalog.s3_rest_catalog.uri=https://s3tables.<Region>.amazonaws.com/iceberg --conf spark.sql.catalog.s3_rest_catalog.warehouse=arn:aws:s3tables:<Region>:111122223333:bucket/amzn-s3-demo-table-bucket --conf spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled=true --conf spark.sql.catalog.s3_rest_catalog.rest.signing-name=s3tables --conf spark.sql.catalog.s3_rest_catalog.rest.signing-region=<Region> --conf spark.sql.catalog.s3_rest_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled=false"}
Amazon S3 Tables Catalog for Apache Iceberg
Amazon S3 Tables Catalog for Apache Iceberg를 사용해 테이블에 연결하는 사전 조건으로 먼저 최신 카탈로그 jar를 다운로드해 S3 버킷에 업로드해야 해요. 그런 다음 작업을 만들 때 클라이언트 카탈로그 JAR의 경로를 특수 파라미터로 추가해요. AWS Glue의 작업 파라미터에 대한 자세한 내용은 AWS Glue Developer Guide의 "Special parameters used in AWS Glue jobs" 문서를 참고하세요.
PySpark 스크립트 사용하기
JAR를 사용해 AWS Glue 작업을 테이블 버킷에 연결하도록 구성하는 PySpark 스크립트의 코드 조각은 다음과 같아요. 자리표시자 값을 자신의 테이블 버킷 정보로 바꾸세요.
spark = SparkSession.builder.appName("glue-s3-tables") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3tablesbucket") \
.config("spark.sql.catalog.s3tablesbucket", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tablesbucket.catalog-impl", "software.amazon.s3tables.iceberg.S3TablesCatalog") \
.config("spark.sql.catalog.s3tablesbucket.warehouse", "arn:aws:s3tables:<Region>:111122223333:bucket/amzn-s3-demo-table-bucket") \
.getOrCreate()
대화형 AWS Glue 세션 사용하기
AWS Glue 5.0을 사용하는 대화형 노트북 세션이라면 코드 실행 전 셀에서 %%configure magic으로 동일한 구성을 지정해요. 자리표시자 값을 자신의 테이블 버킷 정보로 바꾸세요.
%%configure
{
"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3tablesbucket --conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog --conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:<Region>:111122223333:bucket/amzn-s3-demo-table-bucket", "extra-jars": "s3://amzn-s3-demo-bucket/jars/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar"}
샘플 스크립트
다음 예시 PySpark 스크립트들은 AWS Glue 작업으로 S3 테이블을 쿼리하는 것을 테스트하는 데 사용할 수 있어요. 이 스크립트들은 테이블 버킷에 연결해 새 네임스페이스 만들기, 샘플 테이블 만들기, 테이블에 데이터 삽입하기, 테이블 데이터 반환하기 쿼리를 실행해요. 스크립트를 사용할 때는 자리표시자 값을 자신의 테이블 버킷 정보로 바꾸세요.
S3 Tables 접근 방법에 따라 다음 스크립트 중에서 선택해요.
S3 Tables와 AWS 분석 서비스 통합
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog","s3tables") \
.config("spark.sql.catalog.s3tables", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tables.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.s3tables.glue.id", "111122223333:s3tablescatalog/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3tables.warehouse", "s3://amzn-s3-demo-table-bucket/bucket/amzn-s3-demo-table-bucket") \
.getOrCreate()
namespace = "new_namespace"
table = "new_table"
spark.sql("SHOW DATABASES").show()
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
Amazon S3 Tables Iceberg REST 엔드포인트
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3_rest_catalog") \
.config("spark.sql.catalog.s3_rest_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3_rest_catalog.type", "rest") \
.config("spark.sql.catalog.s3_rest_catalog.uri", "https://s3tables.<Region>.amazonaws.com/iceberg") \
.config("spark.sql.catalog.s3_rest_catalog.warehouse", "arn:aws:s3tables:<Region>:111122223333:bucket/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled", "true") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-name", "s3tables") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-region", "<Region>") \
.config('spark.sql.catalog.s3_rest_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
namespace = "s3_tables_rest_namespace"
table = "new_table_s3_rest"
spark.sql("SHOW DATABASES").show()
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
Amazon S3 Tables Catalog for Apache Iceberg
from pyspark.sql import SparkSession
#Spark session configurations
spark = SparkSession.builder.appName("glue-s3-tables") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3tablesbucket") \
.config("spark.sql.catalog.s3tablesbucket", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tablesbucket.catalog-impl", "software.amazon.s3tables.iceberg.S3TablesCatalog") \
.config("spark.sql.catalog.s3tablesbucket.warehouse", "arn:aws:s3tables:<Region>:111122223333:bucket/amzn-s3-demo-table-bucket") \
.getOrCreate()
#Script
namespace = "new_namespace"
table = "new_table"
spark.sql(f"CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.{namespace}")
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
3단계 – 테이블을 쿼리하는 AWS Glue 작업 만들기
다음 절차는 S3 테이블 버킷에 연결하는 AWS Glue 작업을 설정하는 방법을 보여줘요. AWS CLI나 콘솔의 AWS Glue Studio 스크립트 편집기로 할 수 있어요. 자세한 내용은 AWS Glue User Guide의 "Authoring jobs in AWS Glue" 문서를 참고하세요.
AWS Glue Studio 스크립트 편집기로 S3 테이블을 쿼리하는 ETL 작업을 만드는 절차는 다음과 같아요.
사전 조건
- 1단계 – 사전 조건
- 2단계 – 테이블 버킷에 연결하는 스크립트 만들기
- https://console.aws.amazon.com/glue/ 에서 AWS Glue 콘솔을 열어요.
- 탐색 창에서 ETL jobs를 선택해요.
- Script editor를 선택한 다음 Upload script를 선택하고 S3 테이블을 쿼리하기 위해 만든 PySpark 스크립트를 업로드해요.
- Job details 탭을 선택하고 Basic properties에 다음을 입력해요. Name에 작업 이름을 입력해요. IAM Role에 AWS Glue를 위해 만든 역할을 선택해요.
- (선택 사항) Amazon S3 Tables Catalog for Apache Iceberg 접근 방법을 사용한다면 Advanced properties를 펼치고 Dependent JARs path에 사전 조건으로 S3 버킷에 업로드한 클라이언트 카탈로그 jar의 S3 URI를 입력해요. 예를 들어
s3://amzn-s3-demo-bucket1/jars/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar - 작업을 만들려면 Save를 선택해요.
- 작업을 시작하려면 Run을 선택하고 Runs 탭에서 작업 상태를 검토해요.
AWS CLI로 S3 테이블을 쿼리하는 ETL 작업을 만드는 절차는 다음과 같아요. 이 명령을 사용할 때는 자리표시자 값을 자신의 값으로 바꾸세요.
사전 조건
- 1단계 – 사전 조건
- 2단계 – 테이블 버킷에 연결하는 스크립트를 만들어 S3 버킷에 업로드해요.
- AWS Glue 작업을 만들어요.
aws glue create-job \ --name etl-tables-job \ --role arn:aws:iam::111122223333:role/AWSGlueServiceRole \ --command '{"Name": "glueetl", "ScriptLocation": "s3://amzn-s3-demo-bucket1/scripts/glue-etl-query.py", "PythonVersion": "3" }' \ --default-arguments '{"--job-language": "python", "--class": "GlueApp" }' \ --glue-version "5.0"참고: (선택 사항) Amazon S3 Tables Catalog for Apache Iceberg 접근 방법을 사용한다면
--extra-jars파라미터로--default-arguments에 클라이언트 카탈로그 JAR를 추가해요. 파라미터를 추가할 때 입력 자리표시자를 자신의 값으로 바꾸세요."--extra-jars": "s3://amzn-s3-demo-bucket/jar-path/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar" - 작업을 시작해요.
aws glue start-job-run \ --job-name etl-tables-job - 작업 상태를 검토하려면 이전 명령에서 실행 ID를 복사해 다음 명령에 입력해요.
aws glue get-job-run --job-name etl-tables-job \ --run-id jr_ec9a8a302e71f8483060f87b6c309601ea9ee9c1ffc2db56706dfcceb3d0e1ad
더 알아보기 (Learn more)
- Amazon Data Firehose (Amazon Data Firehose)
- SageMaker Unified Studio로 S3 Tables 쿼리하기 (Querying S3 Tables with SageMaker Unified Studio)