기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon EMR에서 Apache Iceberg 작업
Amazon EMR은 Apache Spark, Apache Hive, Flink, Trino와 같은 오픈 소스 프레임워크를 사용하여 클라우드에서 페타바이트 규모의 데이터 처리, 대화형 분석 및 기계 학습을 제공합니다.
참고
이 가이드에서는 Apache Spark를 예제로 사용합니다.
Amazon EMR은 Amazon EMR on Amazon EC2, Amazon EMR on Amazon EKS, Amazon EMR Serverless, Amazon EMR on 등 여러 배포 옵션을 지원합니다 AWS Outposts. 워크로드에 대한 배포 옵션을 선택하려면 Amazon EMR FAQ
버전 및 기능 호환성
Amazon EMR 버전 6.5.0 이상은 기본적으로 Apache Iceberg를 지원합니다. 각 Amazon EMR 릴리스에 지원되는 Iceberg 버전 목록은 Amazon EMR 설명서의 Iceberg 릴리스 기록을 참조하세요. 또한 다양한 프레임워크의 Amazon EMR에서 지원되는 Iceberg 기능을 확인하려면 Iceberg와 함께 클러스터 사용 섹션을 검토하세요.
지원되는 최신 Iceberg 버전을 활용하려면 최신 Amazon EMR 버전을 사용하는 것이 좋습니다. 이 섹션의 코드 예제 및 구성에서는 Amazon EMR 릴리스 emr-7.8.0을 사용한다고 가정합니다.
Iceberg를 사용하여 Amazon EMR 클러스터 생성
Iceberg가 설치된 Amazon EC2에서 Amazon EMR 클러스터를 생성하려면 Amazon EMR 설명서의 지침을 따르세요.
특히 클러스터는 다음 분류로 구성되어야 합니다.
[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]
Amazon EMR 6.6.0부터 Amazon EMR Serverless 또는 Amazon EKS 기반 Amazon EMR을 Iceberg 워크로드의 배포 옵션으로 사용하도록 선택할 수도 있습니다.
Amazon EMR에서 Iceberg 애플리케이션 개발
Iceberg 애플리케이션을 위한 Spark 코드를 개발하려면 Amazon EMR 클러스터에서 실행되는 완전 관리형 Jupyter 노트북을 위한 웹 기반 통합 개발 환경(IDE)인 Amazon EMR Studio를 사용할 수 있습니다.
Amazon EMR Studio 노트북 사용
Amazon EMR Studio Workspace 노트북에서 Spark 애플리케이션을 대화형으로 개발하고 해당 노트북을 Amazon EC2 클러스터의 Amazon EMR 또는 Amazon EKS 관리형 엔드포인트의 Amazon EMR에 연결할 수 있습니다. Amazon ECAmazon EC2 및 Amazon EKS의 Amazon EMR용 EMR Studio 설정에 대한 지침은 AWS 서비스 설명서를 참조하세요. https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-create-eks-cluster.html
EMR Studio에서 Iceberg를 사용하려면 다음 단계를 따르세요.
-
Iceberg가 설치된 클러스터 사용의 지침에 따라 Iceberg가 활성화된 Amazon EMR 클러스터를 시작합니다.
-
EMR Studio를 설정합니다. 지침은 Amazon EMR Studio 설정을 참조하세요.
-
EMR Studio Workspace 노트북을 열고 노트북의 첫 번째 셀로 다음 코드를 실행하여 Iceberg를 사용하도록 Spark 세션을 구성합니다.
%%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.type": "glue", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }
여기서 각 항목은 다음과 같습니다.
-
<catalog_name>
는 Iceberg Spark 세션 카탈로그 이름입니다. 선택한 이름으로 바꾸고이 카탈로그와 연결된 모든 구성에서 참조를 변경해야 합니다. 코드에서 다음과 같이 Spark 세션 카탈로그 이름을 포함하여 정규화된 테이블 이름을 사용하여 Iceberg 테이블을 참조할 수 있습니다.<catalog_name>.<database_name>.<table_name>
또는를 카탈로그 이름으로 설정하여 기본 카탈로그를 정의한 Iceberg 카탈로그
spark.sql.defaultCatalog
로 변경할 수 있습니다. 이 두 번째 접근 방식을 사용하면 카탈로그 접두사가 없는 테이블을 참조할 수 있으므로 쿼리를 간소화할 수 있습니다. -
<catalog_name>.warehouse
는 데이터와 메타데이터를 저장할 Amazon S3 경로를 가리킵니다. -
카탈로그를 로 만들려면를
spark.sql.catalog.<catalog_name>.type
로 AWS Glue Data Catalog설정합니다glue
. 이 키는 사용자 지정 카탈로그 구현을 위한 구현 클래스를 가리키는 데 필요합니다. 이 가이드의 뒷부분에 있는 일반 모범 사례 섹션에서는 다양한 Iceberg 지원 카탈로그에 대해 설명합니다.
-
-
이제 다른 Spark 애플리케이션과 마찬가지로 노트북에서 Iceberg용 Spark 애플리케이션을 대화형으로 개발할 수 있습니다.
Amazon EMR Studio를 사용하여 Apache Iceberg용 Spark를 구성하는 방법에 대한 자세한 내용은 블로그 게시물 Amazon EMR에서 Apache Iceberg를 사용하여 진화하는 고성능 ACID 호환 데이터 레이크 구축을
Amazon EMR에서 Iceberg 작업 실행
Iceberg 워크로드에 대한 Spark 애플리케이션 코드를 개발한 후 Iceberg를 지원하는 모든 Amazon EMR 배포 옵션에서 실행할 수 있습니다(Amazon EMR FAQ
다른 Spark 작업과 마찬가지로 단계를 추가하거나 Spark 작업을 마스터 노드에 대화형으로 제출하여 Amazon EC2 클러스터의 Amazon EMR에 작업을 제출할 수 있습니다. Spark 작업을 실행하려면 다음 Amazon EMR 설명서 페이지를 참조하세요.
-
Amazon EC2 클러스터의 Amazon EMR에 작업을 제출하는 다양한 옵션에 대한 개요와 각 옵션에 대한 자세한 지침은 클러스터에 작업 제출을 참조하세요.
-
Amazon EMR on Amazon EKS의 경우 StartJobRun을 사용하여 Spark 작업 실행을 참조하세요.
-
Amazon EMR Serverless의 경우 작업 실행을 참조하세요.
다음 섹션에서는 각 Amazon EMR 배포 옵션의 예를 제공합니다.
Amazon EMR on Amazon EC2
다음 단계를 사용하여 Iceberg Spark 작업을 제출할 수 있습니다.
-
워크스테이션에 다음 콘텐츠
emr_step_iceberg.json
가 포함된 파일을 생성합니다.[{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--conf", "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "--conf", "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog", "--conf", "spark.sql.catalog.<catalog_name>.type=glue", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
-
굵게 강조 표시된 Iceberg 구성 옵션을 사용자 지정하여 특정 Spark 작업의 구성 파일을 수정합니다.
-
AWS Command Line Interface ()를 사용하여 단계를 제출합니다AWS CLI.
emr_step_iceberg.json
파일이 있는 디렉터리에서 명령을 실행합니다.aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json
Amazon EMR Serverless
를 사용하여 Iceberg Spark 작업을 Amazon EMR Serverless에 제출하려면 AWS CLI:
-
워크스테이션에 다음 콘텐츠가
emr_serverless_iceberg.json
포함된 파일을 생성합니다.{ "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "name": "iceberg-test-job", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [] } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.type": "glue", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
-
굵게 강조 표시된 Iceberg 구성 옵션을 사용자 지정하여 특정 Spark 작업의 구성 파일을 수정합니다.
-
를 사용하여 작업을 제출합니다 AWS CLI.
emr_serverless_iceberg.json
파일이 있는 디렉터리에서 명령을 실행합니다.aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json
EMR Studio 콘솔을 사용하여 Iceberg Spark 작업을 Amazon EMR Serverless에 제출하려면
-
Amazon EMR Serverless 설명서의 지침을 따릅니다.
-
작업 구성의 경우에 제공된 Spark에 대한 Iceberg 구성을 사용하고 Iceberg에 대해 강조 표시된 필드를 AWS CLI 사용자 지정합니다. 자세한 지침은 Amazon EMR 설명서의 EMR Serverless에서 Apache Iceberg 사용을 참조하세요.
Amazon EMR on Amazon EKS
AWS CLI다음을 사용하여 Amazon EKS의 Amazon EMR에 Iceberg Spark 작업을 제출하려면
-
워크스테이션에 다음 콘텐츠
emr_eks_iceberg.json
가 포함된 파일을 생성합니다.{ "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.type": "glue", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
-
굵게 강조 표시된 Iceberg 구성 옵션을 사용자 지정하여 Spark 작업의 구성 파일을 수정합니다.
-
를 사용하여 작업을 제출합니다 AWS CLI.
emr_eks_iceberg.json
파일이 있는 디렉터리에서 다음 명령을 실행합니다.aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json
자세한 지침은 Amazon EMR on EKS 설명서의 Amazon EMR on EKS에서 Apache Iceberg 사용을 참조하세요.
Amazon EMR 모범 사례
이 섹션에서는 Iceberg 테이블에 대한 데이터 읽기 및 쓰기를 최적화하기 위해 Amazon EMR에서 Spark 작업을 튜닝하기 위한 일반 지침을 제공합니다. Iceberg 관련 모범 사례는이 가이드 뒷부분의 모범 사례 섹션을 참조하세요.
-
최신 버전의 Amazon EMR 사용 - Amazon EMR은 Amazon EMR Spark 런타임을 통해 즉시 Spark 최적화를 제공합니다. AWS 는 새 릴리스마다 Spark 런타임 엔진의 성능을 개선합니다.
-
Spark 워크로드에 대한 최적의 인프라 결정 - Spark 워크로드는 최적의 성능을 보장하기 위해 다양한 작업 특성에 대해 다양한 유형의 하드웨어가 필요할 수 있습니다. Amazon EMR은 여러 인스턴스 유형(예: 컴퓨팅 최적화, 메모리 최적화, 범용 및 스토리지 최적화)을 지원하여 모든 유형의 처리 요구 사항을 충족합니다. 새 워크로드를 온보딩할 때는 M5 또는 M6g와 같은 일반 인스턴스 유형으로 벤치마킹하는 것이 좋습니다. Ganglia 및 Amazon CloudWatch의 운영 체제(OS) 및 YARN 지표를 모니터링하여 최대 부하 시 시스템 병목 현상(CPU, 메모리, 스토리지 및 I/O)을 확인하고 적절한 하드웨어를 선택합니다.
-
튜닝
spark.sql.shuffle.partitions
-spark.sql.shuffle.partitions
속성을 클러스터의 총 가상 코어(vCores) 수 또는 해당 값의 배수(일반적으로 총 vCores 수의 1~2배)로 설정합니다. 이 설정은 해시 및 범위 파티셔닝을 쓰기 배포 모드로 사용할 때 Spark의 병렬 처리에 영향을 줍니다. 데이터를 구성하기 위해 쓰기 전에 셔플을 요청하므로 파티션 정렬이 보장됩니다. -
관리형 조정 활성화 - 거의 모든 사용 사례에서 관리형 조정 및 동적 할당을 활성화하는 것이 좋습니다. 그러나 예측 가능한 패턴이 있는 워크로드가 있는 경우 자동 조정 및 동적 할당을 비활성화하는 것이 좋습니다. 관리형 조정이 활성화된 경우 스팟 인스턴스를 사용하여 비용을 줄이는 것이 좋습니다. 코어 또는 마스터 노드 대신 태스크 노드에 스팟 인스턴스를 사용합니다. 스팟 인스턴스를 사용하는 경우 플릿당 여러 인스턴스 유형이 있는 인스턴스 플릿을 사용하여 스팟 가용성을 보장합니다.
-
가능한 경우 브로드캐스트 조인 사용 - 브로드캐스트(맵사이드) 조인이 가장 최적의 조인입니다. 단, 테이블 중 하나가 가장 작은 노드의 메모리(MBs)에 맞을 만큼 작고 등식(=) 조인을 수행하는 경우에 한합니다. 전체 외부 조인을 제외한 모든 조인 유형이 지원됩니다. 브로드캐스트 조인은 메모리의 모든 작업자 노드에서 더 작은 테이블을 해시 테이블로 브로드캐스트합니다. 작은 테이블이 브로드캐스트된 후에는 변경할 수 없습니다. 해시 테이블은 Java 가상 머신(JVM)에 로컬로 있으므로 해시 조인을 사용하여 조인 조건에 따라 큰 테이블과 쉽게 병합할 수 있습니다. 브로드캐스트 조인은 셔플 오버헤드를 최소화하므로 고성능을 제공합니다.
-
가비지 수집기 튜닝 - 가비지 수집(GC) 주기가 느린 경우 성능 향상을 위해 기본 병렬 가비지 수집기에서 G1GC로 전환하는 것이 좋습니다. GC 성능을 최적화하기 위해 GC 파라미터를 미세 조정할 수 있습니다. GC 성능을 추적하려면 Spark UI를 사용하여 모니터링할 수 있습니다. GC 시간은 총 작업 런타임의 1% 이하여야 합니다.