AWS Glue를 사용하여 Amazon S3 테이블에서 ETL 작업 실행
AWS Glue는 분석 사용자가 여러 소스의 데이터를 쉽게 검색, 준비, 이동, 통합할 수 있도록 하는 서버리스 데이터 통합 서비스입니다. AWS Glue 작업을 사용하여 데이터 레이크에 데이터를 로드하도록 추출, 전환, 적재(ETL) 파이프라인을 실행할 수 있습니다. AWS Glue에 대한 자세한 내용은 AWS Glue 개발자 안내서의 AWS Glue란 무엇입니까?를 참조하세요.
AWS Glue 작업은 소스 데이터에 연결하여 처리한 다음 데이터 대상에 작성하는 스크립트를 캡슐화합니다. 일반적으로 작업은 추출, 변환 및 로드(ETL) 스크립트를 실행합니다. 작업은 Apache Spark 런타임 환경용으로 설계된 스크립트를 실행할 수 있습니다. 작업 실행을 모니터링하여 완료 상태, 지속 시간, 시작 시간 같은 실행 시간 지표를 이해할 수 있습니다.
AWS Glue 작업을 사용하는 경우 AWS 분석 서비스와의 통합을 통해 테이블에 연결하여 S3 테이블의 데이터를 처리하거나 Amazon S3 Tables Iceberg REST 엔드포인트 또는 Amazon S3 Tables Catalog for Apache Iceberg를 사용하여 직접 연결할 수 있습니다. 이 안내서에서는 다음을 포함하여 S3 Tables에서 AWS Glue의 사용을 시작하기 위한 기본 단계를 다룹니다.
사전 조건
AWS Glue 작업에서 테이블을 쿼리하려면 먼저 AWS Glue가 작업을 실행하는 데 사용할 수 있는 IAM 역할을 구성하고 작업을 실행할 때 AWS Glue가 액세스할 수 있는 S3 버킷에 Amazon S3 Tables Catalog for Apache Iceberg JAR을 업로드해야 합니다.
테이블 버킷에 연결할 스크립트 생성
AWS Glue ETL 작업을 실행할 때 테이블 데이터에 액세스하려면 S3 테이블 버킷에 연결되는 Apache Iceberg에 대한 Spark 세션을 구성합니다. 기존 스크립트를 수정하여 테이블 버킷에 연결하거나 새 스크립트를 생성할 수 있습니다. AWS Glue 스크립트 생성에 대한 자세한 내용은 AWS Glue 개발자 안내서의 자습서: AWS Glue for Spark 스크립트 작성을 참조하세요.
다음 S3 Tables 액세스 방법 중 하나를 통해 테이블 버킷에 연결하도록 세션을 구성할 수 있습니다.
다음 액세스 방법 중에서 선택하여 설정 지침과 구성 예제를 살펴보세요.
- AWS analytics services integration
-
AWS 분석 서비스 통합을 사용하여 AWS Glue에서 Spark로 테이블을 쿼리하려면 먼저 테이블 버킷을 AWS 분석 서비스와 통합해야 합니다.
작업의 Spark 세션을 통해 또는 대화형 세션의 AWS Glue Studio 매직을 사용하여 테이블 버킷에 대한 연결을 구성할 수 있습니다. 다음 예제를 사용하려면 자리 표시자 값
을 실제 테이블 버킷에 대한 정보로 바꿉니다.
- PySpark 스크립트 사용
-
PySpark 스크립트에서 다음 코드 스니펫을 사용하여 통합을 통해 테이블 버킷에 연결하도록 AWS Glue 작업을 구성합니다.
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.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
매직을 사용하여 동일한 구성을 지정합니다.
%%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 endpoint
-
작업의 Spark 세션을 통해 또는 대화형 세션의 AWS Glue Studio 매직을 사용하여 테이블 버킷에 대한 연결을 구성할 수 있습니다. 다음 예제를 사용하려면 자리 표시자 값
을 실제 테이블 버킷에 대한 정보로 바꿉니다.
- PySpark 스크립트 사용
PySpark 스크립트에서 다음 코드 스니펫을 사용하여 엔드포인트를 통해 테이블 버킷에 연결하도록 AWS Glue 작업을 구성합니다.
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.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
:s3tablescatalog/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
매직을 사용하여 동일한 구성을 지정합니다. 자리 표시자 값을 테이블 버킷의 실제 정보로 바꿉니다.
%%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
:s3tablescatalog/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 개발자 안내서의 AWS Glue 작업에 사용되는 특수 파라미터를 참조하세요.
작업의 Spark 세션을 통해 또는 대화형 세션의 AWS Glue Studio 매직을 사용하여 테이블 버킷에 대한 연결을 구성할 수 있습니다. 다음 예제를 사용하려면 자리 표시자 값
을 실제 테이블 버킷에 대한 정보로 바꿉니다.
- PySpark 스크립트 사용
-
PySpark 스크립트에서 다음 코드 스니펫을 사용하여 JAR을 통해 테이블 버킷에 연결하도록 AWS Glue 작업을 구성합니다. 자리 표시자 값을 테이블 버킷의 실제 정보로 바꿉니다.
spark = SparkSession.builder.appName("glue-s3-tables") \
.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
매직을 사용하여 동일한 구성을 지정합니다. 자리 표시자 값을 테이블 버킷의 실제 정보로 바꿉니다.
%%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"}
샘플 스크립트
다음 예제 AWS Glue 스크립트는 PySpark 작업으로 S3 테이블 쿼리를 테스트하는 데 사용할 수 있습니다. 이러한 스크립트는 테이블 버킷에 연결한 다음 쿼리를 실행하여 새 네임스페이스를 생성하고, 샘플 테이블을 생성하고, 테이블에 데이터를 삽입하고, 테이블 데이터를 반환합니다. 스크립트를 사용하려면 자리 표시자 값
을 실제 테이블 버킷에 대한 정보로 바꿉니다.
S3 Tables 액세스 방법에 따라 다음 스크립트 중에서 선택합니다.
- S3 Tables integration with AWS analytics services
-
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.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 endpoint
-
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.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.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()
테이블을 쿼리하는 AWS Glue 작업 생성
다음 절차에서는 S3 테이블 버킷에 연결하는 AWS Glue 작업을 설정하는 방법을 보여줍니다. AWS CLI를 사용하거나 콘솔의 AWS Glue Studio 스크립트 편집기를 사용하여 이 작업을 수행할 수 있습니다. 자세한 내용은 AWS Glue 사용 설명서에서 Authoring jobs in AWS Glue를 참조하세요.
다음 절차에서는 AWS Glue Studio 스크립트 편집기를 사용하여 S3 테이블을 쿼리하는 ETL 작업을 생성하는 방법을 보여줍니다.
https://console.aws.amazon.com/glue/에서 AWS Glue 콘솔을 엽니다.
-
탐색 창에서 ETL 작업을 선택합니다.
-
스크립트 편집기를 선택한 다음 스크립트 업로드를 선택하고 생성한 PySpark 스크립트를 업로드하여 S3 테이블을 쿼리합니다.
-
작업 세부 정보 탭을 선택하고 기본 속성에 다음을 입력합니다.
-
(선택 사항) Amazon S3 Tables Catalog for Apache Iceberg 액세스 방법을 사용하는 경우 고급 속성을 확장하고 종속 JAR 경로에 사전 조건으로 S3 버킷에 업로드한 클라이언트 카탈로그 jar의 S3 URI를 입력합니다. 예: s3://amzn-s3-demo-bucket1
/jars
/s3-tables-catalog-for-iceberg-runtime-0.1.5
.jar
-
저장을 선택하여 작업을 생성합니다.
-
실행을 시작하여 작업을 시작하고 실행 탭에서 작업 상태를 검토합니다.
다음 절차에서는 AWS CLI를 사용하여 S3 테이블을 쿼리하는 ETL 작업을 생성하는 방법을 보여줍니다. 명령을 사용하려면 자리 표시자 값
을 실제 값으로 바꿉니다.
-
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