

# AWS Glue에서 작업 사용
<a name="author-glue-job"></a>

다음 섹션에서는 AWS Glue에서 ETL 및 Ray 작업에 대한 정보를 제공합니다.

**Topics**
+ [AWS Glue 버전](release-notes.md)
+ [AWS Glue에서 Spark 작업 사용](etl-jobs-section.md)
+ [AWS Glue에서 Ray 작업 사용](ray-jobs-section.md)
+ [AWS Glue에서 Python 쉘 작업에 대한 작업 속성 구성](add-job-python.md)
+ [AWS Glue 모니터링](monitor-glue.md)

# AWS Glue 버전
<a name="release-notes"></a>

작업을 추가하거나 업데이트할 때 AWS Glue 버전 파라미터를 구성할 수 있습니다. AWS Glue 버전은 AWS Glue가 지원하는 Apache Spark 및 Python 버전을 결정합니다. Python의 버전으로 Spark 유형의 작업에 대해 지원되는 버전을 확인할 수 있습니다. 다음 테이블에는 이용 가능한 AWS Glue 버전과 그에 상응하는 Spark 및 Python 버전, 그리고 다른 기능 변경 사항이 나열됩니다.

[Apache Spark용 생성형 AI 업그레이드](upgrade-analysis.md)를 사용하여 Glue ETL 작업을 이전 Glue 버전(≥ 2.0)에서 최신 Glue 버전으로 업그레이드할 수 있습니다.

## AWS Glue 버전
<a name="release-notes-versions"></a>

<a name="table-glue-versions"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/release-notes.html)

**참고**  
다음 Glue 버전은 다음 버전의 PythonShell을 지원합니다.  
PythonShell v3.6은 Glue 버전 1.0에서 지원됩니다.
PythonShell v3.9는 Glue 버전 3.0에서 지원됩니다.
추가로 개발 엔드포인트는 Glue 버전 1.0 및 0.9에서만 지원됩니다.

# AWS Glue 버전 지원 정책
<a name="glue-version-support-policy"></a>

AWS Glue는 분석, 기계 학습, 애플리케이션 개발을 위해 데이터를 쉽게 검색, 준비, 결합할 수 있게 해주는 서버리스 데이터 통합 서비스입니다. *AWS Glue 작업*에는 AWS Glue에서 데이터 통합 작업을 수행하는 비즈니스 로직이 포함되어 있습니다. AWS Glue에는 *Spark(배치 및 스트리밍)*, *Ray* 및 *Python 쉘*이라는 세 가지 작업 유형이 있습니다. 작업을 정의할 때 기본 Spark, Ray 또는 Python 런타임 환경에서 버전을 구성하는 AWS Glue 버전을 지정합니다. 예: AWS Glue 버전 5.0 Spark 작업은 Spark 3.5.4 및 Python 3.11을 지원합니다.

## 지원 정책
<a name="glue-version-support-policy-milestones"></a>

AWS Glue 버전은 유지 관리 및 보안 업데이트가 적용되는 운영 체제, 프로그래밍 언어 및 소프트웨어 라이브러리의 조합을 기반으로 합니다. AWS Glue의 버전 지원 정책은 버전의 주요 구성 요소가 커뮤니티 장기 지원(LTS) 종료에 도달하여 보안 업데이트를 더 이상 사용할 수 없는 경우 버전 지원을 중단하는 것입니다. AWS Glue의 버전 지원 정책에는 다음 상태가 포함됩니다.

**EOS(지원 종료) -** AWS Glue 버전이 EOS에 도달하는 경우:
+ AWS Glue는 더 이상 EOS 버전에 보안 패치 또는 기타 업데이트를 적용하지 않습니다.
+ EOS 버전의 AWS Glue 작업은 기술 지원을 받을 수 없습니다.
+ AWS Glue는 EOS 버전에서 작업이 실행될 때 SLA를 준수하지 않을 수 있습니다.

**수명 종료(EOL) -** AWS Glue 버전이 EOL에 도달하는 경우:
+ EOL 버전에서는 더 이상 새로운 AWS Glue 작업 또는 대화형 세션을 생성할 수 없습니다.
+ AWS Glue 버전에서는 더 이상 작업 실행을 시작할 수 없습니다.
+ AWS Glue는 EOL 버전에서 기존 작업 실행 및 대화형 세션을 중지합니다.
+ EOL 버전은 AWS Glue SDK 및 API에서 제거됩니다.

다음 AWS Glue 버전은 지원 종료에 도달했으며 수명 종료 날짜 이후에는 더 이상 사용할 수 없습니다. 버전의 지원 상태에 대한 변경 사항은 지정된 날짜의 자정(태평양 시간대 기준)에 시작됩니다.


| **유형** | **Glue 버전** | **지원 종료** | **수명 종료** | 
| --- | --- | --- | --- | 
| **유형** | **Python 버전** | **지원 종료** | **수명 종료** | 
| --- | --- | --- | --- | 
| **유형** | **노트북 버전** | **지원 종료** | **수명 종료** | 
| --- | --- | --- | --- | 
| Spark | Glue 버전 0.9(Spark 2.2, Scala 2, Python 2) | 6/1/2022 | 4/1/2026 | 
| Spark | Glue 버전 1.0(Spark 2.4, Python 2) | 6/1/2022 | 4/1/2026 | 
| Spark | Glue 버전 1.0(Spark 2.4, Scala 2, Python 3) | 9/30/2022 | 4/1/2026 | 
| Spark | Glue 버전 2.0(Spark 2.4, Python 3) | 1/31/2024 | 4/1/2026 | 
| Python 셸 | Python 2(AWS Glue 버전 1.0) | 6/1/2022 | 4/1/2026 | 
| Python 셸 | PythonShell 3.6(Glue 버전 1.0) | 3/31/2026 | NA | 
| 개발 엔드포인트 | Zeppelin 노트북 | 9/30/2022 | NA | 

**참고**  
 2026년 3월 31일에 지원이 종료되면 새 AWS Glue Python Shell 3.6 작업을 생성할 수 없지만 기존 작업을 계속 업데이트하고 실행할 수는 있습니다. 하지만 사용 중단된 버전에서 실행되는 작업은 더 이상 기술 지원을 받을 수 없습니다. AWS Glue는 사용 중단된 버전에 보안 패치 또는 기타 업데이트를 더 이상 적용하지 않습니다. AWS Glue 역시 사용 중단된 버전에서 작업이 실행될 때 SLA를 준수하지 않습니다.

AWS는 해당 작업을 지원되는 버전으로 마이그레이션할 것을 적극 권장합니다.

Spark 작업을 최신 AWS Glue 버전으로 마이그레이션하는 방법에 대한 자세한 내용은 [AWS Glue 작업을 AWS Glue 버전 5.1으로 마이그레이션](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-51.html)을 참조하세요.

Python 셸 작업을 최신 AWS Glue 버전으로 마이그레이션하는 경우:
+ 콘솔에서 `Python 3 (Glue Version 4.0)`을 선택합니다.
+ [CreateJob](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateJob.html)/[UpdateJob](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateJob.html) API에서 `GlueVersion` 파라미터를 `2.0`으로 설정하고 `Command` 파라미터에서 `PythonVersion`을 `3`으로 설정합니다. `GlueVersion` 구성은 Python 쉘 작업의 동작에 영향을 미치지 않으므로 `GlueVersion`을 늘려도 이점이 없습니다.
+ 작업 스크립트가 Python 3과 호환되도록 해야 합니다.

# AWS Glue 버전 5.1으로 AWS Glue for Spark 작업 마이그레이션
<a name="migrating-version-51"></a>

이 주제에서는 Spark 애플리케이션 및 ETL 작업을 AWS Glue 5.1로 마이그레이션할 수 있도록 하는 AWS Glue 버전 0.9, 1.0, 2.0, 3.0, 4.0 및 5.0 간의 변경 사항에 대해 설명합니다. 또한 AWS Glue 5.1의 기능과 이를 사용할 때의 이점에 대해 설명합니다.

AWS Glue ETL 작업에 이 기능을 사용하려면 작업 생성 시 `Glue version`으로 **5.1**을 선택합니다.

**Topics**
+ [새로운 기능](#migrating-version-51-features)
+ [AWS Glue 5.1으로 마이그레이션할 작업](#migrating-version-51-actions)
+ [마이그레이션 체크리스트](#migrating-version-51-checklist)
+ [AWS Glue 5.0에서 AWS Glue 5.1으로 마이그레이션](#migrating-version-51-from-50)
+ [이전 AWS Glue 버전에서 AWS Glue 5.1로 마이그레이션](#migrating-older-versions-to-51)
+ [AWS Glue 5.1용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-51-connector-driver-migration)

## 새로운 기능
<a name="migrating-version-51-features"></a>

이 섹션에서는 AWS Glue 버전 5.1의 새로운 기능과 장점에 대해 설명합니다.
+ AWS Glue 5.0의 3.5.4에서 AWS Glue 5.1의 3.5.6으로의 Apache Spark 업데이트.
+ 오픈 테이블 형식(OTF)이 Hudi 1.0.2, Iceberg 1.10.0 및 Delta Lake 3.3.2로 업데이트됨
+ **Iceberg 구체화된 뷰** - Iceberg 구체화된 뷰(MV)를 생성하고 관리합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/introducing-apache-iceberg-materialized-views-in-aws-glue-data-catalog/)을 참조하세요.
+ **Iceberg 형식 버전 3.0** - 데이터 유형 및 기존 메타데이터 구조를 확장하여 새 기능을 추가합니다. 자세한 내용은 [Iceberg 테이블 사양](https://iceberg.apache.org/spec/)을 참조하세요.
+ **Hudi 전체 테이블 액세스** - AWS Lake Formation에 정의된 정책을 기반으로 Apache Spark의 Apache Hudi에 대한 전체 테이블 액세스(FTA)를 제어합니다. 이 기능을 사용하면 작업 역할에 전체 테이블 액세스 권한이 있을 때 AWS Lake Formation 등록 테이블의 AWS Glue ETL 작업에서 읽기 및 쓰기 작업을 수행할 수 있습니다.
+ **AWS Lake Formation을 사용하여 Spark 네이티브 세분화된 액세스(FGAC) 제어** - AWS Lake Formation에 등록된 Apache Hive, Apache Iceberg 및 Delta Lake 테이블에 대한 세분화된 액세스 제어와 함께 DDL/DML 작업(예: CREATE, ALTER, DELETE, DROP)을 지원합니다.
+ **Spark 작업에 대한 감사 컨텍스트** - AWS Glue ETL 작업에 대한 감사 컨텍스트가 AWS CloudTrail 로그에서 AWS Glue 및 AWS Lake Formation API 직접 호출에 대해 제공됩니다.

**알려진 문제 및 제한**  
다음과 같은 알려진 문제 및 제한 사항에 유의하세요.
+ 구체화된 뷰 생성, 쿼리 재작성 및 증분 새로 고침을 위한 뷰 SQL 절이 제한적으로 지원됩니다. 자세한 내용은 [Iceberg 구체화된 뷰 기능 설명서 페이지](https://docs.aws.amazon.com/lake-formation/latest/dg/materialized-views.html#materialized-views-considerations-limitations)에서 확인할 수 있습니다.
+ **Hudi FTA 쓰기**는 작업 실행 중에 자격 증명 벤딩에 HoodieCredentialedHadoopStorage를 사용해야 합니다. Hudi 작업을 실행할 때는 다음 구성을 설정합니다.

  `hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage` 
+ Hudi FTA 쓰기 지원은 기본 Hudi 구성에서만 작동합니다. 사용자 지정이거나 기본값이 아닌 Hudi 설정은 완전히 지원되지 않을 수 있으며 예기치 않은 동작이 발생할 수 있습니다. FTA 쓰기 모드에서는 Hudi Merge-On-Read(MOR) 테이블에 대한 클러스터링도 지원되지 않습니다.

**호환성에 영향을 미치는 변경 사항**  
호환성에 영향을 미치는 다음과 같은 변경 사항에 유의하세요.
+  기본 S3 커넥터로 S3A 파일 시스템이 EMRFS를 대체했습니다. 마이그레이션 방법에 대한 자세한 내용은 [AWS Glue 5.0에서 AWS Glue 5.1으로 마이그레이션](#migrating-version-51-from-50) 섹션을 참조하세요.

## AWS Glue 5.1으로 마이그레이션할 작업
<a name="migrating-version-51-actions"></a>

기존 작업의 경우 작업 구성에서 `Glue version`을 이전 버전에서 `Glue 5.1`으로 변경합니다.
+ AWS Glue Studio의 `Glue version`에서 `Glue 5.1 - Supports Spark 3.5.6, Scala 2, Python 3`을 선택합니다.
+ API에서 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 작업의 `GlueVersion` 파라미터에서 **5.1**을 선택합니다.

새 작업의 경우 작업을 생성할 때 `Glue 5.1`을 선택합니다.
+ 콘솔의 `Glue version`에서 `Spark 3.5.6, Python 3 (Glue Version 5.1) or Spark 3.5.6, Scala 2 (Glue Version 5.1)`를 선택합니다.
+ AWS Glue Studio의 `Glue version`에서 `Glue 5.1 - Supports Spark 3.5.6, Scala 2, Python 3`을 선택합니다.
+ API에서 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 작업의 `GlueVersion` 파라미터에서 **5.1**을 선택합니다.

AWS Glue 2.0 또는 이전 버전에서 가져온 AWS Glue 5.1의 Spark 이벤트 로그를 보려면 [CloudFormation 또는 Docker를 사용하여 업그레이드된 AWS Glue 5.1용 Spark 기록 서버를 시작합니다](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html).

## 마이그레이션 체크리스트
<a name="migrating-version-51-checklist"></a>

마이그레이션을 위해 이 체크리스트를 검토합니다.
+ [Python] boto 참조를 1.34에서 1.40로 업데이트합니다.

## AWS Glue 5.0에서 AWS Glue 5.1으로 마이그레이션
<a name="migrating-version-51-from-50"></a>

AWS Glue 5.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 5.1에 존재합니다. 마이그레이션할 때 다음 변경 사항에 유의합니다.
+ AWS Glue 5.1에서는 S3A 파일 시스템이 기본 S3 커넥터로 EMRFS를 대체했습니다. `spark.hadoop.fs.s3a.endpoint` 및 `spark.hadoop.fs.s3a.endpoint.region`이 모두 설정되지 않은 경우, S3A에서 사용하는 기본 리전은 `us-east-2`입니다. 이로 인해 특히 VPC 작업의 경우 S3 업로드 제한 시간 오류와 같은 문제가 발생할 수 있습니다. 이 변경으로 인한 문제를 완화하려면 AWS Glue 5.1에서 S3A 파일 시스템을 사용할 때 `spark.hadoop.fs.s3a.endpoint.region` Spark 구성을 설정합니다.
+ S3A 대신 EMRFS를 계속 사용하려면 다음 스파크 구성을 설정합니다.

  ```
      --conf spark.hadoop.fs.s3.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem
      --conf spark.hadoop.fs.s3n.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem
      --conf spark.hadoop.fs.AbstractFileSystem.s3.impl=org.apache.hadoop.fs.s3.EMRFSDelegate
  ```

Spark 마이그레이션 설명서를 참조하세요.
+ [Migration Guide: Spark Core](https://spark.apache.org/docs/3.5.6/core-migration-guide.html)
+ [Migration Guide: SQL, Datasets and DataFrame](https://spark.apache.org/docs/3.5.6/sql-migration-guide.html)
+ [Migration Guide: Structured Streaming](https://spark.apache.org/docs/3.5.6/ss-migration-guide.html)
+ [Upgrading PySpark](https://spark.apache.org/docs/3.5.6/api/python/migration_guide/pyspark_upgrade.html)

## 이전 AWS Glue 버전에서 AWS Glue 5.1로 마이그레이션
<a name="migrating-older-versions-to-51"></a>
+ AWS Glue 4.0에서 AWS Glue 5.0으로의 마이그레이션 단계는 [AWS Glue 4.0에서 AWS Glue 5.0으로 마이그레이션](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html#migrating-version-50-from-40)을 참조하세요.
+ AWS Glue 3.0에서 AWS Glue 5.0으로의 마이그레이션 단계는 [AWS Glue 3.0에서 AWS Glue 5.0으로 마이그레이션](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html#migrating-version-50-from-30)을 참조하세요.
+ AWS Glue 2.0에서 AWS Glue 5.0으로의 마이그레이션 단계와 AWS Glue 버전 2.0과 4.0 간의 마이그레이션 차이점 목록은 [AWS Glue 2.0에서 AWS Glue 5.0으로의 마이그레이션](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html#migrating-version-50-from-20)을 참조하세요.

## AWS Glue 5.1용 커넥터 및 JDBC 드라이버 마이그레이션
<a name="migrating-version-51-connector-driver-migration"></a>

업그레이드된 JDBC 및 데이터 레이크 커넥터 버전은 다음을 참조하세요.
+ [부록 B: JDBC 드라이버 업그레이드](#migrating-version-51-appendix-jdbc-driver)
+ [부록 C: 커넥터 업그레이드](#migrating-version-51-appendix-connector)
+ [부록 D: 오픈 테이블 형식 업그레이드](#migrating-version-51-appendix-open-table-formats)

다음 변경 사항은 AWS Glue 5.1에 대한 [부록 D: 오픈 테이블 형식 업그레이드](#migrating-version-51-appendix-open-table-formats)에서 식별된 OTF 버전 업그레이드에 적용됩니다.

**Apache Hudi**  
다음과 같은 변경 사항에 유의하세요.
+ Lake Formation 등록 테이블에서 FTA 읽기 및 쓰기 액세스 지원.

**Apache Iceberg**  
다음과 같은 변경 사항에 유의하세요.
+ Iceberg 형식 버전 3 지원. 다음 기능이 지원됩니다.
  + 파티셔닝 및 정렬을 위한 다중 인수 변환.
  + 행 계보 추적.
  + 삭제 벡터. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/unlock-the-power-of-apache-iceberg-v3-deletion-vectors-on-amazon-emr/)을 참조하세요.
  + 테이블 암호화 키.
  + 열에 대해 기본값이 지원됩니다.
+ AWS Lake Formation 등록 테이블에서 Spark 네이티브 FGAC 쓰기를 지원합니다.
+ Athena SQL 호환성 - 오류로 인해 EMR Spark에서 생성한 Iceberg V3 테이블을 읽을 수 없음: `GENERIC_INTERNAL_ERROR: Cannot read unsupported version 3`

**Delta Lake**  
다음과 같은 변경 사항에 유의하세요.
+ Lake Formation 등록 테이블에서 FTA 읽기 및 쓰기 액세스 지원.

### 부록 A: 중요한 종속성 업그레이드
<a name="migrating-version-51-appendix-dependencies"></a>

다음은 종속성 업그레이드입니다.


| 종속성 | AWS Glue 5.1 버전 | AWS Glue 5.0 버전 | AWS Glue 4.0 버전 | AWS Glue 3.0 버전 | AWS Glue 2.0 버전 | AWS Glue 1.0 버전 | 
| --- | --- | --- | --- | --- | --- | --- | 
| Java | 17 | 17 | 8 | 8 | 8 | 8 | 
| Spark | 3.5.6 | 3.5.4 | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.4.1 | 3.4.1 | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12.18 | 2.12.18 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Jackson | 2.15.2 | 2.15.2 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Hive | 2.3.9-amzn-4 | 2.3.9-amzn-4 | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.73.0 | 2.69.0 | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.7.0-M11 | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| 화살표 | 12.0.1 | 12.0.1 | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue 데이터 카탈로그 클라이언트 | 4.9.0 | 4.5.0 | 3.7.0 | 3.0.0 | 1.10.0 | 해당 사항 없음 | 
| Java용 AWS SDK | 2.35.5 | 2.29.52 | 1.12 | 1.12 |  |  | 
| Python | 3.11 | 3.11 | 3.10 | 3.7 | 2.7 및 3.6 | 2.7 및 3.6 | 
| Boto | 1.40.61 | 1.34.131 | 1.26 | 1.18 | 1.12 | 해당 사항 없음 | 
| EMR DynamoDB 커넥터 | 5.7.0 | 5.6.0 | 4.16.0 |  |  |  | 

### 부록 B: JDBC 드라이버 업그레이드
<a name="migrating-version-51-appendix-jdbc-driver"></a>

다음은 JDBC 드라이버 업그레이드입니다.


| 드라이버 | AWS Glue 5.1의 JDBC 드라이버 버전 | AWS Glue 5.0의 JDBC 드라이버 버전 | AWS Glue 4.0의 JDBC 드라이버 버전 | AWS Glue 3.0의 JDBC 드라이버 버전 | 과거 AWS Glue 버전의 JDBC 드라이버 버전 | 
| --- | --- | --- | --- | --- | --- | 
| MySQL | 8.0.33 | 8.0.33 | 8.0.23 | 8.0.23 | 5.1 | 
| Microsoft SQL Server | 10.2.0 | 10.2.0 | 9.4.0 | 7.0.0 | 6.1.0 | 
| Oracle Database | 23.3.0.23.09 | 23.3.0.23.09 | 21.7 | 21.1 | 11.2 | 
| PostgreSQL | 42.7.3 | 42.7.3 | 42.3.6 | 42.2.18 | 42.1.0 | 
| Amazon Redshift |  redshift-jdbc42-2.1.0.29  |  redshift-jdbc42-2.1.0.29  |  redshift-jdbc42-2.1.0.16  |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   | 
| SAP Hana | 2.20.17 | 2.20.17 | 2.17.12 |  |  | 
| Teradata | 20.00.00.33 | 20.00.00.33 | 20.00.00.06 |  |  | 

### 부록 C: 커넥터 업그레이드
<a name="migrating-version-51-appendix-connector"></a>

다음은 커넥터 업그레이드입니다.


| 드라이버 | AWS Glue 5.1의 커넥터 버전 | AWS Glue 5.0의 커넥터 버전 | AWS Glue 4.0의 커넥터 버전 | AWS Glue 3.0의 커넥터 버전 | 
| --- | --- | --- | --- | --- | 
| EMR DynamoDB 커넥터 | 5.7.0 | 5.6.0 | 4.16.0 |  | 
| Amazon Redshift | 6.4.2 | 6.4.0 | 6.1.3 |  | 
| OpenSearch | 1.2.0 | 1.2.0 | 1.0.1 |  | 
| MongoDB | 10.3.0 | 10.3.0 | 10.0.4 | 3.0.0 | 
| Snowflake | 3.1.1 | 3.0.0 | 2.12.0 |  | 
| Google BigQuery | 0.32.2 | 0.32.2 | 0.32.2 |  | 
| AzureCosmos | 4.33.0 | 4.33.0 | 4.22.0 |  | 
| AzureSQL | 1.3.0 | 1.3.0 | 1.3.0 |  | 
| Vertica | 3.3.5 | 3.3.5 | 3.3.5 |  | 

### 부록 D: 오픈 테이블 형식 업그레이드
<a name="migrating-version-51-appendix-open-table-formats"></a>

다음은 오픈 테이블 형식 업그레이드입니다.


| OTF | AWS Glue 5.1의 커넥터 버전 | AWS Glue 5.0의 커넥터 버전 | AWS Glue 4.0의 커넥터 버전 | AWS Glue 3.0의 커넥터 버전 | 
| --- | --- | --- | --- | --- | 
| Hudi | 1.0.2 | 0.15.0 | 0.12.1 | 0.10.1 | 
| Delta Lake | 3.3.2 | 3.3.0 | 2.1.0 | 1.0.0 | 
| Iceberg | 1.10.0 | 1.7.1 | 1.0.0 | 0.13.1 | 

# AWS Glue 버전 5.0으로 AWS Glue for Spark 작업 마이그레이션
<a name="migrating-version-50"></a>

이 주제에서는 Spark 애플리케이션 및 ETL 작업을 AWS Glue 5.0으로 마이그레이션할 수 있도록 하는 AWS Glue 버전 0.9, 1.0, 2.0, 3.0 및 4.0 간의 변경 사항에 대해 설명합니다. 또한 AWS Glue 5.0의 기능과 이를 사용할 때의 이점에 대해 설명합니다.

AWS Glue ETL 작업에 이 기능을 사용하려면 작업 생성 시 `Glue version`으로 **5.0**을 선택합니다.

**Topics**
+ [새로운 기능](#migrating-version-50-features)
+ [AWS Glue 5.0으로 마이그레이션할 작업](#migrating-version-50-actions)
+ [마이그레이션 체크리스트](#migrating-version-50-checklist)
+ [AWS Glue 5.0 기능](#migrating-version-50-features)
+ [AWS Glue 4.0에서 AWS Glue 5.0으로 마이그레이션](#migrating-version-50-from-40)
+ [AWS Glue 3.0에서 AWS Glue 5.0으로 마이그레이션](#migrating-version-50-from-30)
+ [AWS Glue 2.0에서 AWS Glue 5.0으로 마이그레이션](#migrating-version-50-from-20)
+ [AWS Glue 5.0에서의 로깅 동작 변경 사항](#enable-continous-logging-changes-glue-50)
+ [AWS Glue 5.0용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-50-connector-driver-migration)

## 새로운 기능
<a name="migrating-version-50-features"></a>

이 섹션에서는 AWS Glue 버전 5.0의 새로운 기능과 장점에 대해 설명합니다.
+ Apache Spark는 AWS Glue 4.0의 3.3.0에서 AWS Glue 5.0의 3.5.4로 업데이트됩니다. [Spark 3.3.0에서 Spark 3.5.4로의 주요 개선 사항](#migrating-version-50-features-spark)을(를) 참조하세요.
+ Lake Formation을 사용한 Spark 네이티브 세분화된 액세스 제어(FGAC). 여기에는 Iceberg, Delta 및 Hudi 테이블에 대한 FGAC가 포함됩니다. 자세한 내용은 [세분화된 액세스 제어를 위해 AWS Lake Formation과 함께 AWS Glue 사용](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable.html)을 참조하세요.

  Spark 네이티브 FGAC에 대한 다음 고려 사항 또는 제한 사항에 유의하세요.
  + 현재 데이터 쓰기는 지원되지 않습니다.
  + Lake Formation으로 `GlueContext`를 통해 Iceberg에 쓰려면 대신 IAM 액세스 제어의 사용이 필요합니다.

  Spark 네이티브 FGAC 사용 시 제한 사항 및 고려 사항에 대한 전체 목록은 [고려 사항 및 제한 사항](security-lf-enable-considerations.md) 섹션을 참조하세요.
+ AWS Glue의 Amazon S3 데이터에 대한 확장 가능한 액세스 제어 솔루션으로 Amazon S3 Access Grants를 지원합니다. 자세한 내용은 [AWS Glue를 통해 Amazon S3 Access Grants 사용](security-s3-access-grants.md) 섹션을 참조하세요.
+ 오픈 테이블 형식(OTF)이 Hudi 0.15.0, Iceberg 1.7.1 및 Delta Lake 3.3.0으로 업데이트됨
+ Amazon SageMaker Unified Studio 지원.
+ Amazon SageMaker Lakehouse 및 데이터 추상화 통합. 자세한 내용은 [AWS Glue ETL에서 메타스토어 Data Catalog 쿼리](#migrating-version-50-features-metastore) 섹션을 참조하세요.
+ `requirements.txt`를 사용하여 추가 Python 라이브러리 설치를 지원합니다. 자세한 내용은 [requirements.txt를 사용하여 AWS Glue 5.0 이상에 추가 Python 라이브러리 설치](aws-glue-programming-python-libraries.md#addl-python-modules-requirements-txt) 섹션을 참조하세요.
+ AWS Glue 5.0은 Amazon DataZone에서 데이터 계보를 지원합니다. Spark 작업 실행 중에 계보 정보를 자동으로 수집하고 Amazon DataZone에서 시각화할 계보 이벤트를 보내도록 AWS Glue를 구성할 수 있습니다. 자세한 내용은 [Amazon DataZone의 데이터 계보](https://docs.aws.amazon.com/datazone/latest/userguide/datazone-data-lineage.html)를 참조하세요.

  AWS Glue 콘솔에서 이를 구성하려면 **작업 세부 정보** 탭에서 **계보 이벤트 생성**을 켜고 Amazon DataZone 도메인 ID를 입력합니다.  
![\[스크린샷은 AWS Glue에 대한 Amazon DataZone 데이터 계보를 켜는 것을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/glue-50-data-lineage.png)

  또는 다음 작업 파라미터를 제공할 수 있습니다(DataZone 도메인 ID 제공).
  + 키: `--conf`
  + 값:

    ```
    extraListeners=io.openlineage.spark.agent.OpenLineageSparkListener
    —conf spark.openlineage.transport.type=amazon_datazone_api
    -conf spark.openlineage.transport.domainId=<your-domain-ID>
    ```
+ 커넥터 및 JDBC 드라이버 업데이트. 자세한 내용은 [부록 B: JDBC 드라이버 업그레이드](#migrating-version-50-appendix-jdbc-driver) 및 [부록 C: 커넥터 업그레이드](#migrating-version-50-appendix-connector)(을)를 참조하세요.
+ Java를 8에서 17로 업데이트.
+ AWS Glue `G.1X` 및 `G.2X` 작업자에 대한 디스크 공간이 각각 94GB 및 138GB로 증가하여 스토리지 증가. 추가로 새로운 작업자 유형 `G.12X`, `G.16X`와 메모리 최적화 `R.1X`, `R.2X`, `R.4X`, `R.8X`가 AWS Glue 4.0 이상 버전에서 제공됩니다. 자세한 내용은 [작업](aws-glue-api-jobs-job.md) 섹션을 참조하세요.
+ **AWS SDK for Java, 버전 2 지원** - AWS Glue 5.0 작업은 작업이 v2를 지원하는 경우 Java 버전 [1.12.569](https://github.com/aws/aws-sdk-java/tree/1.12.569) 또는 [2.28.8](https://github.com/aws/aws-sdk-java-v2/tree/2.28.8)을 사용할 수 있습니다. Java 2.x용 AWS SDK는 버전 1.x 코드 베이스를 크게 재작성한 것입니다. Java 8\$1에 토대를 두고 있으며, 요청이 많았던 기능들을 몇 가지 추가했습니다. 여기에는 비차단 I/O에 대한 지원과 런타임에 다른 HTTP 구현을 연결하는 기능이 포함됩니다. SDK for Java v1에서 v2로의 마이그레이션 가이드를 포함한 자세한 내용을 확인하려면 [AWS SDK for Java, 버전 2](https://docs.aws.amazon.com/sdk-for-java) 가이드를 참조하세요.

**호환성에 영향을 미치는 변경 사항**  
호환성에 영향을 미치는 다음과 같은 변경 사항에 유의하세요.
+  AWS Glue 5.0에서는 S3A 파일 시스템을 사용할 때 `fs.s3a.endpoint`와 `fs.s3a.endpoint.region`이 모두 설정되지 않은 경우 S3A에서 사용하는 기본 리전은 `us-east-2`입니다. 이로 인해 특히 VPC 작업의 경우 S3 업로드 제한 시간 오류와 같은 문제가 발생할 수 있습니다. 이 변경으로 인한 문제를 완화하려면 AWS Glue 5.0에서 S3A 파일 시스템을 사용할 때 `fs.s3a.endpoint.region` Spark 구성을 설정합니다.
+ Lake Formation 세분화된 액세스 제어(FGAC)
  + AWS Glue 5.0은 Spark DataFrames를 사용하는 새로운 Spark 네이티브 FGAC만 지원합니다. AWS Glue DynamicFrames를 사용하는 FGAC는 지원하지 않습니다.
    + 5.0에서 FGAC를 사용하려면 AWS Glue DynamicFrames에서 Spark DataFrames로 마이그레이션 필요
    + FGAC가 필요하지 않은 경우 Spark DataFrame으로의 마이그레이션이 필요하지 않고, 작업 북마크 및 푸시다운 조건자와 같은 GlueContext 기능은 계속 작동합니다.
  + Spark 네이티브 FGAC를 사용하는 작업에는 사용자 드라이버, 시스템 드라이버, 시스템 실행기, 대기 사용자 실행기 등 최소 4개의 작업자가 필요합니다.
  + 자세한 내용은 [세분화된 액세스 제어를 위해 AWS Lake Formation과 함께 AWS Glue 사용](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable.html)을 참조하세요.
+ Lake Formation 전체 테이블 액세스(FTA)
  + AWS Glue 5.0은 Spark 네이티브 DataFrames(신규) 및 GlueContext DynamicFrames(레거시, 제한 사항 있음)에서 FTA를 지원합니다.
  + Spark 네이티브 FTA
    + 4.0 스크립트가 GlueContext를 사용하는 경우 네이티브 Spark를 사용하여 마이그레이션합니다.
    + 이 기능은 Hive 및 Iceberg 테이블로 제한됩니다.
    + Spark 네이티브 FTA를 사용하도록 5.0 작업을 구성하는 방법에 대한 자세한 내용은 다음 섹션을 참조하세요.
  + GlueContext DynamicFrame FTA
    + 코드 변경 필요 없음
    + 이 기능은 OTF가 아닌 테이블로 제한되며, Iceberg, Delta Lake 및 Hudi에서는 작동하지 않습니다.
+ [벡터화된 SIMD CSV 리더](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-csv-home.html#aws-glue-programming-etl-format-simd-csv-reader)는 지원되지 않습니다.
+ 출력 로그 그룹에 대한 [지속적 로깅](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging-enable.html)은 지원되지 않습니다. 대신 `error` 로그 그룹을 사용합니다.
+ AWS Glue 작업 실행 인사이트 `job-insights-rule-driver`가 더 이상 사용되지 않습니다. 이제 `job-insights-rca-driver` 로그 스트림이 오류 로그 그룹에 위치합니다.
+ Athena 기반 사용자 지정/마켓플레이스 커넥터는 지원되지 않습니다.
+ Adobe Marketo Engage, Facebook Ads, Google Ads, Google Analytics 4, Google Sheets, Hubspot, Instagram Ads, Intercom, Jira Cloud, Oracle NetSuite, Salesforce, Salesforce Marketing Cloud, Salesforce Marketing Cloud Account Engagement, SAP OData, ServiceNow, Slack, Snapchat Ads, Stripe, Zendesk 및 Zoho CRM 커넥터는 지원되지 않습니다.
+ AWS Glue 5.0에서는 사용자 지정 log4j 속성이 지원되지 않습니다.

### Spark 3.3.0에서 Spark 3.5.4로의 주요 개선 사항
<a name="migrating-version-50-features-spark"></a>

다음과 같은 개선 사항에 유의합니다.
+ Spark Connect용 Python 클라이언트([SPARK-39375](https://issues.apache.org/jira/browse/SPARK-39375)).
+ 테이블의 열에 대한 DEFAULT 값 지원 구현([SPARK-38334](https://issues.apache.org/jira/browse/SPARK-38334)).
+ '측면 열 별칭 참조' 지원([SPARK-27561](https://issues.apache.org/jira/browse/SPARK-27561)).
+ 오류 클래스에 대한 SQLSTATE 용법 강화([SPARK-41994](https://issues.apache.org/jira/browse/SPARK-41994)).
+ 기본적으로 블룸 필터 조인 활성화([SPARK-38841](https://issues.apache.org/jira/browse/SPARK-38841)).
+ 대규모 애플리케이션을 위한 Spark UI 확장성 및 드라이버 안정성 향상([SPARK-41053](https://issues.apache.org/jira/browse/SPARK-41053)).
+ 구조화된 스트리밍의 비동기 진행 상황 추적([SPARK-39591](https://issues.apache.org/jira/browse/SPARK-39591)).
+ 구조화된 스트리밍의 Python 임의 상태 저장 처리([SPARK-40434](https://issues.apache.org/jira/browse/SPARK-40434)).
+ Pandas API 적용 범위 개선([SPARK-42882](https://issues.apache.org/jira/browse/SPARK-42882)) 및 PySpark의 NumPy 입력 지원([SPARK-39405](https://issues.apache.org/jira/browse/SPARK-39405)).
+ PySpark 사용자 정의 함수용 메모리 프로파일러 제공([SPARK-40281](https://issues.apache.org/jira/browse/SPARK-40281)).
+ PyTorch 배포자 구현([SPARK-41589](https://issues.apache.org/jira/browse/SPARK-41589)).
+ SBOM 아티팩트 게시([SPARK-41893](https://issues.apache.org/jira/browse/SPARK-41893)).
+ IPv6 전용 환경 지원([SPARK-39457](https://issues.apache.org/jira/browse/SPARK-39457)).
+ 사용자 지정 K8s 스케줄러(Apache YuniKorn 및 Volcano) GA([SPARK-42802](https://issues.apache.org/jira/browse/SPARK-42802)).
+ Spark Connect의 Scala 및 Go 클라이언트 지원([SPARK-42554](https://issues.apache.org/jira/browse/SPARK-42554)) 및 ([SPARK-43351](https://issues.apache.org/jira/browse/SPARK-43351)).
+ Spark Connect에 대한 PyTorch 기반 분산 ML 지원([SPARK-42471](https://issues.apache.org/jira/browse/SPARK-42471)).
+ Python 및 Scala에서 Spark Connect에 대한 구조화된 스트리밍 지원([SPARK-42938](https://issues.apache.org/jira/browse/SPARK-42938)).
+ Python Spark Connect 클라이언트에 대한 Pandas API 지원([SPARK-42497](https://issues.apache.org/jira/browse/SPARK-42497)).
+ Arrow Python UDF 도입([SPARK-40307](https://issues.apache.org/jira/browse/SPARK-40307)).
+ Python 사용자 정의 테이블 함수 지원([SPARK-43798](https://issues.apache.org/jira/browse/SPARK-43798)).
+ PySpark 오류를 오류 클래스로 마이그레이션([SPARK-42986](https://issues.apache.org/jira/browse/SPARK-42986)).
+ PySpark 테스트 프레임워크([SPARK-44042](https://issues.apache.org/jira/browse/SPARK-44042)).
+ Datasketches HllSketch에 대한 지원 추가([SPARK-16484](https://issues.apache.org/jira/browse/SPARK-16484)).
+ 내장 SQL 함수 개선([SPARK-41231](https://issues.apache.org/jira/browse/SPARK-41231)).
+ IDENTIFIER 절([SPARK-43205](https://issues.apache.org/jira/browse/SPARK-43205)).
+ Scala, Python 및 R API에 SQL 함수 추가([SPARK-43907](https://issues.apache.org/jira/browse/SPARK-43907)).
+ SQL 함수에 대한 명명된 인수 지원 추가([SPARK-43922](https://issues.apache.org/jira/browse/SPARK-43922)).
+ 셔플 데이터가 마이그레이션된 경우 폐기된 실행기에서 불필요한 작업이 다시 실행되지 않도록 방지([SPARK-41469](https://issues.apache.org/jira/browse/SPARK-41469)).
+ 분산 ML <> Spark Connect([SPARK-42471](https://issues.apache.org/jira/browse/SPARK-42471)).
+ DeepSpeed 배포자([SPARK-44264](https://issues.apache.org/jira/browse/SPARK-44264)).
+ RocksDB 상태 저장소에 대한 변경 로그 체크포인트 구현([SPARK-43421](https://issues.apache.org/jira/browse/SPARK-43421)).
+ 연산자 간의 워터마크 전파 도입([SPARK-42376](https://issues.apache.org/jira/browse/SPARK-42376)).
+ dropDuplicatesWithinWatermark 도입([SPARK-42931](https://issues.apache.org/jira/browse/SPARK-42931)).
+ RocksDB 상태 저장소 공급자 메모리 관리 개선 사항([SPARK-43311](https://issues.apache.org/jira/browse/SPARK-43311)).

## AWS Glue 5.0으로 마이그레이션할 작업
<a name="migrating-version-50-actions"></a>

기존 작업의 경우 작업 구성에서 `Glue version`을 이전 버전에서 `Glue 5.0`으로 변경합니다.
+ AWS Glue Studio의 `Glue version`에서 `Glue 5.0 - Supports Spark 3.5.4, Scala 2, Python 3`을 선택합니다.
+ API에서 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 작업의 `GlueVersion` 파라미터에서 **5.0**을 선택합니다.

새 작업의 경우 작업을 생성할 때 `Glue 5.0`을 선택합니다.
+ 콘솔의 `Glue version`에서 `Spark 3.5.4, Python 3 (Glue Version 5.0) or Spark 3.5.4, Scala 2 (Glue Version 5.0)`를 선택합니다.
+ AWS Glue Studio의 `Glue version`에서 `Glue 5.0 - Supports Spark 3.5.4, Scala 2, Python 3`을 선택합니다.
+ API에서 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 작업의 `GlueVersion` 파라미터에서 **5.0**을 선택합니다.

AWS Glue 2.0 또는 이전 버전에서 가져온 AWS Glue 5.0의 Spark 이벤트 로그를 보려면 [CloudFormation 또는 Docker를 사용하여 AWS Glue 5.0용으로 업그레이드된 Spark 기록 서버를 시작합니다](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html).

## 마이그레이션 체크리스트
<a name="migrating-version-50-checklist"></a>

마이그레이션을 위해 이 체크리스트를 검토합니다.
+ Java 17 업데이트
+ [Scala] v1에서 v2로 AWS SDK 직접 호출 업그레이드
+ Python 3.10에서 3.11로 마이그레이션
+ [Python] boto 참조를 1.26에서 1.34로 업데이트

## AWS Glue 5.0 기능
<a name="migrating-version-50-features"></a>

이 섹션에서는 AWS Glue 기능에 대해 자세히 설명합니다.

### AWS Glue ETL에서 메타스토어 Data Catalog 쿼리
<a name="migrating-version-50-features-metastore"></a>

AWS Glue 작업을 등록하여 AWS Glue Data Catalog에 액세스할 수 있으며, 이를 통해 다양한 소비자에게 테이블 및 기타 메타스토어 리소스를 제공할 수 있습니다. Data Catalog는 Amazon S3 데이터 레이크의 모든 데이터를 통합하는 다중 카탈로그 계층 구조를 지원합니다. 또한 데이터에 액세스하기 위한 Hive 메타스토어 API와 오픈 소스 Apache Iceberg API를 모두 제공합니다. 이러한 기능은 AWS Glue 및 기타 데이터 중심 서비스(Amazon EMR, Amazon Athena, Amazon Redshift 등)에서 사용할 수 있습니다.

Data Catalog에서 리소스를 생성하면 Apache Iceberg REST API를 지원하는 모든 SQL 엔진에서 해당 리소스에 액세스할 수 있습니다. AWS Lake Formation은 권한을 관리합니다. 구성 후 AWS Glue의 기능을 활용하면 익숙한 애플리케이션에서 이러한 메타스토어 리소스를 쿼리하여 다양한 데이터를 쿼리할 수 있습니다. 여기에는 Apache Spark 및 Trino가 포함됩니다.

#### 메타데이터 리소스 구성 방법
<a name="migrating-version-50-features-metastore-organized"></a>

데이터는 AWS Glue Data Catalog를 사용하여 카탈로그, 데이터베이스 및 테이블의 논리적 계층 구조로 구성됩니다.
+ 카탈로그 - 스키마 또는 테이블과 같은 데이터 스토어의 객체를 유지하는 논리적 컨테이너입니다.
+ 데이터베이스 - 카탈로그의 테이블 및 뷰와 같은 데이터 객체를 구성합니다.
+ 테이블 및 뷰 - 이해하기 쉬운 스키마를 사용하여 추상화 계층을 제공하는 데이터베이스의 데이터 객체입니다. 이를 통해 다양한 형식과 다양한 위치의 기본 데이터에 쉽게 액세스할 수 있습니다.

## AWS Glue 4.0에서 AWS Glue 5.0으로 마이그레이션
<a name="migrating-version-50-from-40"></a>

기계 학습 변환을 제외하면 AWS Glue 4.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 5.0에 존재합니다.

다음과 같은 새로운 파라미터가 추가되었습니다.
+ `--enable-lakeformation-fine-grained-access`: AWS Lake Formation 테이블에서 세분화된 액세스 제어(FGAC) 기능을 활성화합니다.

Spark 마이그레이션 설명서를 참조하세요.
+ [Migration Guide: Spark Core](https://spark.apache.org/docs/3.5.6/core-migration-guide.html)
+ [Migration Guide: SQL, Datasets and DataFrame](https://spark.apache.org/docs/3.5.6/sql-migration-guide.html)
+ [Migration Guide: Structured Streaming](https://spark.apache.org/docs/3.5.6/ss-migration-guide.html)
+ [Upgrading PySpark](https://spark.apache.org/docs/3.5.6/api/python/migration_guide/pyspark_upgrade.html)

## AWS Glue 3.0에서 AWS Glue 5.0으로 마이그레이션
<a name="migrating-version-50-from-30"></a>

**참고**  
AWS Glue 4.0과 관련된 마이그레이션 단계는 [AWS Glue 3.0에서 AWS Glue 4.0으로 마이그레이션](migrating-version-40.md#migrating-version-40-from-30) 섹션을 참조하세요.

기계 학습 변환을 제외하면 AWS Glue 3.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 5.0에 존재합니다.

## AWS Glue 2.0에서 AWS Glue 5.0으로 마이그레이션
<a name="migrating-version-50-from-20"></a>

**참고**  
AWS Glue 4.0과 관련된 마이그레이션 단계와 AWS Glue 버전 3.0과 4.0 간의 마이그레이션 차이점 목록은 [AWS Glue 3.0에서 AWS Glue 4.0으로 마이그레이션](migrating-version-40.md#migrating-version-40-from-30) 섹션을 참조하세요.

또한 AWS Glue 버전 3.0과 2.0 간의 다음과 같은 마이그레이션 차이점에 유의하세요.
+ 기계 학습 변환을 제외하면 AWS Glue 2.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 5.0에 존재합니다.
+ 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다. 예를 들어 Spark 3.1.1 이상은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.4는 이를 허용합니다.
+ Python 2.7을 지원하지 않습니다.
+ 기존 AWS Glue 2.0 작업에 제공된 추가 jar는 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. `--user-jars-first` 작업 파라미터를 사용하여 클래스 경로 충돌을 피할 수 있습니다.
+ parquet 파일에서 타임스탬프를 로드/저장하는 동작이 변경됩니다. 자세한 내용은 Spark SQL 3.0에서 3.1로 업그레이드를 참조하세요.
+ 드라이버/실행기 구성을 위한 다양한 Spark 작업 병렬 처리. `--executor-cores` 작업 인수를 전달하여 작업 병렬 처리를 조정할 수 있습니다.

## AWS Glue 5.0에서의 로깅 동작 변경 사항
<a name="enable-continous-logging-changes-glue-50"></a>

 다음은 AWS Glue 5.0에서의 로깅 동작 변경 사항입니다. 자세한 내용은 [AWS Glue 작업에 대한 로깅](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging.html)을 참조하세요.
+  이제 모든 로그(시스템 로그, Spark 대몬 로그, 사용자 로그 및 Glue Logger 로그)가 기본적으로 `/aws-glue/jobs/error` 로그 그룹에 기록됩니다.
+  이전 버전에서 지속 로깅에 사용되는 `/aws-glue/jobs/logs-v2` 로그 그룹은 더 이상 사용되지 않습니다.
+  제거된 지속 로깅 인수를 사용하여 로그 그룹 또는 로그 스트림 이름을 더 이상 변경 또는 사용자 지정할 수 없습니다. 대신 AWS Glue 5.0의 새 작업 인수를 참조하세요.

### AWS Glue 5.0에는 두 가지 새로운 작업 인수가 도입됩니다.
<a name="enable-continous-logging-new-arguments-glue-50"></a>
+  `––custom-logGroup-prefix`: `/aws-glue/jobs/error` 및 `/aws-glue/jobs/output` 로그 그룹에 대한 사용자 지정 접두사를 지정할 수 있습니다.
+  `––custom-logStream-prefix`: 로그 그룹 내에 있는 로그 스트림 이름의 사용자 지정 접두사를 지정할 수 있습니다.

   사용자 지정 접두사의 검증 규칙 및 제한 사항: 
  +  전체 로그 스트림 이름은 1\$1512자여야 합니다.
  +  로그 스트림 이름의 사용자 지정 접두사는 400자로 제한됩니다.
  +  접두사에서 허용되는 문자로는 영숫자 문자, 밑줄(`\$1`), 하이픈(`-`) 및 슬래시(`/`)가 있습니다.

### AWS Glue 5.0에서 더 이상 사용되지 않는 지속 로깅 인수
<a name="enabling-continuous-logging-deprecated-arguments"></a>

 지속 로깅에 대한 다음 작업 인수는 AWS Glue 5.0에서 더 이상 사용되지 않습니다.
+  `––enable-continuous-cloudwatch-log` 
+  `––continuous-log-logGroup` 
+  `––continuous-log-logStreamPrefix` 
+  `––continuous-log-conversionPattern` 
+  `––enable-continuous-log-filter` 

## AWS Glue 5.0용 커넥터 및 JDBC 드라이버 마이그레이션
<a name="migrating-version-50-connector-driver-migration"></a>

업그레이드된 JDBC 및 데이터 레이크 커넥터 버전은 다음을 참조하세요.
+ [부록 B: JDBC 드라이버 업그레이드](#migrating-version-50-appendix-jdbc-driver)
+ [부록 C: 커넥터 업그레이드](#migrating-version-50-appendix-connector)
+ [부록 D: 오픈 테이블 형식 업그레이드](#migrating-version-50-appendix-open-table-formats)

다음 변경 사항은 Glue 5.0의 부록에 나와 있는 커넥터 또는 드라이버 버전에 적용됩니다.

**Amazon Redshift**  
다음과 같은 변경 사항에 유의하세요.
+ 커넥터가 Redshift 데이터 공유 테이블을 쿼리할 수 있도록 세 부분으로 구성된 테이블 이름에 대한 지원을 추가합니다.
+ 예상 데이터 크기와의 일치도를 높이기 위해 Spark `ShortType` 매핑을 Redshift `INTEGER` 대신 `SMALLINT`를 사용하도록 수정합니다.
+ Amazon Redshift Serverless의 사용자 지정 클러스터 이름(CNAME)에 대한 지원이 추가되었습니다.

**Apache Hudi**  
다음과 같은 변경 사항에 유의하세요.
+ 레코드 수준 인덱스를 지원합니다.
+ 레코드 키의 자동 생성을 지원합니다. 이제 레코드 키 필드를 지정할 필요가 없습니다.

**Apache Iceberg**  
다음과 같은 변경 사항에 유의하세요.
+ AWS Lake Formation을 사용하는 세분화된 액세스 제어를 지원합니다.
+ 고유한 독립적 수명 주기가 있는 스냅샷에 대한 명명된 참조인 분기 및 태그 지정을 지원합니다.
+ 지정된 기간 동안 또는 특정 스냅샷 사이에서 테이블에 대한 변경 사항을 포함하는 보기를 생성하는 변경 로그 보기 프로시저가 추가되었습니다.

**Delta Lake**  
다음과 같은 변경 사항에 유의하세요.
+ Apache Iceberg 및 Apache Hudi를 통해 원활하게 액세스할 수 있는 Delta Universal Format(UniForm)을 지원합니다.
+ MoR(Merge-on-Read) 패러다임을 구현하는 삭제 벡터를 지원합니다.

**AzureCosmos**  
다음과 같은 변경 사항에 유의하세요.
+ 계층적 파티션 키 지원이 추가되었습니다.
+ 중첩 속성에 대해 StringType(원시 json)과 함께 사용자 지정 스키마를 사용하는 옵션을 추가했습니다.
+ 클라이언트 보안 암호 대신 인증서와 함께 SPN(ServicePrincipal Name) 인증을 사용하도록 허용하는 `spark.cosmos.auth.aad.clientCertPemBase64` 구성 옵션을 추가했습니다.

자세한 내용은 [Azure Cosmos DB Spark connector change log](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/cosmos/azure-cosmos-spark_3-2_2-12/CHANGELOG.md)를 참조하세요.

**Microsoft SQL Server**  
다음과 같은 변경 사항에 유의하세요.
+ 기본적으로 TLS 암호화가 활성화됩니다.
+ encrypt = false이지만 서버에 암호화가 필요한 경우 `trustServerCertificate` 연결 설정을 기반으로 인증서가 검증됩니다.
+ `aadSecurePrincipalId` 및 `aadSecurePrincipalSecret`가 사용되지 않습니다.
+ `getAADSecretPrincipalId` API가 제거되었습니다.
+ 영역이 지정될 때 CNAME 확인이 추가되었습니다.

**MongoDB**  
다음과 같은 변경 사항에 유의하세요.
+ Spark Structured Streaming을 사용한 마이크로 배치 모드를 지원합니다.
+ BSON 데이터 유형을 지원합니다.
+ 마이크로 배치 또는 연속 스트리밍 모드를 사용할 때 여러 컬렉션을 읽을 수 있는 지원이 추가되었습니다.
  + `collection` 구성 옵션에 사용되는 컬렉션 이름에 쉼표가 포함된 경우 Spark 커넥터는 이를 두 개의 서로 다른 컬렉션으로 취급합니다. 이를 방지하려면 쉼표 앞에 백슬래시(\$1)를 붙여 이스케이프 처리해야 합니다.
  + `collection` 구성 옵션에 사용되는 컬렉션 이름이 "\$1"인 경우 Spark 커넥터는 이를 모든 컬렉션을 스캔하는 사양으로 해석합니다. 이를 방지하려면 별표 앞에 백슬래시(\$1)를 붙여 이스케이프 처리해야 합니다.
  + `collection` 구성 옵션에 사용되는 컬렉션 이름에 백슬래시(\$1)가 포함된 경우 Spark 커넥터는 백슬래시를 이스케이프 문자로 취급하며, 이로 인해 값을 해석하는 방식이 변경될 수 있습니다. 이를 방지하려면 백슬래시 앞에 다른 백슬래시를 붙여 이스케이프 처리해야 합니다.

자세한 내용은 [MongoDB connector for Spark release notes](https://www.mongodb.com/docs/spark-connector/current/release-notes/)를 참조하세요.

**Snowflake**  
다음과 같은 변경 사항에 유의하세요.
+ Snowflake 테이블에 저장할 때 `StringType` 열 값을 자동으로 트리밍하는 데 사용할 수 있는 새로운 `trim_space` 파라미터를 도입했습니다. 기본값: `false`.
+ 기본적으로 세션 수준에서 `abort_detached_query` 파라미터를 비활성화했습니다.
+ OAUTH를 사용할 때 `SFUSER` 파라미터 요구 사항을 제거했습니다.
+ 고급 쿼리 푸시다운 기능을 제거했습니다. 대체 기능을 사용할 수 있습니다. 예를 들어, Snowflake 테이블에서 데이터를 로드하는 대신 사용자가 Snowflake SQL 쿼리에서 직접 데이터를 로드할 수 있습니다.

자세한 내용은 [Snowflake Connector for Spark release notes](https://docs.snowflake.com/en/release-notes/clients-drivers/spark-connector-2024)를 참조하세요.

### 부록 A: 중요한 종속성 업그레이드
<a name="migrating-version-50-appendix-dependencies"></a>

다음은 종속성 업그레이드입니다.


| 종속성 | AWS Glue 5.0 버전 | AWS Glue 4.0 버전 | AWS Glue 3.0 버전 | AWS Glue 2.0 버전 | AWS Glue 1.0 버전 | 
| --- | --- | --- | --- | --- | --- | 
| Java | 17 | 8 | 8 | 8 | 8 | 
| Spark | 3.5.4 | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.4.1 | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12.18 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Jackson | 2.15.2 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Hive | 2.3.9-amzn-4 | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.69.0 | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| 화살표 | 12.0.1 | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue 데이터 카탈로그 클라이언트 | 4.5.0 | 3.7.0 | 3.0.0 | 1.10.0 | 해당 사항 없음 | 
| Java용 AWS SDK | 2.29.52 | 1.12 | 1.12 |  |  | 
| Python | 3.11 | 3.10 | 3.7 | 2.7 및 3.6 | 2.7 및 3.6 | 
| Boto | 1.34.131 | 1.26 | 1.18 | 1.12 | 해당 사항 없음 | 
| EMR DynamoDB 커넥터 | 5.6.0 | 4.16.0 |  |  |  | 

### 부록 B: JDBC 드라이버 업그레이드
<a name="migrating-version-50-appendix-jdbc-driver"></a>

다음은 JDBC 드라이버 업그레이드입니다.


| 드라이버 | AWS Glue 5.0의 JDBC 드라이버 버전 | AWS Glue 4.0의 JDBC 드라이버 버전 | AWS Glue 3.0의 JDBC 드라이버 버전 | 과거 AWS Glue 버전의 JDBC 드라이버 버전 | 
| --- | --- | --- | --- | --- | 
| MySQL | 8.0.33 | 8.0.23 | 8.0.23 | 5.1 | 
| Microsoft SQL Server | 10.2.0 | 9.4.0 | 7.0.0 | 6.1.0 | 
| Oracle Database | 23.3.0.23.09 | 21.7 | 21.1 | 11.2 | 
| PostgreSQL | 42.7.3 | 42.3.6 | 42.2.18 | 42.1.0 | 
| Amazon Redshift |  redshift-jdbc42-2.1.0.29  |  redshift-jdbc42-2.1.0.16  |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   | 
| SAP Hana | 2.20.17 | 2.17.12 |  |  | 
| Teradata | 20.00.00.33 | 20.00.00.06 |  |  | 

### 부록 C: 커넥터 업그레이드
<a name="migrating-version-50-appendix-connector"></a>

다음은 커넥터 업그레이드입니다.


| 드라이버 | AWS Glue 5.0의 커넥터 버전 | AWS Glue 4.0의 커넥터 버전 | AWS Glue 3.0의 커넥터 버전 | 
| --- | --- | --- | --- | 
| EMR DynamoDB 커넥터 | 5.6.0 | 4.16.0 |  | 
| Amazon Redshift | 6.4.0 | 6.1.3 |  | 
| OpenSearch | 1.2.0 | 1.0.1 |  | 
| MongoDB | 10.3.0 | 10.0.4 | 3.0.0 | 
| Snowflake | 3.0.0 | 2.12.0 |  | 
| Google BigQuery | 0.32.2 | 0.32.2 |  | 
| AzureCosmos | 4.33.0 | 4.22.0 |  | 
| AzureSQL | 1.3.0 | 1.3.0 |  | 
| Vertica | 3.3.5 | 3.3.5 |  | 

### 부록 D: 오픈 테이블 형식 업그레이드
<a name="migrating-version-50-appendix-open-table-formats"></a>

다음은 오픈 테이블 형식 업그레이드입니다.


| OTF | AWS Glue 5.0의 커넥터 버전 | AWS Glue 4.0의 커넥터 버전 | AWS Glue 3.0의 커넥터 버전 | 
| --- | --- | --- | --- | 
| Hudi | 0.15.0 | 0.12.1 | 0.10.1 | 
| Delta Lake | 3.3.0 | 2.1.0 | 1.0.0 | 
| Iceberg | 1.7.1 | 1.0.0 | 0.13.1 | 

# AWS Glue 버전 4.0으로 AWS Glue for Spark 작업 마이그레이션
<a name="migrating-version-40"></a>

이 주제에서는 Spark 애플리케이션 및 ETL 작업을 AWS Glue 4.0으로 마이그레이션할 수 있도록 하는 AWS Glue 버전 0.9, 1.0, 2.0 및 3.0 간의 변경 사항에 대해 설명합니다. 또한 AWS Glue 4.0의 기능과 이를 사용할 때의 이점에 대해 설명합니다.

AWS Glue ETL 작업에 이 기능을 사용하려면 작업 생성 시 `Glue version`으로 **4.0**을 선택합니다.

**Topics**
+ [지원되는 새로운 기능](#migrating-version-40-features)
+ [AWS Glue 4.0으로 마이그레이션할 작업](#migrating-version-40-actions)
+ [마이그레이션 체크리스트](#migrating-version-40-checklist)
+ [AWS Glue 3.0에서 AWS Glue 4.0으로 마이그레이션](#migrating-version-40-from-30)
+ [AWS Glue 2.0에서 AWS Glue 4.0으로 마이그레이션](#migrating-version-40-from-20)
+ [AWS Glue 1.0에서 AWS Glue 4.0으로 마이그레이션](#migrating-version-40-from-10)
+ [AWS Glue 0.9에서 AWS Glue 4.0으로 마이그레이션](#migrating-version-40-from-09)
+ [AWS Glue 4.0용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-40-connector-driver-migration)
+ [부록 A: 중요한 종속성 업그레이드](#migrating-version-40-appendix-dependencies)
+ [부록 B: JDBC 드라이버 업그레이드](#migrating-version-40-appendix-jdbc-driver)
+ [부록 C: 커넥터 업그레이드](#migrating-version-40-appendix-connector)

## 지원되는 새로운 기능
<a name="migrating-version-40-features"></a>

이 섹션에서는 AWS Glue 버전 4.0의 새로운 기능과 장점에 대해 설명합니다.
+ Apache Spark 3.3.0을 기반으로 하지만 적응형 쿼리 실행, 벡터화된 리더, 최적화된 셔플, 파티션 병합과 같은 Amazon EMR 및 AWS Glue의 최적화를 포함합니다.
+ MySQL, Microsoft SQL Server, Oracle, PostgreSQL, MongoDB 및 Spark 3.3.0에서 가져온 업그레이드된 Spark 라이브러리 및 종속성을 포함한 모든 AWS Glue 기본 소스용 JDBC 드라이버가 업그레이드되었습니다.
+ 새로운 Amazon Redshift 커넥터와 JDBC 드라이버로 업데이트.
+ 업그레이드된 EMR 파일 시스템(EMRFS)으로 Amazon S3 액세스가 최적화되었으며 Amazon S3 최적화 출력 커미터가 기본적으로 사용됩니다.
+ 파티션 인덱스, 푸시다운 조건자, 파티션 목록 및 업그레이드된 Hive 메타스토어 클라이언트로 Data Catalog 액세스가 최적화되었습니다.
+ 셀 수준 필터링 및 데이터 레이크 트랜잭션이 있는 관리되는 카탈로그 테이블을 위해 Lake Formation과 통합됩니다.
+ 시작 대기 시간이 단축되어 전반적인 작업 완료 시간과 상호 작용성이 개선되었습니다.
+ Spark 작업은 최소 10분에서 1분으로 10배 더 짧은 최소 청구 기간으로 1초 단위로 청구됩니다.
+ Apache Hudi, Delta Lake 및 Apache Iceberg를 통해 개방형 데이터 레이크 프레임워크 기본 지원.
+ Amazon S3를 사용하여 셔플링 및 탄력적인 스토리지 용량을 지원할 수 있도록 Amazon S3 기반 클라우드 셔플 스토리지 플러그인(Apache Spark 플러그인) 기본 지원.

**Spark 3.1.1에서 Spark 3.3.0으로 개선된 주요 기능**  
다음과 같은 개선 사항에 유의합니다.
+ 행 수준 런타임 필터링([SPARK-32268](https://issues.apache.org/jira/browse/SPARK-32268)).
+ ANSI 개선 사항([SPARK-38860](https://issues.apache.org/jira/browse/SPARK-38860)).
+ 오류 메시지 개선 사항([SPARK-38781](https://issues.apache.org/jira/browse/SPARK-38781)).
+ Parquet 벡터화된 리더([SPARK-34863](https://issues.apache.org/jira/browse/SPARK-34863))에 대해 복합 유형을 지원합니다.
+ Spark SQL([SPARK-37273](https://issues.apache.org/jira/browse/SPARK-37273))에 대해 숨김 파일 메타데이터를 지원합니다.
+ Python/Pandas UDF([SPARK-37443](https://issues.apache.org/jira/browse/SPARK-37443))에 대한 프로파일러를 제공합니다.
+ 여러 배치에서 Triggger.Once과 같은 스트리밍 쿼리를 실행하기 위해 Triggger.AvailableNow를 소개합니다([SPARK-36533](https://issues.apache.org/jira/browse/SPARK-36533)).
+ 보다 포괄적인 Datasource V2 푸시다운 기능([SPARK-38788](https://issues.apache.org/jira/browse/SPARK-38788)).
+ log4j 1에서 log4j 2([SPARK-37814](https://issues.apache.org/jira/browse/SPARK-37814))로 마이그레이션합니다.

**기타 주요 변경 사항**  
다음과 같은 변경 사항에 유의하세요.
+ 호환성에 영향을 미치는 변경 사항
  + 문서 및 Python/문서([SPARK-36977](https://issues.apache.org/jira/browse/SPARK-36977))에서 Python 3.6 지원에 대한 참조를 삭제합니다.
  + 기본 제공 pickle을 cloudpickle([SPARK-32079](https://issues.apache.org/jira/browse/SPARK-32079))로 대체하여 명명된 tuple hack을 제거합니다.
  + 최소 pandas 버전을 1.0.5([SPARK-37465](https://issues.apache.org/jira/browse/SPARK-37465))로 올립니다.

## AWS Glue 4.0으로 마이그레이션할 작업
<a name="migrating-version-40-actions"></a>

기존 작업의 경우 작업 구성에서 `Glue version`을 이전 버전에서 `Glue 4.0`으로 변경합니다.
+ AWS Glue Studio의 `Glue version`에서 `Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3`을 선택합니다.
+ API에서 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 작업의 `GlueVersion` 파라미터에서 **4.0**을 선택합니다.

새 작업의 경우 작업을 생성할 때 `Glue 4.0`을 선택합니다.
+ 콘솔의 `Glue version`에서 `Spark 3.3, Python 3 (Glue Version 4.0) or Spark 3.3, Scala 2 (Glue Version 3.0)`를 선택합니다.
+ AWS Glue Studio의 `Glue version`에서 `Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3`을 선택합니다.
+ API에서 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 작업의 `GlueVersion` 파라미터에서 **4.0**을 선택합니다.

AWS Glue 2.0 이전 버전에서 가져온 AWS Glue 4.0의 Spark 이벤트 로그를 보려면 [CloudFormation 또는 Docker를 사용하여 AWS Glue 4.0용으로 업그레이드된 Spark 기록 서버를 시작합니다](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html).

## 마이그레이션 체크리스트
<a name="migrating-version-40-checklist"></a>
+ 작업의 외부 Python 라이브러리가 Python 2.7/3.6에 종속되나요?
  + Spark 3.3.0에서 Python 2.7 및 3.6 지원이 완전히 제거되었으므로 종속 라이브러리를 Python 2.7/3.6에서 Python 3.10으로 업데이트합니다.

## AWS Glue 3.0에서 AWS Glue 4.0으로 마이그레이션
<a name="migrating-version-40-from-30"></a>

마이그레이션할 때 다음 변경 사항에 유의합니다.
+ AWS Glue 3.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 4.0에 존재합니다.
+ AWS Glue 3.0은 Amazon EMR 최적화 Spark 3.1.1을 사용하고 AWS Glue 4.0은 Amazon EMR 최적화 Spark 3.3.0을 사용합니다.

  몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.
+ AWS Glue 4.0에는 EMRFS와 Hadoop에 대한 업데이트도 제공됩니다. 특정 버전 번호는 [부록 A: 중요한 종속성 업그레이드](#migrating-version-40-appendix-dependencies) 섹션을 참조하세요.
+ ETL 작업에 제공되는 AWS SDK가 이제 1.11에서 1.12로 업그레이드되었습니다.
+ 모든 Python 작업에서는 Python 버전 3.10을 사용합니다. 이전에는 Python 3.7이 AWS Glue 3.0에서 사용되었습니다.

  따라서 AWS Glue에서 기본적으로 가져오는 일부 pymodule이 업그레이드됩니다.
+ Log4j가 Log4j2로 업그레이드되었습니다.
  + Log4j2 마이그레이션 경로에 대한 자세한 내용은 [Log4j 설명서](https://logging.apache.org/log4j/2.x/manual/migration.html#Log4j2API)를 참조하세요.
  + 대신 사용자 지정 log4j.properties 파일의 이름을 적절한 log4j2 속성을 사용하여 log4j2.properties 파일로 바꿔야 합니다.
+ 특정 커넥터를 마이그레이션하려면 [AWS Glue 4.0용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-40-connector-driver-migration) 섹션을 참조하세요.
+ AWS 암호화 SDK가 1.x에서 2.x로 업그레이드되었습니다. AWS Glue보안 구성을 사용하는 AWS Glue 작업과 런타임에 제공된 AWS 암호화 SDK 종속성에 종속되는 작업이 영향을 받습니다. AWS Glue 작업 마이그레이션 지침을 참조하세요.

  AWS Glue 2.0/3.0에는 이미 AWS 암호화 SDK 브리지 버전이 포함되어 있으므로 AWS Glue 2.0/3.0 작업을 AWS Glue 4.0 작업으로 안전하게 업그레이드할 수 있습니다.

Spark 마이그레이션 설명서를 참조하세요.
+ [Spark SQL 3.1에서 3.2로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [Spark SQL 3.2에서 3.3으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)

## AWS Glue 2.0에서 AWS Glue 4.0으로 마이그레이션
<a name="migrating-version-40-from-20"></a>

마이그레이션할 때 다음 변경 사항에 유의합니다.

**참고**  
AWS Glue 3.0과 관련된 마이그레이션 단계는 [AWS Glue 3.0에서 AWS Glue 4.0으로 마이그레이션](#migrating-version-40-from-30) 섹션을 참조하세요.
+ AWS Glue 2.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 4.0에 존재합니다.
+ AWS Glue 3.0 이상에서는 Amazon S3에 Parquet 데이터를 쓰기 위한 EMRFS S3 최적화 커미터가 기본값으로 사용됩니다. 그러나 `--enable-s3-parquet-optimized-committer`를 `false`로 설정하여 사용하지 않을 수도 있습니다.
+ AWS Glue 2.0은 오픈 소스 Spark 2.4를 사용하고 AWS Glue 4.0은 Amazon EMR 최적화 Spark 3.3.0을 사용합니다.
  + 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.
  + 예를 들어 Spark 3.3.0은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.4는 이를 허용합니다.
+ ETL 작업에 제공되는 AWS SDK가 이제 1.11에서 1.12로 업그레이드되었습니다.
+ AWS Glue 4.0에는 EMRFS 업데이트, JDBC 드라이버 업데이트, AWS Glue에서 제공하는 Spark 자체에 대한 추가 최적화 기능도 포함되어 있습니다.
+ Scala는 2.11에서 2.12로 업데이트되었으며 Scala 2.12는 Scala 2.11과 역호환되지 않습니다.
+ Python 3.10은 Python 스크립트에 사용되는 기본 버전입니다. AWS Glue 2.0은 Python 3.7 및 2.7만 사용했기 때문입니다.
  + Python 2.7은 Spark 3.3.0에서 지원되지 않습니다. 작업 구성에서 Python 2를 요청하는 작업은 IllegalArgumentException과 함께 실패합니다.
  + AWS Glue 2.0 이상에서는 추가 Python 모듈을 설치하는 새로운 메커니즘을 사용할 수 있습니다.
+ [부록 A: 중요한 종속성 업그레이드](#migrating-version-40-appendix-dependencies)에서 강조 표시된 여러 종속성 업데이트
+ 기존 AWS Glue 2.0 작업에 제공된 추가 JAR 파일은 2.0에서 4.0의 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. AWS Glue 4.0에서 `--user-jars-first` AWS Glue 작업 파라미터를 사용하여 클래스 경로 충돌을 피할 수 있습니다.
+ AWS Glue 4.0은 Spark 3.3을 사용합니다. Spark 3.1부터 parquet 파일에서 타임스탬프를 로드하거나 해당 파일로 저장하는 동작이 변경되었습니다. 자세한 내용은 [Spark SQL 3.0에서 3.1로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)를 참조하세요.

  타임스탬프 열이 포함된 parquet 데이터를 읽거나 쓸 때는 다음 파라미터를 설정하는 것이 좋습니다. 이러한 파라미터를 설정하면 Spark 2에서 Spark 3으로 업그레이드하는 동안 AWS Glue 동적 프레임과 Spark 데이터 프레임 둘 다에서 발생하는 달력 비호환성 문제를 해결할 수 있습니다. datetime 값을 있는 그대로 읽으려면 CORRECTED 옵션을 사용하고, 읽는 동안 달력 차이를 기준으로 datetime 값을 다시 지정하려면 LEGACY 옵션을 사용합니다.

  ```
  - Key: --conf
  - Value: spark.sql.legacy.parquet.int96RebaseModeInRead=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=[CORRECTED|LEGACY]
  ```
+ 특정 커넥터를 마이그레이션하려면 [AWS Glue 4.0용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-40-connector-driver-migration) 섹션을 참조하세요.
+ AWS 암호화 SDK가 1.x에서 2.x로 업그레이드되었습니다. AWS Glue보안 구성을 사용하는 AWS Glue 작업과 런타임에 제공된 AWS 암호화 SDK 종속성에 종속되는 작업이 영향을 받습니다. AWS Glue 작업 마이그레이션 지침을 참조하세요.
  + AWS Glue 2.0에는 이미 AWS 암호화 SDK 브리지 버전이 포함되어 있으므로 AWS Glue 2.0 작업을 AWS Glue 4.0 작업으로 안전하게 업그레이드할 수 있습니다.

Spark 마이그레이션 설명서를 참조하세요.
+ [Spark SQL 2.4에서 3.0으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [Spark SQL 3.1에서 3.2로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [Spark SQL 3.2에서 3.3으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [Spark 3.0 이후 예상되는 Datetime 동작의 변경 사항](https://issues.apache.org/jira/browse/SPARK-31408)

## AWS Glue 1.0에서 AWS Glue 4.0으로 마이그레이션
<a name="migrating-version-40-from-10"></a>

마이그레이션할 때 다음 변경 사항에 유의합니다.
+ AWS Glue 1.0은 오픈 소스 Spark 2.4를 사용하고 AWS Glue 4.0은 Amazon EMR 최적화 Spark 3.3.0을 사용합니다.
  + 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.
  + 예를 들어 Spark 3.3.0은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.4는 이를 허용합니다.
+ AWS Glue 4.0의 모든 작업은 시작 시간이 크게 개선되어 실행됩니다. Spark 작업은 시작 대기 시간이 최대 10분에서 1분으로 단축되어 최소 청구 기간이 10배 더 짧으며 1초 단위로 청구됩니다.
+ AWS Glue 4.0에서는 로깅 동작이 크게 변경되었습니다. Spark 3.3.0의 최소 요구 사항은 Log4j2입니다.
+ 부록에서 강조 표시된 여러 종속성 업데이트.
+ Scala도 2.11에서 2.12로 업데이트되었으며 Scala 2.12는 Scala 2.11과 역호환되지 않습니다.
+ Python 3.10은 Python 스크립트에 사용되는 기본 버전이기도 합니다. AWS Glue 0.9는 Python 2만 사용했기 때문입니다.

  Python 2.7은 Spark 3.3.0에서 지원되지 않습니다. 작업 구성에서 Python 2를 요청하는 작업은 IllegalArgumentException과 함께 실패합니다.
+ AWS Glue 2.0 이상에서는 pip를 통해 추가 Python 모듈을 설치하는 새로운 메커니즘을 사용할 수 있습니다. 자세한 내용은[AWS Glue 2.0\$1에서 pip를 사용하여 추가 Python 모듈 설치](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html#addl-python-modules-support)를 참조하세요.
+ AWS Glue 4.0은 Apache YARN에서 실행되지 않으므로 YARN 설정이 적용되지 않습니다.
+ AWS Glue 4.0에는 Hadoop 분산 파일 시스템(HDFS)이 없습니다.
+ 기존 AWS Glue 1.0 작업에 제공된 추가 JAR 파일은 1.0에서 4.0의 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. 이 문제를 방지하기 위해 기본적으로 `--user-jars-first` AWS Glue 작업 파라미터를 사용하여 AWS Glue 4.0을 활성화합니다.
+ AWS Glue 4.0은 Auto Scaling을 지원합니다. 따라서 auto Scaling이 활성화된 경우 ExecutorAllocationManager 지표를 사용할 수 있습니다.
+ AWS Glue 버전 4.0 작업에서는 작업자 수와 작업자 유형을 지정하지만 `maxCapacity`를 지정하지 않습니다.
+ AWS Glue 4.0은 아직 기계 학습 변환을 지원하지 않습니다.
+ 특정 커넥터를 마이그레이션하려면 [AWS Glue 4.0용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-40-connector-driver-migration) 섹션을 참조하세요.
+ AWS 암호화 SDK가 1.x에서 2.x로 업그레이드되었습니다. AWS Glue보안 구성을 사용하는 AWS Glue 작업과 런타임에 제공된 AWS 암호화 SDK 종속성에 종속되는 작업이 영향을 받습니다. AWS Glue 작업 마이그레이션 지침을 참조하세요.
  + AWS Glue 0.9/1.0 작업을 AWS Glue 4.0 작업으로 직접 마이그레이션할 수 없습니다. 이는 버전 2.x 이상으로 직접 업그레이드하고 모든 새 기능을 즉시 활성화하면 AWS Encryption SDK가 이전 버전의 AWS Encryption SDK에서 암호화된 사이퍼텍스트를 해독할 수 없기 때문입니다.
  + 안전하게 업그레이드하려면 먼저 AWS Encryption SDK 브리지 버전이 포함된 AWS Glue 2.0/3.0 작업으로 마이그레이션하는 것이 좋습니다. 작업을 한 번 실행하여 AWS Encryption SDK 브리지 버전을 활용합니다.
  + 완료되면 AWS Glue 2.0/3.0 작업을 AWS Glue 4.0으로 안전하게 마이그레이션할 수 있습니다.

Spark 마이그레이션 설명서를 참조하세요.
+ [Spark SQL 2.4에서 3.0으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [Spark SQL 3.0에서 3.1로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)
+ [Spark SQL 3.1에서 3.2로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [Spark SQL 3.2에서 3.3으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [Spark 3.0 이후 예상되는 Datetime 동작의 변경 사항](https://issues.apache.org/jira/browse/SPARK-31408)

## AWS Glue 0.9에서 AWS Glue 4.0으로 마이그레이션
<a name="migrating-version-40-from-09"></a>

마이그레이션할 때 다음 변경 사항에 유의합니다.
+ AWS Glue 0.9는 오픈 소스 Spark 2.2.1을 사용하고 AWS Glue 4.0은 Amazon EMR 최적화 Spark 3.3.0을 사용합니다.
  + 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.
  + 예를 들어 Spark 3.3.0은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.2는 이를 허용합니다.
+ AWS Glue 4.0의 모든 작업은 시작 시간이 크게 개선되어 실행됩니다. Spark 작업은 시작 대기 시간이 최대 10분에서 1분으로 단축되어 최소 청구 기간이 10배 더 짧으며 1초 단위로 청구됩니다.
+ AWS Glue 4.0 이후 로깅 동작이 크게 변경되었습니다. Spark 3.3.0에는 여기서(https://spark.apache.org/docs/latest/core-migration-guide.html\$1upgrading-from-core-32-to-33) 언급한 것처럼 Log4j2의 최소 요구 사항이 있습니다.
+ 부록에서 강조 표시된 여러 종속성 업데이트
+ Scala도 2.11에서 2.12로 업데이트되었으며 Scala 2.12는 Scala 2.11과 역호환되지 않습니다.
+ Python 3.10은 Python 스크립트에 사용되는 기본 버전이기도 합니다. AWS Glue 0.9는 Python 2만 사용했기 때문입니다.
  + Python 2.7은 Spark 3.3.0에서 지원되지 않습니다. 작업 구성에서 Python 2를 요청하는 작업은 IllegalArgumentException과 함께 실패합니다.
  + pip를 통해 추가 Python 모듈을 설치하는 새로운 메커니즘을 사용할 수 있습니다.
+ AWS Glue 4.0은 Apache YARN에서 실행되지 않으므로 YARN 설정이 적용되지 않습니다.
+ AWS Glue 4.0에는 Hadoop 분산 파일 시스템(HDFS)이 없습니다.
+ 기존 AWS Glue 0.9 작업에 제공된 추가 JAR 파일은 0.9에서 3.0의 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. AWS Glue 3.0에서 `--user-jars-first` AWS Glue 작업 파라미터를 사용하여 클래스 경로 충돌을 피할 수 있습니다.
+ AWS Glue 4.0은 Auto Scaling을 지원합니다. 따라서 auto Scaling이 활성화된 경우 ExecutorAllocationManager 지표를 사용할 수 있습니다.
+ AWS Glue 버전 4.0 작업에서는 작업자 수와 작업자 유형을 지정하지만 `maxCapacity`를 지정하지 않습니다.
+ AWS Glue 4.0은 아직 기계 학습 변환을 지원하지 않습니다.
+ 특정 커넥터를 마이그레이션하려면 [AWS Glue 4.0용 커넥터 및 JDBC 드라이버 마이그레이션](#migrating-version-40-connector-driver-migration) 섹션을 참조하세요.
+ AWS 암호화 SDK가 1.x에서 2.x로 업그레이드되었습니다. AWS Glue보안 구성을 사용하는 AWS Glue 작업과 런타임에 제공된 AWS 암호화 SDK 종속성에 종속되는 작업이 영향을 받습니다. AWS Glue 작업 마이그레이션 지침을 참조하세요.
  + AWS Glue 0.9/1.0 작업을 AWS Glue 4.0 작업으로 직접 마이그레이션할 수 없습니다. 이는 버전 2.x 이상으로 직접 업그레이드하고 모든 새 기능을 즉시 활성화하면 AWS Encryption SDK가 이전 버전의 AWS Encryption SDK에서 암호화된 사이퍼텍스트를 해독할 수 없기 때문입니다.
  + 안전하게 업그레이드하려면 먼저 AWS Encryption SDK 브리지 버전이 포함된 AWS Glue 2.0/3.0 작업으로 마이그레이션하는 것이 좋습니다. 작업을 한 번 실행하여 AWS Encryption SDK 브리지 버전을 활용합니다.
  + 완료되면 AWS Glue 2.0/3.0 작업을 AWS Glue 4.0으로 안전하게 마이그레이션할 수 있습니다.

Spark 마이그레이션 설명서를 참조하세요.
+ [Spark SQL 2.2에서 2.3으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-22-to-23)
+ [Spark SQL 2.3에서 2.4로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-23-to-24)
+ [Spark SQL 2.4에서 3.0으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [Spark SQL 3.0에서 3.1로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)
+ [Spark SQL 3.1에서 3.2로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [Spark SQL 3.2에서 3.3으로 업그레이드](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [Spark 3.0 이후 예상되는 Datetime 동작의 변경 사항](https://issues.apache.org/jira/browse/SPARK-31408)

## AWS Glue 4.0용 커넥터 및 JDBC 드라이버 마이그레이션
<a name="migrating-version-40-connector-driver-migration"></a>

업그레이드된 JDBC 및 데이터 레이크 커넥터 버전은 다음을 참조하세요.
+ [부록 B: JDBC 드라이버 업그레이드](#migrating-version-40-appendix-jdbc-driver)
+ [부록 C: 커넥터 업그레이드](#migrating-version-40-appendix-connector)

### Hudi
<a name="migrating-version-40-connector-driver-migration-hudi"></a>
+ Spark SQL 지원 개선 사항:
  + `Call Procedure` 명령을 통해 업그레이드, 다운그레이드, 부트스트랩, 정리 및 복구에 대한 지원이 추가되었습니다. Spark SQL에서는 `Create/Drop/Show/Refresh Index` 구문이 가능합니다.
  + Spark SQL과 달리 Spark DataSource를 통한 사용 간 성능 격차가 좁혀졌습니다. 과거에는 데이터 소스 쓰기가 SQL보다 빨랐습니다.
  + 모든 기본 제공 키 생성기는 성능이 우수한 Spark 전용 API 작업을 구현합니다.
  + 대량 `insert` 작업에서 UDF 변환을 RDD 변환으로 대체하여 SerDe 사용 비용을 줄였습니다.
  + Hudi에서 Spark SQL을 사용하려면 SQL 문에서 `primaryKey`를 `tblproperites` 또는 옵션으로 지정해야 합니다. 업데이트 및 삭제 작업의 경우에도 `preCombineField`가 필요합니다.
+ `primaryKey` 없이 버전 0.10.0 이전에 생성한 Hudi 테이블은 버전 0.10.0 이후의 `primaryKey` 필드를 사용하여 다시 생성해야 합니다.

### PostgreSQL
<a name="migrating-version-40-connector-driver-migration-postgresql"></a>
+ 여러 취약점(CVE)이 해결되었습니다.
+ Java 8은 기본적으로 지원됩니다.
+ 작업에서 바이트 배열을 제외한 배열 배열을 사용하는 경우 이 시나리오를 다차원 배열로 간주할 수 있습니다.

### MongoDB
<a name="migrating-version-40-connector-driver-migration-mongodb"></a>
+ 현재 MongoDB 커넥터는 Spark 버전 3.1 이상과 MongoDB 버전 4.0 이상을 지원합니다.
+ 커넥터 업그레이드로 인해 몇 가지 속성 이름이 변경되었습니다. 예를 들어 URI 속성 이름이 `connection.uri`로 변경되었습니다. 현재 옵션에 대한 자세한 내용은 [MongoDB Spark 커넥터 블로그](https://www.mongodb.com/docs/spark-connector/current/configuration/)를 참조하세요.
+ Amazon DocumentDB에서 호스팅하는 MongoDB 4.0을 사용하면 기능상 몇 가지 차이점이 있습니다. 자세한 내용은 다음 주제를 참조하세요.
  + [기능적 차이: Amazon DocumentDB 및 MongoDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/functional-differences.html)
  +  [지원되는 MongoDB API, 작업 및 데이터 형식](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html)
+ “파티셔너” 옵션은 `ShardedPartitioner`, `PaginateIntoPartitionsPartitioner` 및 `SinglePartitionPartitioner`로 제한됩니다. 스테이지 오퍼레이터가 MongoDB API를 지원하지 않기 때문에 Amazon DocumentDB에는 기본값 `SamplePartitioner` 및 `PaginateBySizePartitioner`를 사용할 수 없습니다. 자세한 내용은 [지원되는 MongoDB API, 작업 및 데이터 형식](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html)을 참조하세요.

### Delta Lake
<a name="migrating-version-40-connector-driver-migration-delta"></a>
+ Delta Lake는 이제 [SQL에서 시간 여행](https://docs.delta.io/2.1.0/delta-batch.html#query-an-older-snapshot-of-a-table-time-travel)을 지원하여 오래된 데이터를 쉽게 쿼리할 수 있습니다. 이번 업데이트를 통해 이제 Spark SQL과 DataFrame API를 통해 시간 여행을 사용할 수 있습니다. SQL에서 현재 버전의 TIMESTAMP에 대한 Support 추가되었습니다.
+ Spark 3.3에는 배치 쿼리를 위한 `Trigger.Once`와 동일한 방식으로 스트리밍 쿼리를 실행할 수 있는 [Triggger.AvailableNow](https://issues.apache.org/jira/browse/SPARK-36533)가 도입되었습니다. 이 지원은 Delta 테이블을 스트리밍 소스로 사용하는 경우에도 사용할 수 있습니다.
+ 테이블의 열 목록을 반환하는 SHOW COLUMNS를 지원합니다.
+ Scala 및 Python DeltaTable API에서 [DESCRIBE DETAIL](https://docs.delta.io/2.1.0/delta-utility.html#retrieve-delta-table-details)을 지원합니다. DeltaTable API 또는 Spark SQL을 사용하여 Delta 테이블에 대한 세부 정보를 검색합니다.
+ SQL [Delete](https://github.com/delta-io/delta/pull/1328), [Merge](https://github.com/delta-io/delta/pull/1327) 및 [Update](https://github.com/delta-io/delta/pull/1331) 명령에서 작업 지표 반환을 지원합니다. 이전에는 이러한 SQL 명령이 빈 DataFrame을 반환했지만 이제 수행된 작업에 대한 유용한 지표가 포함된 DataFrame을 반환합니다.
+ 성능 개선 최적화:
  + 여러 개의 작은 파일을 압축할 때 성능을 높이려면 Optimize 명령에서 `coalesce(1)` 대신 `repartition(1)`을 사용하도록 `spark.databricks.delta.optimize.repartition.enabled=true` 구성 옵션을 설정합니다.
  + 큐 기반 접근 방식을 사용하여 압축 작업을 병렬화하여 [성능을 개선했습니다](https://github.com/delta-io/delta/pull/1315).
+ 기타 주요 변경 사항:
  + VACUUUM 및 OPTIMIZE SQL 명령에서 [변수 사용을 지원합니다](https://github.com/delta-io/delta/issues/1267).
  + 카탈로그 테이블을 통한 CONVERT TO DELTA 관련 개선 사항은 다음과 같습니다.
    + 제공되지 않은 경우 카탈로그에서 [파티션 스키마를 자동으로 채웁니다](https://github.com/delta-io/delta/commit/18d4d12ed06f973006501f6c39c8785db51e2b1f).
    + 전체 디렉터리 스캔을 수행하는 대신 카탈로그의 [파티션 정보를 사용하여](https://github.com/delta-io/delta/commit/ebff29904f3ababb889897343f8f8f7a010a1f71) 커밋할 데이터 파일을 찾습니다. 테이블 디렉터리의 모든 데이터 파일을 커밋하는 대신 활성 파티션의 디렉터리에 있는 데이터 파일만 커밋됩니다.
  + DROP COLUMN 및 RENAME COLUMN을 사용하지 않은 경우 열 매핑이 가능한 테이블에 대한 [CDF(Change Data Feed) 배치 읽기를 지원합니다](https://github.com/delta-io/delta/issues/1349). 자세한 내용은 [Delta Lake 설명서](https://docs.delta.io/2.1.0/delta-change-data-feed.html#known-limitations)를 참조하세요.
  + 첫 번째 통과에서 스키마 프루닝을 활성화하여 [Update 명령 성능을 개선합니다](https://github.com/delta-io/delta/pull/1202).

### Apache Iceberg
<a name="migrating-version-40-connector-driver-migration-iceberg"></a>
+ 스캔 계획 및 Spark 쿼리에 대한 몇 가지 [성능 개선 사항](https://iceberg.apache.org/releases/#performance-improvements)이 추가되었습니다.
+ 변경 기반 커밋을 사용하여 서비스 측의 커밋 충돌을 해결하는 일반 REST 카탈로그 클라이언트를 추가했습니다.
+ `AS OF` SQL 시간 여행 쿼리 구문이 지원됩니다.
+ MERGE 및 UPDATE 쿼리에 대한 읽기 중 병합 지원을 추가했습니다.
+ Z축을 통한 파티션 재작성 지원을 추가했습니다.
+ [Theta 스케치](https://datasketches.apache.org/docs/Theta/InverseEstimate.html) 또는 블룸 필터와 같은 대형 통계 및 인덱스 blob을 위한 형식인 Puffin의 사양 및 구현을 추가했습니다.
+ 데이터를 점진적으로 소비하기 위한 새 인터페이스를 추가했습니다(추가 및 변경 로그 스캔 모두).
+ 대량 작업 및 FileIO 인터페이스에 대한 범위 읽기 지원이 추가되었습니다.
+ 메타데이터 트리에서 삭제 파일을 표시하는 메타데이터 테이블을 더 추가했습니다.
+ 드롭 테이블 동작이 변경되었습니다. Iceberg 0.13.1에서 `DROP TABLE`을 실행하면 카탈로그에서 테이블이 제거되고 테이블 내용도 삭제됩니다. Iceberg 1.0.0에서 `DROP TABLE`은 카탈로그에서만 테이블을 제거합니다. 테이블 내용을 삭제하려면 `DROP TABLE PURGE`를 사용합니다.
+ Parquet 벡터화된 읽기는 Iceberg 1.0.0에서 기본적으로 활성화됩니다. 벡터화된 읽기를 비활성화하려면 `read.parquet.vectorization.enabled`를 `false`로 설정합니다.

### Oracle
<a name="migrating-version-40-connector-driver-migration-oracle"></a>

변경 사항은 미미합니다.

### MySQL
<a name="migrating-version-40-connector-driver-migration-mysql"></a>

변경 사항은 미미합니다.

### Amazon Redshift
<a name="migrating-version-40-connector-driver-migration-redshift"></a>

AWS Glue 4.0에는 새로운 JDBC 드라이버가 포함된 새로운 Amazon Redshift 커넥터가 있습니다. 향상된 기능 및 이전 AWS Glue 버전에서 마이그레이션하는 방법에 대한 자세한 내용은 [Redshift 연결](aws-glue-programming-etl-connect-redshift-home.md) 섹션을 참조하세요.

## 부록 A: 중요한 종속성 업그레이드
<a name="migrating-version-40-appendix-dependencies"></a>

다음은 종속성 업그레이드입니다.


| 종속성 | AWS Glue 4.0 버전 | AWS Glue 3.0 버전 | AWS Glue 2.0 버전 | AWS Glue 1.0 버전 | 
| --- | --- | --- | --- | --- | 
| Spark | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12 | 2.12 | 2.11 | 2.11 | 
| Jackson | 2.13.3 | 2.10.x | 2.7.x | 2.7.x | 
| Hive | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| 화살표 | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue 데이터 카탈로그 클라이언트 | 3.7.0 | 3.0.0 | 1.10.0 | 해당 사항 없음 | 
| Python | 3.10 | 3.7 | 2.7 및 3.6 | 2.7 및 3.6 | 
| Boto | 1.26 | 1.18 | 1.12 | 해당 사항 없음 | 

## 부록 B: JDBC 드라이버 업그레이드
<a name="migrating-version-40-appendix-jdbc-driver"></a>

다음은 JDBC 드라이버 업그레이드입니다.


| 드라이버 | 과거 AWS Glue 버전의 JDBC 드라이버 버전 | AWS Glue 3.0의 JDBC 드라이버 버전 | AWS Glue 4.0의 JDBC 드라이버 버전 | 
| --- | --- | --- | --- | 
| MySQL | 5.1 | 8.0.23 | 8.0.23 | 
| Microsoft SQL Server | 6.1.0 | 7.0.0 | 9.4.0 | 
| Oracle Database | 11.2 | 21.1 | 21.7 | 
| PostgreSQL | 42.1.0 | 42.2.18 | 42.3.6 | 
| MongoDB | 2.0.0 | 4.0.0 | 4.7.2 | 
| Amazon Redshift |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc42-2.1.0.16  | 

## 부록 C: 커넥터 업그레이드
<a name="migrating-version-40-appendix-connector"></a>

다음은 커넥터 업그레이드입니다.


| 드라이버 | AWS Glue 3.0의 커넥터 버전 | AWS Glue 4.0의 커넥터 버전 | 
| --- | --- | --- | 
| MongoDB | 3.0.0 | 10.0.4 | 
| Hudi | 0.10.1 | 0.12.1 | 
| Delta Lake | 1.0.0 | 2.1.0 | 
| Iceberg | 0.13.1 | 1.0.0 | 
| DynamoDB | 1.11 | 1.12 | 

# AWS Glue에서 Apache Spark에 대한 생성형 AI 업그레이드
<a name="upgrade-analysis"></a>

 AWS Glue에서 Spark 업그레이드를 통해 데이터 엔지니어와 개발자는 생성형 AI를 사용하여 기존 AWS Glue Spark 작업을 최신 Spark 릴리스로 업그레이드 및 마이그레이션할 수 있습니다. 데이터 엔지니어는 이를 사용하여 AWS Glue Spark 작업을 스캔하고, 업그레이드 계획을 생성하며, 계획을 실행하고, 출력을 검증할 수 있습니다. Spark 스크립트, 구성, 종속 항목, 메서드 및 기능을 식별하고 업데이트하는 차별화되지 않은 작업을 자동화하여 Spark 업그레이드의 시간과 비용을 줄입니다.

![\[GIF에서는 샘플 업그레이드 분석 워크플로의 엔드투엔드 구현을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/demo_lumos.gif)


## 작동 방식
<a name="upgrade-analysis-how-it-works"></a>

 업그레이드 분석을 사용할 때 AWS Glue는 작업 코드에서 버전 및 구성 간 차이를 식별하여 업그레이드 계획을 생성합니다. 업그레이드 계획에서는 모든 코드 변경 사항과 필요한 마이그레이션 단계를 자세히 설명합니다. 다음으로, AWS Glue는 환경에서 업그레이드된 애플리케이션을 빌드하고 실행하여 변경 사항을 검증하고 작업을 마이그레이션할 수 있는 코드 변경 사항 목록을 생성합니다. 제안된 변경 사항을 자세히 설명하는 요약과 함께 업데이트된 스크립트를 볼 수 있습니다. 자체 테스트를 실행한 후 변경 사항을 수락하면 AWS Glue 작업이 새 스크립트를 사용하여 최신 버전으로 자동 업데이트됩니다.

 업그레이드 분석 프로세스는 워크로드 및 작업의 복잡성에 따라 완료하는 데 다소 시간이 걸릴 수 있습니다. 업그레이드 분석 결과는 지정된 Amazon S3 경로에 저장되며, 이를 검토하여 업그레이드 및 잠재적 호환성 문제를 파악할 수 있습니다. 업그레이드 분석 결과를 검토한 후 업그레이드하기 전에 실제 업그레이드를 진행할지 아니면 필요에 따라 작업을 변경할지 결정할 수 있습니다.

## 사전 조건
<a name="upgrade-analysis-prerequisites"></a>

 생성형 AI를 사용하여 AWS Glue에서 작업을 업그레이드하려면 다음 사전 조건이 필요합니다.
+  AWS Glue 2 PySpark 작업 - AWS Glue 2 작업만 AWS Glue 5로 업그레이드할 수 있습니다.
+  분석을 시작하고, 결과를 검토하며, 작업을 업그레이드하려면 IAM 권한이 필요합니다. 자세한 내용은 아래 [권한](#auto-upgrade-permissions) 섹션의 예제를 참조하세요.
+  AWS KMS를 사용하여 분석 아티팩트를 암호화하는 경우 AWS AWS KMS 권한이 추가로 필요합니다. 자세한 내용은 아래 [AWS KMS 정책](#auto-upgrade-kms-policy) 섹션의 예제를 참조하세요.

### 권한
<a name="auto-upgrade-permissions"></a>

#### 새 업그레이드 분석을 시작하려면 다음 권한이 필요합니다.
<a name="collapsible-section-1"></a>

1.  다음 권한으로 직접 호출자의 IAM 정책을 업데이트하세요.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "glue:StartJobUpgradeAnalysis",
                   "glue:StartJobRun",
                   "glue:GetJobRun",
                   "glue:GetJob",
                   "glue:BatchStopJobRun"
               ],
               "Resource": [
                   "arn:aws:glue:us-east-1:111122223333:job/jobName"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
              		 "arn:aws:s3:::amzn-s3-demo-bucket/script-location/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": [
               		"arn:aws:s3:::amzn-s3-demo-bucket/results/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id"
           }
       ]
   }
   ```

------

1.  다음 인라인 정책을 포함하도록 업그레이드하려는 작업의 실행 역할을 업데이트하세요.

   ```
       {
         "Effect": "Allow",
         "Action": ["s3:GetObject"],    
         "Resource": [
           "ARN of the Amazon S3 path provided on API",
           "ARN of the Amazon S3 path provided on API/*"
         ]
       }
   ```

    예를 들어 Amazon S3 경로(`s3://amzn-s3-demo-bucket/upgraded-result`)를 사용하는 경우 정책은 다음과 같습니다.

   ```
   {
         "Effect": "Allow",
         "Action": ["s3:GetObject"],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket/upgraded-result/",
           "arn:aws:s3:::amzn-s3-demo-bucket/upgraded-result/*"
         ]
       }
   ```

#### 분석 세부 정보를 검색하려면 다음 권한이 필요합니다.
<a name="collapsible-section-2"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetJobUpgradeAnalysis"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:job/jobName"
      ]
    }
  ]
}
```

------

#### 진행 중인 분석을 중지하려면 다음 권한이 필요합니다.
<a name="collapsible-section-3"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:StopJobUpgradeAnalysis",
        "glue:BatchStopJobRun"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:job/jobName"
      ]
    }
  ]
}
```

------

#### 특정 작업에 대해 제출된 모든 분석을 나열하려면 다음 권한이 필요합니다.
<a name="collapsible-section-4"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListJobUpgradeAnalyses"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:job/jobName"
      ]
    }
  ]
}
```

------

#### 분석의 변경 사항을 수락하고 작업을 업그레이드하려면 다음 권한이 필요합니다.
<a name="collapsible-section-5"></a>

### AWS KMS 정책
<a name="auto-upgrade-kms-policy"></a>

 분석을 시작할 때 사용자 지정 AWS KMS 키를 전달하려면 다음 섹션을 참조하여 AWS KMS 키에 대한 적절한 권한을 구성하세요.

#### AWS KMS 키를 사용하여 결과 아티팩트 암호화 구성:
<a name="w2aac37b7c20c13c13b5b5"></a>

 이 정책을 통해 AWS KMS 키에 대한 암호화 및 복호화 권한을 모두 보유합니다.

```
{
    "Effect": "Allow",
    "Principal":{
        "AWS": "<IAM Customer caller ARN>"
    },
    "Action": [
      "kms:Decrypt",
      "kms:GenerateDataKey",
    ],
    "Resource": "<key-arn-passed-on-start-api>"
}
```

## 업그레이드 분석 실행 및 업그레이드 스크립트 적용
<a name="auto-upgrade-procedure"></a>

 업그레이드 분석을 실행할 수 있습니다. 그러면 **작업** 보기에서 선택한 작업에서 업그레이드 계획이 생성됩니다.

1.  **작업**에서 AWS Glue 2.0 작업을 선택한 다음, **작업** 메뉴에서 **업그레이드 분석 실행**을 선택합니다.  
![\[스크린샷에서는 작업 메뉴를 통해 AI를 사용하는 업그레이드 분석을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/upgrade-analysis-run-action-menu.png)

1.  모달에서 생성된 업그레이드 계획을 **결과 경로**에 저장할 경로를 선택하세요. 액세스하고 쓸 수 있는 Amazon S3 버킷이어야 합니다.  
![\[스크린샷에서는 완료된 업그레이드 분석을 보여줍니다. 업그레이드된 스크립트 적용 버튼이 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/upgrade-analysis-configuration-options.png)

1.  필요한 경우 다음과 같은 추가 옵션을 구성하세요.
   +  **실행 구성** - 선택 사항: 실행 구성은 업그레이드 분석 중에 수행된 검증 실행의 다양한 측면을 사용자 지정할 수 있는 선택적 설정입니다. 이 구성은 업그레이드된 스크립트를 실행하는 데 사용되며 여기에서 컴퓨팅 환경 속성(작업자 유형, 작업자 수 등)을 선택할 수 있습니다. 변경 사항을 검토 및 수락하고 프로덕션 환경에 적용하기 전에 비프로덕션 개발자 계정을 사용하여 샘플 데이터세트에 대한 검증을 실행해야 합니다. 실행 구성에는 다음과 같은 사용자 지정 가능한 파라미터가 포함됩니다.
     + 작업자 유형: 검증 실행에 대해 사용할 작업자 유형을 지정하여 요구 사항에 따라 적절한 컴퓨팅 리소스를 선택할 수 있습니다.
     + 작업자 수: 검증 실행에 대해 프로비저닝할 작업자 수를 정의하여 워크로드 요구 사항에 따라 리소스 규모를 조정할 수 있습니다.
     + 작업 제한 시간(분): 이 파라미터를 사용하면 검증 실행의 시간 제한을 설정할 수 있으므로 지정된 기간 후에 작업이 종료되어 과도한 리소스 소비를 방지할 수 있습니다.
     + 보안 구성: 검증 실행 중에 데이터와 리소스를 보호하도록 암호화 및 액세스 제어와 같은 보안 설정을 구성할 수 있습니다.
     + 추가 작업 파라미터: 필요한 경우 새 작업 파라미터를 추가하여 검증 실행을 위한 실행 환경을 추가로 사용자 지정할 수 있습니다.

      실행 구성을 활용하여 특정 요구 사항에 맞게 검증 실행을 조정할 수 있습니다. 예를 들어 더 작은 데이터세트를 사용하도록 검증 실행을 구성할 수 있습니다. 그러면 분석을 더 빠르게 완료하고 비용을 최적화할 수 있습니다. 이 접근 방식을 사용하면 검증 단계 중에 리소스 사용률과 관련 비용을 최소화하면서 업그레이드 분석을 효율적으로 수행할 수 있습니다.
   +  **암호화 구성** - 선택 사항: 
     + **업그레이드 아티팩트 암호화 활성화**: 결과 경로에 데이터를 쓸 때 저장 데이터 암호화를 활성화합니다. 업그레이드 아티팩트를 암호화하지 않으려면 이 옵션을 선택하지 않은 상태로 둡니다.

1.  **실행**을 선택하여 업그레이드 분석을 시작하세요. 분석이 실행되는 동안 **업그레이드 분석** 탭에서 결과를 볼 수 있습니다. 분석 세부 정보 창에는 분석에 대한 정보와 업그레이드 아티팩트에 대한 링크가 표시됩니다.
   +  **결과 경로** - 결과 요약 및 업그레이드 스크립트가 저장되는 위치입니다.
   +  **Amazon S3에서의 업그레이드된 스크립트** - Amazon S3에서 업그레이드 스크립트 위치. 업그레이드를 적용하기 전에 스크립트를 볼 수 있습니다.
   +  **Amazon S3에서의 업그레이드 요약** - Amazon S3에서 업그레이드 요약 위치. 업그레이드를 적용하기 전에 업그레이드 요약을 볼 수 있습니다.

1.  업그레이드 분석이 완료되면 **업그레이드된 스크립트 적용**을 선택하여 업그레이드 스크립트를 적용하여 작업을 자동으로 업그레이드할 수 있습니다.

    적용 후에는 AWS Glue 버전이 4.0으로 업데이트됩니다. **스크립트** 탭에서 새 스크립트를 볼 수 있습니다.  
![\[스크린샷에서는 완료된 업그레이드 분석을 보여줍니다. 업그레이드된 스크립트 적용 버튼이 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/upgrade-analysis-analysis-details-preview.png)

## 업그레이드 요약 이해
<a name="auto-upgrade-analysis-summary"></a>

 이 예제에서는 AWS Glue 작업을 버전 2.0에서 버전 4.0으로 업그레이드하는 프로세스를 보여줍니다. 샘플 작업은 Amazon S3 버킷에서 제품 데이터를 읽고 Spark SQL을 사용하여 여러 변환을 데이터에 적용한 다음, 변환된 결과를 Amazon S3 버킷에 다시 저장합니다.

### 원본 코드(AWS Glue 2.0) - 업그레이드 전
<a name="w2aac37b7c20c21b5b1"></a>

```
from awsglue.transforms import *
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from pyspark.sql.types import *
from pyspark.sql.functions import *
from awsglue.job import Job
import json
from pyspark.sql.types import StructType

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)

gdc_database = "s3://aws-glue-scripts-us-east-1-gamma/demo-database/"
schema_location = (
    "s3://aws-glue-scripts-us-east-1-gamma/DataFiles/"
)

products_schema_string = spark.read.text(
    f"{schema_location}schemas/products_schema"
).first()[0]

product_schema = StructType.fromJson(json.loads(products_schema_string))

products_source_df = (
    spark.read.option("header", "true")
    .schema(product_schema)
    .option(
        "path",
        f"{gdc_database}products/",
    )
    .csv(f"{gdc_database}products/")
)

products_source_df.show()
products_temp_view_name = "spark_upgrade_demo_product_view"
products_source_df.createOrReplaceTempView(products_temp_view_name)

query = f"select {products_temp_view_name}.*, format_string('%0$s-%0$s', category, subcategory) as unique_category from {products_temp_view_name}"
products_with_combination_df = spark.sql(query)
products_with_combination_df.show()

products_with_combination_df.createOrReplaceTempView(products_temp_view_name)
product_df_attribution = spark.sql(
    f"""
SELECT *,
unbase64(split(product_name, ' ')[0]) as product_name_decoded,
unbase64(split(unique_category, '-')[1]) as subcategory_decoded
FROM {products_temp_view_name}
"""
)
product_df_attribution.show()


product_df_attribution.write.mode("overwrite").option("header", "true").option(
    "path", f"{gdc_database}spark_upgrade_demo_product_agg/"
).saveAsTable("spark_upgrade_demo_product_agg", external=True)

spark_upgrade_demo_product_agg_table_df = spark.sql(
    f"SHOW TABLE EXTENDED in default like 'spark_upgrade_demo_product_agg'"
)
spark_upgrade_demo_product_agg_table_df.show()
job.commit()
```

### 새 코드(Glue 4.0) - 업그레이드 후
<a name="upgrade-analysis-example-new-code-glue-4"></a>

```
from awsglue.transforms import *
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from pyspark.sql.types import *
from pyspark.sql.functions import *
from awsglue.job import Job
import json
from pyspark.sql.types import StructType

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
# change 1
spark.conf.set("spark.sql.adaptive.enabled", "false")
# change 2
spark.conf.set("spark.sql.legacy.pathOptionBehavior.enabled", "true")
job = Job(glueContext)

gdc_database = "s3://aws-glue-scripts-us-east-1-gamma/demo-database/"
schema_location = (
    "s3://aws-glue-scripts-us-east-1-gamma/DataFiles/"
)

products_schema_string = spark.read.text(
    f"{schema_location}schemas/products_schema"
).first()[0]

product_schema = StructType.fromJson(json.loads(products_schema_string))

products_source_df = (
    spark.read.option("header", "true")
    .schema(product_schema)
    .option(
        "path",
        f"{gdc_database}products/",
    )
    .csv(f"{gdc_database}products/")
)

products_source_df.show()
products_temp_view_name = "spark_upgrade_demo_product_view"
products_source_df.createOrReplaceTempView(products_temp_view_name)

# change 3
query = f"select {products_temp_view_name}.*, format_string('%1$s-%1$s', category, subcategory) as unique_category from {products_temp_view_name}"
products_with_combination_df = spark.sql(query)
products_with_combination_df.show()

products_with_combination_df.createOrReplaceTempView(products_temp_view_name)
# change 4
product_df_attribution = spark.sql(
    f"""
SELECT *,
try_to_binary(split(product_name, ' ')[0], 'base64') as product_name_decoded,
try_to_binary(split(unique_category, '-')[1], 'base64') as subcategory_decoded
FROM {products_temp_view_name}
"""
)
product_df_attribution.show()


product_df_attribution.write.mode("overwrite").option("header", "true").option(
    "path", f"{gdc_database}spark_upgrade_demo_product_agg/"
).saveAsTable("spark_upgrade_demo_product_agg", external=True)

spark_upgrade_demo_product_agg_table_df = spark.sql(
    f"SHOW TABLE EXTENDED in default like 'spark_upgrade_demo_product_agg'"
)
spark_upgrade_demo_product_agg_table_df.show()
job.commit()
```

### 분석 요약 설명
<a name="upgrade-analysis-explanation-summary"></a>

![\[스크린샷에서는 업그레이드 분석 요약을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/upgrade-analysis-explanation-summary.png)


 요약에 따르면 스크립트를 AWS Glue 2.0에서 AWS Glue 4.0으로 업그레이드하기 위해 AWS Glue에서 제안하는 네 가지 변경 사항이 있습니다.

1.  **Spark SQL 구성(spark.sql.adaptive.enabled)**: 이 변경 사항은 Spark SQL 적응형 쿼리 실행을 위한 새 기능으로 애플리케이션 동작을 복원합니다. Spark 3.2부터 도입됩니다. 이 구성 변경을 검사하고 기본 설정에 따라 추가로 활성화하거나 비활성화할 수 있습니다.

1.  **DataFrame API 변경**: 경로 옵션은 `load()`와 같은 다른 DataFrameReader 작업과 공존할 수 없습니다. 이전 동작을 유지하기 위해 AWS Glue는 스크립트를 업데이트하여 새 SQL 구성**(spark.sql.legacy.pathOptionBehavior.enabled)**을 추가했습니다.

1.  **Spark SQL API 변경**: `format_string(strfmt, obj, ...)`에서 `strfmt`의 동작이 첫 번째 인수로 `0$`를 허용하지 않도록 업데이트되었습니다. 호환성을 보장하기 위해 AWS Glue는 대신 첫 번째 인수로 `1$`를 사용하도록 스크립트를 수정했습니다.

1.  **Spark SQL API 변경**: `unbase64` 함수에서는 잘못된 형식의 문자열 입력을 허용하지 않습니다. 이전 동작을 유지하기 위해 AWS Glue는 `try_to_binary` 함수를 사용하도록 스크립트를 업데이트했습니다.

## 진행 중인 업그레이드 분석 중지
<a name="auto-upgrade-stopping-analysis"></a>

 진행 중인 업그레이드 분석을 취소하거나 분석을 중지할 수 있습니다.

1.  **업그레이드 분석** 탭을 선택하세요.

1.  실행 중인 작업을 선택한 다음, **중지**를 선택하세요. 그러면 분석이 중지됩니다. 그런 다음, 동일한 작업에서 다른 업그레이드 분석을 실행할 수 있습니다.  
![\[스크린샷에서는 작업이 선택된 업그레이드 분석 탭을 보여줍니다. 작업이 아직 실행 중입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/upgrade-analysis-tab.png)

## 고려 사항
<a name="upgrade-analysis-considerations"></a>

 Spark 업그레이드를 사용하기 시작할 때 서비스의 최적 사용을 위해 고려할 몇 가지 중요한 측면이 있습니다.
+  **서비스 범위 및 제한 사항**: 현재 릴리스에서는 AWS Glue 버전 2.0에서 버전 5.0으로 PySpark 코드를 업그레이드하는 데 중점을 둡니다. 현재 서비스는 추가 라이브러리 종속 항목에 의존하지 않는 PySpark 코드를 처리합니다. AWS 계정에서 동시에 최대 10개의 작업에 대해 자동화된 업그레이드를 실행할 수 있으므로 시스템 안정성을 유지하면서 여러 작업을 효율적으로 업그레이드할 수 있습니다.
  +  PySpark 작업만 지원됩니다.
  +  업그레이드 분석은 24시간 후에 제한 시간이 초과됩니다.
  +  한 작업에 대해 한 번에 하나의 활성 업그레이드 분석만 실행할 수 있습니다. 계정 수준에서는 최대 10개의 활성 업그레이드 분석을 동시에 실행할 수 있습니다.
+  **업그레이드 프로세스 중 비용 최적화**: Spark 업그레이드는 생성형 AI를 사용하여 여러 반복을 통해 업그레이드 계획을 검증합니다. 이대 계정에서 각 반복이 AWS Glue 작업으로 실행되므로 비용 효율성을 위해 검증 작업 실행 구성을 최적화하는 것이 중요합니다. 이를 위해 업그레이드 분석을 시작할 때 다음과 같이 실행 구성을 지정하는 것이 좋습니다.
  +  비프로덕션 개발자 계정을 사용하고, Spark 업그레이드를 사용하는 검증에 대해 프로덕션 데이터를 나타내지만 크기가 더 작은 샘플 모의 데이터세트를 선택합니다.
  +  G.1X 작업자와 같은 적절한 크기의 컴퓨팅 리소스를 사용하고 샘플 데이터를 처리하기 위해 적절한 수의 작업자를 선택합니다.
  +  워크로드에 따라 리소스를 자동으로 조정하려면 해당하는 경우 AWS Glue 작업 오트 스케일링을 활성화합니다.

   예를 들어 프로덕션 작업에서 20G.2X 작업자를 사용하여 테라바이트 단위의 데이터를 처리하는 경우 검증을 위해 2G.2X 작업자를 사용하고 오토 스케일링이 활성화된 몇 기가바이트 단위의 대표 데이터를 처리하도록 업그레이드 작업을 구성할 수 있습니다.
+  **모범 사례**: 비프로덕션 작업으로 업그레이드 여정을 시작하는 것이 좋습니다. 이 접근 방식을 사용하면 업그레이드 워크플로를 숙지하고 서비스에서 다양한 유형의 Spark 코드 패턴을 처리하는 방법을 이해할 수 있습니다.
+  **경보 및 알림**: 작업에서 생성형 AI 업그레이드 기능을 사용하는 경우 실패한 작업 실행에 대한 경보/알림이 꺼져 있는지 확인합니다. 업그레이드 프로세스 중에는 업그레이드된 아티팩트가 제공되기 전에 계정에서 최대 10회의 작업 실행에 실패할 수 있습니다.
+  **이상 탐지 규칙**: 업그레이드 중인 작업에서 이상 탐지 규칙도 끕니다. 업그레이드 검증이 진행되는 동안 중간 작업 실행 중에 출력 폴더에 기록된 데이터가 예상되는 형식이 아닐 수 있습니다.
+  **멱등성 작업에 업그레이드 분석 사용**: 멱등성 작업에 업그레이드 분석을 사용하여 각 후속 검증 작업 실행 시도가 이전 시도와 유사하고 문제가 발생하지 않도록 합니다. 멱등성 작업은 동일한 입력 데이터로 여러 번 실행할 수 있는 작업이며 매번 동일한 출력을 생성합니다. AWS Glue에서 Apache Spark용 생성형 AI 업그레이드를 사용하는 경우 서비스는 검증 프로세스의 일부로 작업을 여러 번 반복합니다. 각 반복 중에 Spark 코드 및 구성을 변경하여 업그레이드 계획을 검증합니다. Spark 작업이 멱등성이 아닌 경우 동일한 입력 데이터로 여러 번 실행하면 문제가 발생할 수 있습니다.

## 지원되는 리전
<a name="upgrade-analysis-supported-regions"></a>

Apache Spark용 생성형 AI 업그레이드를 사용할 수 있는 리전은 다음과 같습니다.
+ **아시아 태평양**: 도쿄(ap-northeast-1), 서울(ap-northeast-2), 뭄바이(ap-south-1), 싱가포르(ap-southeast-1), 시드니(ap-southeast-2)
+ **북미**: 캐나다(ca-central-1)
+ **유럽**: 프랑크푸르트(eu-central-1), 스톡홀름(eu-north-1), 아일랜드(eu-west-1), 런던(eu-west-2), 파리(eu-west-3)
+ **남아메리카**: 상파울루(sa-east-1)
+ **미국**: 버지니아 북부(us-east-1), 오하이오(us-east-2), 오리건(us-west-2)

## Spark 업그레이드의 교차 리전 추론
<a name="w2aac37b7c20c37"></a>

 Spark 업그레이드는 Amazon Bedrock으로 구동되며 교차 리전 추론(CRIS)을 활용합니다. CRIS를 사용하면 Spark 업그레이드는 추론 요청을 처리하고 사용 가능한 컴퓨팅 리소스 및 모델 가용성을 극대화하며 최상의 고객 경험을 제공하기 위해 사용자의 지역 내에서 최적의 리전을 자동으로 선택합니다([여기](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html)에서 자세한 설명 참조). 교차 리전 추론을 사용하는 데 드는 추가 비용은 없습니다.

 교차 리전 추론 요청은 데이터가 원래 상주하는 지역의 일부인 AWS 리전 내에 보관됩니다. 예를 들어, 미국 내에서 이루어진 요청은 미국의 AWS 리전 내에 보관됩니다. 데이터는 기본 리전에만 저장되어 있지만 교차 리전 추론을 사용하는 경우 입력 프롬프트와 출력 결과가 기본 리전 외부로 이동할 수 있습니다. 모든 데이터는 Amazon의 보안 네트워크를 통해 암호화되어 전송됩니다.

# AWS Glue에서 Spark 작업 사용
<a name="etl-jobs-section"></a>

AWS Glue에서 Spark ETL 작업에 대한 정보를 제공합니다.

**Topics**
+ [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md)
+ [AWS Glue Spark 및 PySpark 작업](spark_and_pyspark.md)
+ [AWS Glue 작업자 유형](worker-types.md)
+ [AWS Glue에서 스트리밍 ETL 작업](add-job-streaming.md)
+ [AWS Lake Formation FindMatches로 레코드 매칭](machine-learning.md)
+ [Apache Spark 프로그램을 AWS Glue로 마이그레이션](glue-author-migrate-apache-spark.md)

# AWS Glue 작업에서 작업 파라미터 사용
<a name="aws-glue-programming-etl-glue-arguments"></a>

AWS Glue 작업을 생성할 때, `Role` 및 `WorkerType`과 같은 몇 가지 표준 필드를 설정합니다. `Argument` 필드(콘솔의 **작업 파라미터**)를 통해 추가 구성 정보를 제공할 수 있습니다. 이 필드에서 이 주제에 나열된 인수(파라미터)를 AWS Glue 작업에 제공할 수 있습니다.

 AWS Glue 작업 API에 대한 자세한 내용은 [작업](aws-glue-api-jobs-job.md) 섹션을 참조하세요.

**참고**  
 작업 인수 크기는 최대 260KB로 제한됩니다. 인수 크기가 260KB보다 크면 검증 검사에서 오류가 발생합니다.



## 작업 파라미터 설정
<a name="w2aac37c11b8c11"></a>

**Job Parameters**(작업 파라미터) 제목 아래의 **Job details**(작업 세부 정보) 탭에서 콘솔을 통해 작업을 구성할 수 있습니다. 작업에서 `DefaultArguments` 또는 `NonOverridableArguments`를 설정하거나 작업 실행에서 `Arguments`를 설정하여 AWS CLI를 통해 작업을 구성할 수도 있습니다. 작업에 설정된 인수는 작업이 실행될 때마다 전달되지만, 작업 실행에 설정된 인수는 해당 개별 실행에 대해서만 전달됩니다.

예를 들어 다음은 작업 파라미터를 설정하기 위해 `--arguments`를 사용하여 작업을 실행하는 구문입니다.

```
$ aws glue start-job-run --job-name "CSV to CSV" --arguments='--scriptLocation="s3://my_glue/libraries/test_lib.py"'
```

## 작업 파라미터 액세스
<a name="w2aac37c11b8c13"></a>

AWS Glue 스크립트를 작성할 때 자체 코드의 동작을 변경하기 위해 작업 파라미터 값에 액세스하려고 합니다. 라이브러리에서 이를 수행하기 위한 도우미 메서드가 제공됩니다. 이러한 메서드는 작업 파라미터 값을 재정의하는 작업 실행 파라미터 값을 해석합니다. 여러 위치에 설정된 파라미터를 해석하는 경우 `NonOverridableArguments` 작업은 `Arguments` 작업 실행을 재정의하고 이 작업 실행은 `DefaultArguments` 작업을 재정의합니다.

**Python에서:**

Python 작업에서는 `getResolvedParameters` 함수가 제공됩니다. 자세한 내용은 [`getResolvedOptions`를 사용한 파라미터 액세스](aws-glue-api-crawler-pyspark-extensions-get-resolved-options.md) 섹션을 참조하세요. 작업 파라미터는 `sys.argv` 변수에서 사용할 수 있습니다.

**Scala에서:**

Scala 작업에서는 `GlueArgParser` 객체가 제공됩니다. 자세한 내용은 [AWS Glue Scala GlueArgParser API](glue-etl-scala-apis-glue-util-glueargparser.md) 섹션을 참조하세요. 작업 파라미터는 `sysArgs` 변수에서 사용할 수 있습니다.

## 작업 파라미터 참조
<a name="job-parameter-reference"></a>

**AWS Glue에서는 작업 및 작업 실행에 대한 스크립트 환경을 설정하는 데 사용할 수 있는 다음과 같은 인수 이름을 인식합니다.**

**`--additional-python-modules`**  
 설치할 Python 패키지 세트를 나타내는 쉼표로 구분된 목록입니다. PyPI에서 패키지를 설치하거나 사용자 지정 배포를 제공할 수 있습니다. PyPI 패키지 항목은 `package==version` 형식(대상 패키지의 PyPI 이름 및 버전)입니다. 사용자 지정 배포 항목은 배포에 대한 S3 경로입니다.  
항목은 Python 버전 일치를 사용하여 패키지와 버전을 일치시킵니다. 즉, 2개의 등호(예: `==`)를 사용해야 합니다. 다른 버전 일치 연산자도 있습니다. 자세한 내용을 알아보려면 [PEP 440](https://peps.python.org/pep-0440/#version-matching)을 참조하세요.  
모듈 설치 옵션을 `pip3`에 전달하려면 [--python-modules-installer-option](#python-modules-installer-option) 파라미터를 사용합니다.

**`--auto-scale-within-microbatch`**  
기본값은 true입니다. 이 파라미터는 스트리밍 데이터를 일련의 마이크로 배치로 처리하는 AWS Glue 스트리밍 작업에만 사용할 수 있으며, 이때 Auto Scaling을 활성화해야 합니다. 이 값을 false로 설정한 경우 완료된 마이크로 배치에 대한 배치 지속 시간의 지수 이동 평균을 계산하고 이 값을 창 크기와 비교하여 실행기 수의 스케일 업 또는 스케일 다운 여부를 결정합니다. 마이크로 배치가 완료될 때만 규모가 조정됩니다. 이 값을 true로 설정한 경우 마이크로 배치 중에 Spark 작업 수가 30초 동안 동일하게 유지되거나 현재 배치 처리가 창 크기보다 클 때 스케일 업됩니다. 실행기가 60초 넘게 유휴 상태이거나 배치 지속 시간의 지수 이동 평균이 낮으면 실행기 수가 감소합니다.

**`--class`**  
Scala 스크립트 진입점으로써 Scala 클래스. 이는 `--job-language`가 `scala`로 설정된 경우에만 적용됩니다.

**`--continuous-log-conversionPattern`**  
연속 로깅에 대해 활성화된 작업의 사용자 지정 변환 로그 패턴을 지정합니다. 변환 패턴은 드라이버 로그와 실행기 로그에만 적용됩니다. AWS Glue 진행률 표시줄에는 영향을 주지 않습니다.

**`--continuous-log-logGroup`**  
연속 로깅에 사용되는 활성화된 작업의 사용자 정의 Amazon CloudWatch 로그 그룹 이름을 지정합니다.

**`--continuous-log-logStreamPrefix`**  
 연속 로깅에 사용되는 작업의 사용자 정의 CloudWatch 로그 스트림 접두사를 지정합니다.

**`--customer-driver-env-vars` 및 `--customer-executor-env-vars`**  
이러한 파라미터는 각 작업자(드라이버 또는 실행자)에 대해 각각 운영 체제의 환경 변수를 설정합니다. AWS Glue 위에 플랫폼과 사용자 지정 프레임워크를 구축할 때 이러한 파라미터를 사용하면 사용자가 그 위에 작업을 작성할 수 있습니다. 이 두 플래그를 활성화하면 작업 스크립트 자체에 동일한 논리를 삽입하지 않고도 드라이버와 실행기에 각각 다른 환경 변수를 설정할 수 있습니다.  
**사용 예**  
다음은 이러한 파라미터를 사용하는 예제입니다.

```
"—customer-driver-env-vars", "CUSTOMER_KEY1=VAL1,CUSTOMER_KEY2=\"val2,val2 val2\"",
"—customer-executor-env-vars", "CUSTOMER_KEY3=VAL3,KEY4=VAL4"
```
작업 실행 인수에서 이를 설정하는 것은 다음 명령을 실행하는 것과 동일합니다.  
드라이버에서:  
+ export CUSTOMER\$1KEY1=VAL1
+ export CUSTOMER\$1KEY2="val2,val2 val2"
실행기에서:  
+ export CUSTOMER\$1KEY3=VAL3
그런 다음 작업 스크립트 자체에서 `os.environ.get("CUSTOMER_KEY1")` 또는 `System.getenv("CUSTOMER_KEY1")`을 사용하여 환경 변수를 검색할 수 있습니다.  
**적용된 구문**  
환경 변수를 정의할 때는 다음 표준을 준수하세요.
+ 각 키에는 `CUSTOMER_ prefix`가 있어야 합니다.

  예를 들어 `"CUSTOMER_KEY3=VAL3,KEY4=VAL4"`의 경우 `KEY4=VAL4`는 무시되고 설정되지 않습니다.
+ 각 키와 값 쌍은 단일 쉼표로 구분되어야 합니다.

  예: `"CUSTOMER_KEY3=VAL3,CUSTOMER_KEY4=VAL4"`
+ ‘값’에 공백이나 쉼표가 있는 경우 따옴표 안에 정의해야 합니다.

  예: `CUSTOMER_KEY2=\"val2,val2 val2\"`
이 구문은 bash 환경 변수 설정의 표준에 가깝게 모델링합니다.

**`--datalake-formats` **  
AWS Glue 3.0 이상 버전에서 지원됨  
사용할 데이터 레이크 프레임워크를 지정합니다. AWS Glue는 지정한 프레임워크에 필요한 JAR 파일을 `classpath`에 추가합니다. 자세한 내용은 [AWS Glue ETL 작업에서 데이터 레이크 프레임워크 사용](aws-glue-programming-etl-datalake-native-frameworks.md) 섹션을 참조하세요.  
다음 값 중 하나 이상을 쉼표로 구분하여 지정할 수 있습니다.  
+ `hudi`
+ `delta`
+ `iceberg`
예를 들어 다음 인수를 전달하여 세 프레임워크를 모두 지정합니다.  

```
'--datalake-formats': 'hudi,delta,iceberg'
```

**`--disable-proxy-v2`**  
 서비스 프록시를 비활성화하여 Amazon S3, CloudWatch, VPC를 통해 스크립트에서 시작하는 AWS Glue에 대한 AWS 서비스 호출을 허용합니다. 자세한 내용은 [ VPC를 통과하도록 AWS 호출 구성 ](https://docs.aws.amazon.com/glue/latest/dg/connection-VPC-disable-proxy.html)을 참조하세요. 서비스 프록시를 비활성화하려면 이 파라미터 값을 `true`로 설정합니다.

**`--enable-auto-scaling`**  
이 값을 `true`로 설정할 경우 Auto Scaling과 작업자별 청구를 사용하는 기능을 켭니다.

**`--enable-continuous-cloudwatch-log`**  
AWS Glue 작업에 대한 실시간 연속 로깅을 사용합니다. CloudWatch에서 실시간 Apache Spark 작업 로그를 볼 수 있습니다.

**`--enable-continuous-log-filter`**  
지속 로깅을 활성화하여 작업을 생성하거나 편집할 때 표준 필터(`true`) 또는 필터 없음(`false`)을 지정합니다. 표준 필터를 선택하면 유용하지 않은 Apache Spark 드라이버/실행기 및 Apache Hadoop YARN 하트비트 로그 메시지가 제거됩니다. 필터 없음을 선택하면 모든 로그 메시지가 제공됩니다.

**`--enable-glue-datacatalog`**  
AWS Glue 데이터 카탈로그를 Apache Spark Hive 메타스토어로 사용할 수 있습니다. 이 기능을 활성화하려면 값을 `true`로 설정합니다.

**`--enable-job-insights`**  
AWS Glue 작업 실행 인사이트로 추가 오류 분석 모니터링을 활성화합니다. 자세한 내용은 [AWS Glue 작업 실행 인사이트를 사용한 모니터링](monitor-job-insights.md)을 참조하세요. 기본적으로 이 값은 `true`로 설정되고 작업 실행 인사이트가 활성화됩니다.  
이 옵션은 AWS Glue 버전 2.0과 3.0에서 사용할 수 있습니다.

**`--enable-lakeformation-fine-grained-access`**  
AWS Glue 작업에 대한 세분화된 액세스 제어를 활성화합니다. 자세한 내용은 [세분화된 액세스 제어를 위해 AWS Lake Formation과 함께 AWS Glue 사용](security-lf-enable.md) 섹션을 참조하세요.

**`--enable-metrics`**  
이 작업 실행을 위해 작업 프로파일링용 측정치 수집을 활성화합니다. 이러한 지표는 AWS Glue콘솔 및 Amazon CloudWatch 콘솔에서 사용할 수 있습니다. 이 파라미터의 값은 관련이 없습니다. 이 기능을 활성화하려면 이 파라미터에 어떤 값이든 제공할 수 있지만 명확성을 위해 `true`를 권장합니다. 이 기능을 비활성화하려면 작업 구성에서 이 파라미터를 제거하세요.

**`--enable-observability-metrics`**  
 AWS 콘솔 및 Amazon CloudWatch 콘솔의 작업 실행 모니터링 페이지에서 각 작업 실행 내부에서 일어나는 일에 대한 인사이트를 생성하는 일련의 관찰성 지표를 사용할 수 있습니다. 이 기능을 활성화하려면 이 파라미터의 값을 true로 설정합니다. 이 기능을 비활성화하려면 `false`로 설정하거나 작업 구성에서 이 파라미터를 제거하세요.

**`--enable-rename-algorithm-v2`**  
EMRFS 이름 바꾸기 알고리즘 버전을 버전 2로 설정합니다. Spark 작업에서 동적 파티션 덮어쓰기 모드를 사용하는 경우 중복 파티션이 생성될 가능성이 있습니다. 예를 들어, `s3://bucket/table/location/p1=1/p1=1`과 같은 중복 파티션으로 끝날 수 있습니다. 여기서 P1은 덮어쓰는 파티션입니다. 이름 바꾸기 알고리즘 버전 2가 이 문제를 해결합니다.  
이 옵션은 AWS Glue 버전 1.0에서만 사용할 수 있습니다.

**`--enable-s3-parquet-optimized-committer`**  
Amazon S3에 Parquet 데이터를 쓸 수 있도록 EMRFS S3 최적화 커미터를 사용합니다. AWS Glue 작업을 생성하거나 업데이트할 때 AWS Glue 콘솔을 통해 파라미터/값 페어를 제공할 수 있습니다. 값을 **true**로 설정하면 커미터가 활성화됩니다. 기본적으로 이 플래그는 AWS Glue 3.0에서 켜지고 AWS Glue 2.0에서는 꺼집니다.  
자세한 내용은 [EMRFS S3 최적화 커미터 사용](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html)을 참조하세요.

**`--enable-spark-ui`**  
`true`(으)로 설정하면 Spark UI를 사용하여 AWS Glue ETL 작업을 모니터링하고 디버그하는 기능을 켭니다.

**`--executor-cores`**  
병렬로 실행할 수 있는 Spark 작업 수입니다. 이 옵션은 AWS Glue 3.0 이상에서 지원됩니다. 값은 작업자 유형에 있는 vCPU 수의 2배(`G.1X`의 경우 8, `G.2X`의 경우 16, `G.4X`의 경우 32, `G.8X`의 경우 64, `G.12X`의 경우 96, `G.16X`의 경우 128, `R.1X`의 경우 8, `R.2X`의 경우 16, `R.4X`의 경우 32, `R.8X`의 경우 64)를 초과해서는 안 됩니다. 이 구성을 업데이트할 때는 주의해야 합니다. 병렬 처리 성능을 높이면 메모리 및 디스크 부담이 커질 뿐 아니라 소스 및 대상 시스템에서 제한이 발생할 수 있으므로 작업 성능에 영향을 미칠 수 있습니다(예: Amazon RDS에서 동시 연결이 늘어남).

**`--extra-files`**  
AWS Glue가 스크립트를 실행하기 전에 드라이버 노드의 스크립트 작업 디렉터리에 복사하는 구성 파일과 같은 추가 파일에 대한 Amazon S3 경로입니다. 여러 값은 쉼표(`,`)로 구분된 완전한 경로여야 합니다. 값은 개별 파일 또는 디렉터리 위치일 수 있습니다. 이 옵션은 Python 쉘 작업 유형에서 지원되지 않습니다.

**`--extra-jars`**  
Amazon S3는 AWS Glue가 드라이버 및 실행자에 복사하는 추가 파일에 대한 경로입니다. AWS 또한 Glue는 스크립트를 실행하기 전에 이러한 파일을 Java 클래스 경로에 추가합니다. 여러 값은 쉼표(`,`)로 구분된 완전한 경로여야 합니다. 확장자는 `.jar`와(과) 같을 필요는 없습니다

**`--extra-py-files`**  
스크립트를 실행하기 전에 AWS Glue가 드라이버 노드의 Python 경로에 추가하는 추가 Python 모듈에 대한 Amazon S3 경로입니다. 여러 값은 쉼표(`,`)로 구분된 완전한 경로여야 합니다. 개별 파일만 지원되면 디렉터리 경로는 지원되지 않습니다.

**`--job-bookmark-option`**  
작업 북마크 동작을 제어합니다. 다음 옵션 값을 설정할 수 있습니다.    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html)
예를 들어, 작업 북마크를 활성화하려면 다음 인수를 전달합니다.  

```
'--job-bookmark-option': 'job-bookmark-enable'
```

**`--job-language`**  
스크립트 프로그래밍 언어. 이 값은 `scala` 또는 `python`이어야 합니다. 이 파라미터가 존재하지 않을 경우 기본값은 `python`입니다.

**`--python-modules-installer-option`**  
[--additional-python-modules](#additional-python-modules)로 모듈을 설치할 때 `pip3`에 전달할 옵션을 정의하는 일반 텍스트 문자열입니다. 명령줄에서와 같이 공백으로 구분되고 접두사가 대시로 된 옵션을 제공합니다. 사용에 대한 자세한 내용을 알아보려면 [pip를 사용하여 AWS Glue 2.0 이상에 추가 Python 모듈 설치](aws-glue-programming-python-libraries.md#addl-python-modules-support)를 참조하세요.  
Python 3.9를 사용하는 경우 AWS Glue 작업에는 이 옵션이 지원되지 않습니다.

**`--scriptLocation`**  
ETL 스크립트가 있는 Amazon Simple Storage Service(Amazon S3) 위치입니다(`s3://path/to/my/script.py` 형식). 이 파라미터는 `JobCommand` 객체에 설정된 스크립트 위치를 재정의합니다.

**`--spark-event-logs-path`**  
Amazon S3 경로를 지정합니다. Spark UI 모니터링 기능을 사용할 때 AWS Glue는 Spark UI 이벤트를 저장하기 위한 임시 디렉터리로 사용할 수 있는 버킷으로 30초마다 이 Amazon S3 경로에 대한 Spark 이벤트 로그를 플러시합니다.

**`--TempDir`**  
작업의 임시 디렉터리로 사용될 수 있는 버킷에 대한 Amazon S3 경로를 지정합니다.  
예를 들어, 임시 디렉터리를 설정하려면 다음 인수를 전달합니다.  

```
'--TempDir': 's3-path-to-directory'
```
리전에 버킷이 아직 없는 경우 AWS Glue에서 작업에 대한 임시 버킷을 생성합니다. 이 버킷은 퍼블릭 액세스를 허용할 수 있습니다. Amazon S3에서 버킷을 수정하여 퍼블릭 액세스 차단을 설정하거나 나중에 해당 리전의 모든 작업이 완료된 후 버킷을 삭제할 수 있습니다.

**`--use-postgres-driver`**  
이 값을 `true`로 설정하면 Amazon Redshift JDBC 드라이버와의 충돌을 피하기 위해 클래스 경로에서 Postgres JDBC 드라이버의 우선순위를 지정합니다. 이 옵션은 AWS Glue 버전 2.0에서만 사용할 수 있습니다.

**`--user-jars-first`**  
이 값을 `true`로 설정하면 클래스 경로에 있는 고객의 추가 JAR 파일의 우선순위를 지정합니다. 이 옵션은 AWS Glue 버전 2.0 이상에서만 사용할 수 있습니다.

**`--conf`**  
Spark 구성 파라미터를 제어합니다. 고급 사용 사례에 해당됩니다.

**`--encryption-type`**  
레거시 파라미터. 보안 구성을 사용하여 해당 동작을 구성해야 합니다. 보안 구성에 대한 자세한 내용은 [AWS Glue에서 작성한 데이터 암호화](encryption-security-configuration.md) 섹션을 참조하세요.

AWS다음 인수는 Glue에서 내부적으로 사용하므로 절대 사용해서는 안 됩니다.
+ `--debug` - AWS Glue 내부에서 사용됩니다. 설정해서는 안 됩니다.
+ `--mode` - AWS Glue 내부에서 사용됩니다. 설정해서는 안 됩니다.
+ `--JOB_NAME` - AWS Glue 내부에서 사용됩니다. 설정해서는 안 됩니다.
+ `--endpoint` - AWS Glue 내부에서 사용됩니다. 설정해서는 안 됩니다.



## 
<a name="w2aac37c11b8c17"></a>

 AWS Glue에서는 사이트별 사용자 지정을 수행하기 위해 `sitecustomize`을(를) 사용하여 Python `site` 모듈에서 환경을 부트스트래핑할 수 있도록 지원합니다. 자체 초기화 함수의 부트스트래핑은 고급 사용 사례에만 권장되며, AWS Glue 4.0에서 효과가 가장 뛰어납니다.

 환경 변수 접두사(`GLUE_CUSTOMER`)는 고객 전용으로 예약되어 있습니다.

# AWS Glue Spark 및 PySpark 작업
<a name="spark_and_pyspark"></a>

AWS Glue은(는) Spark 및 PySpark 작업을 지원합니다. Spark 작업은 AWS Glue에서 관리하는 Apache Spark 환경에서 실행됩니다. 데이터를 배치로 처리합니다. 스트리밍 ETL 작업은 데이터 스트림에 대해 ETL을 수행한다는 점을 제외하고 Spark 작업과 유사합니다. 이는 Apache Spark Structured Streaming 프레임워크를 사용합니다. 스트리밍 ETL 작업에 일부 Spark 작업 기능을 사용할 수 없습니다.

다음 섹션에서는 AWS Glue Spark 및 PySpark 작업에 관한 정보를 제공합니다.

**Topics**
+ [AWS Glue에서 Spark 작업에 대한 작업 속성 구성](add-job.md)
+ [AWS Glue 콘솔에서 Spark 스크립트 편집](edit-script-spark.md)
+ [작업(레거시)](console-edit-script.md)
+ [처리된 데이터를 작업 북마크로 추적](monitor-continuations.md)
+ [Spark 셔플 데이터 저장](monitor-spark-shuffle-manager.md)
+ [AWS Glue Spark 작업 모니터링](monitor-spark.md)
+ [AWS Glue에서 Apache Spark에 대한 생성형 AI 문제 해결](troubleshoot-spark.md)
+ [AWS Glue에서 구체화된 뷰 사용](materialized-views.md)

# AWS Glue에서 Spark 작업에 대한 작업 속성 구성
<a name="add-job"></a>

작업을 AWS Glue 콘솔에서 정의할 경우 AWS Glue 런타임 환경을 제어하기 위한 속성 값을 제공합니다.

## Spark 작업에 대한 작업 속성 정의
<a name="create-job"></a>

다음 목록에서는 Spark 작업의 속성을 설명합니다. Python 셸 작업의 속성은 [Python 셸 작업에 대한 작업 속성 정의](add-job-python.md#create-job-python-properties) 단원을 참조하세요. 스트리밍 ETL 작업의 속성은 [스트리밍 ETL 작업에 대한 작업 속성 정의](add-job-streaming.md#create-job-streaming-properties) 단원을 참조하세요.

속성은 AWS Glue 콘솔의 [**작업 추가(Add job)**] 마법사에 나타나는 순서대로 나열됩니다.

**이름**  
최대 255자 길이의 UTF-8 문자열을 제공합니다.

**설명**  
최대 2,048자의 설명을 입력합니다(선택 사항).

**IAM 역할**  
작업을 실행하고 데이터 스토어에 액세스하는 데 사용되는 리소스에 대한 권한 부여용 IAM 역할을 지정합니다. AWS Glue 작업을 실행하는 권한에 대한 자세한 내용은 [AWS Glue의 Identity and Access Management](security-iam.md) 단원을 참조하세요.

**Type**  
ETL 작업의 유형입니다. 이는 선택한 데이터 소스 유형에 따라 자동으로 설정됩니다.  
+ **Spark**는 작업 명령 `glueetl`로 Apache Spark ETL 스크립트를 실행합니다.
+ **Spark Streaming**은 `gluestreaming` 작업 명령으로 Apache Spark 스트리밍 ETL 스크립트를 실행합니다. 자세한 내용은 [AWS Glue에서 스트리밍 ETL 작업](add-job-streaming.md) 섹션을 참조하세요.
+ **Python 쉘**에서 작업 명령 `pythonshell`로 Python 스크립트를 실행합니다. 자세한 내용은 [AWS Glue에서 Python 쉘 작업에 대한 작업 속성 구성](add-job-python.md) 섹션을 참조하세요.

**AWS Glue 버전**  
AWS Glue 버전이 다음 표에 지정된 대로 작업에 사용할 수 있는 Apache Spark 및 Python의 버전을 결정합니다.      
<a name="table-glue-versions"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/add-job.html)

**언어**  
ETL 스크립트의 코드는 작업 논리를 정의합니다. 이 스크립트는 Python 또는 Scala에 코딩될 수 있습니다. 작업이 실행하는 스크립트가 AWS Glue가 생성했는지 여러분이 제공했는지 선택할 수 있습니다. Amazon Simple Storage Service(Amazon S3)에서 스크립트 이름과 위치를 제공합니다. 경로의 스크립트 디렉터리와 동일한 이름의 파일이 없다는 것을 확인합니다. 스크립트 작성에 대한 자세한 내용은 [AWS Glue 프로그래밍 안내서](edit-script.md) 단원을 참조하세요.

**작업자 유형**  
다음 작업자 유형을 사용할 수 있습니다.  
AWS Glue 작업자에서 사용할 수 있는 리소스는 DPU 단위로 측정됩니다. DPU는 4 vCPU의 컴퓨팅 파워와 16GB 메모리로 구성된 프로세싱 파워의 상대적 측정값입니다.  
+ **G.025X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 84GB 디스크(약 34GB의 여유 공간)에서 0.25개의 DPU(vCPU 2개, 메모리 4GB)에 매핑됩니다. 볼륨이 낮은 스트리밍 작업에 이 작업자 유형을 사용하는 것이 좋습니다. 이 작업자 유형은 AWS Glue 버전 3.0 이상 스트리밍 작업에만 사용할 수 있습니다.
+ **G.1X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 94GB 디스크(약 44GB의 여유 공간)에서 1개의 DPU(vCPU 4개, 메모리 16GB)에 매핑됩니다. 대부분의 작업을 실행할 수 있는 확장 가능하고 비용 효율적인 방법을 제공하기 위해 데이터 변환, 조인, 쿼리와 같은 워크로드에서 이 작업자 유형을 사용하는 것이 좋습니다.
+ **G.2X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 138GB 디스크(약 78GB의 여유 공간)에서 2개의 DPU(vCPU 8개, 메모리 32GB)에 매핑됩니다. 대부분의 작업을 실행할 수 있는 확장 가능하고 비용 효율적인 방법을 제공하기 위해 데이터 변환, 조인, 쿼리와 같은 워크로드에서 이 작업자 유형을 사용하는 것이 좋습니다.
+ **G.4X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 256GB 디스크(약 230GB의 여유 공간)에서 4개의 DPU(vCPU 16개, 메모리 64GB)에 매핑됩니다. 워크로드에 가장 까다로운 변환, 집계, 조인 및 쿼리가 포함된 작업에서 이 작업자 유형을 사용하는 것이 좋습니다.
+ **G.8X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 512GB 디스크(약 485GB의 여유 공간)에서 8개의 DPU(vCPU 32개, 메모리 128GB)에 매핑됩니다. 워크로드에 가장 까다로운 변환, 집계, 조인 및 쿼리가 포함된 작업에서 이 작업자 유형을 사용하는 것이 좋습니다.
+ **G.12X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 768GB 디스크(약 741GB의 여유 공간)에서 12개의 DPU(vCPU 48개, 메모리 192GB)에 매핑됩니다. 상당한 컴퓨팅 용량이 필요한 대규모 리소스 집약적 워크로드가 있는 작업에는 이 작업자 유형을 사용하는 것이 좋습니다.
+ **G.16X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 1,024GB 디스크(약 996GB의 여유 공간)에서 16개의 DPU(vCPU 64개, 메모리 256GB)에 매핑됩니다. 최대 컴퓨팅 용량이 필요한 최대규모 리소스 집약적 워크로드가 있는 작업에는 이 작업자 유형을 사용하는 것이 좋습니다.
+ **R.1X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 메모리 최적화 구성을 사용하는 1개의 DPU에 매핑됩니다. 메모리 부족 오류가 자주 발생하거나 높은 메모리 대비 CPU 비율이 필요한 메모리 집약적 워크로드에는 이 작업자 유형을 사용하는 것이 좋습니다.
+ **R.2X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 메모리 최적화 구성을 사용하는 2개의 DPU에 매핑됩니다. 메모리 부족 오류가 자주 발생하거나 높은 메모리 대비 CPU 비율이 필요한 메모리 집약적 워크로드에는 이 작업자 유형을 사용하는 것이 좋습니다.
+ **R.4X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 메모리 최적화 구성을 사용하는 4개의 DPU에 매핑됩니다. 메모리 부족 오류가 자주 발생하거나 높은 메모리 대비 CPU 비율이 필요한 대규모 메모리 집약적 워크로드에는 이 작업자 유형을 사용하는 것이 좋습니다.
+ **R.8X** – 이 유형을 선택할 경우 **Number of workers**(작업자 수) 값도 제공합니다. 각 작업자는 메모리 최적화 구성을 사용하는 8개의 DPU에 매핑됩니다. 메모리 부족 오류가 자주 발생하거나 높은 메모리 대비 CPU 비율이 필요한 중대규모 메모리 집약적 워크로드에는 이 작업자 유형을 사용하는 것이 좋습니다.
**작업자 유형 사양**  
다음 표에는 사용 가능한 모든 G 작업자 유형에 대한 세부 사양이 나와 있습니다.    
**G 작업자 유형 사양**    
<a name="table-worker-specifications"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/add-job.html)
**중요:** G.12X 및 G.16X 작업자 유형과 모든 R 작업자 유형(R.1X\$1R.8X)의 경우 시작 지연 시간이 길어집니다.  
ETL 작업을 실행하는 데 사용된 DPU의 개수에 따라 시간당 비용이 부과됩니다. 자세한 내용은 [AWS Glue 요금](https://aws.amazon.com/glue/pricing/) 페이지를 참조하세요.  
AWS Glue 버전 1.0 이전 작업의 경우 콘솔을 사용하여 작업을 구성하고 [**작업자 유형(Worker type)**]을 [**표준(Standard)**]로 지정하면, [**최대 용량(Maximum capacity)**]이 설정되고 [**작업자 수(Number of workers)**]는 [**최대 용량(Maximum capacity)**] - 1이 됩니다. AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용하는 경우, [**최대 용량(Max capacity)**] 파라미터를 지정하거나, [**작업자 유형(Worker type)**]과 [**작업자 수(Number of workers)**]를 모두 지정할 수 있습니다.  
AWS Glue 버전 2.0 이상 작업의 경우 **최대 용량**을 지정할 수 없습니다. 대신 [**작업자 유형(Worker type)**] 및 [**작업자 수(Number of workers)**]를 지정해야 합니다.  
**G.4X** 및 **G.8X** 작업자 유형은 다음 AWS 리전의 AWS Glue 버전 3.0 이상 Spark ETL 작업에만 사용할 수 있습니다. 미국 동부(오하이오), 미국 동부(버지니아 북부), 미국 서부(캘리포니아 북부), 미국 서부(오리건), 캐나다(중부), 아시아 태평양(뭄바이), 아시아 태평양(서울), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄), 캐나다(중부), 유럽(프랑크푸르트), 유럽(아일랜드), 유럽(런던), 유럽(스페인), 유럽(스톡홀름), 남아메리카(상파울루).  
**G.12X**, **G.16X** 및 **R.1X**\$1**R.8X** 작업자 유형은 미국 동부(버지니아 북부), 미국 서부(오리건), 미국 동부(오하이오), 유럽(아일랜드), 유럽(프랑크푸르트) AWS 리전에서 AWS Glue 버전 4.0 이상의 Spark ETL 작업에만 사용할 수 있습니다. 향후 릴리스에서는 더 많은 리전이 지원됩니다.

**요청된 작업자 수**  
대부분의 작업자 유형에서 작업이 실행될 때 할당되는 작업자 수를 지정해야 합니다.

**작업 북마크**  
작업 실행 시 AWS Glue가 상태 정보를 진행하는 방법을 지정합니다. 이전에 처리된 데이터를 기억하거나, 상태 정보를 업데이트하거나, 상태 정보를 무시할 수 있습니다. 자세한 내용은 [처리된 데이터를 작업 북마크로 추적](monitor-continuations.md) 섹션을 참조하세요.

**작업 실행 대기열**  
서비스 할당량 때문에 즉시 실행할 수 없는 경우 나중에 실행하기 위해 작업 실행을 대기열에 넣을지 여부를 지정합니다.  
선택하면 해당 작업 실행에 대해 작업 실행 대기열이 활성화됩니다. 채워지지 않은 경우 작업 실행은 대기열에 포함되는 것으로 간주되지 않습니다.  
이 설정이 작업 실행에 설정된 값과 일치하지 않으면 작업 실행 필드의 값이 사용됩니다.

**유연한 실행**  
AWS Studio 또는 API를 사용하여 작업을 구성하면 표준 또는 유연한 작업 실행 클래스를 지정할 수 있습니다. 작업의 우선순위와 시간 민감도는 다를 수 있습니다. 표준 실행 클래스는 빠른 작업 시작 및 전용 리소스가 필요한 시간에 민감한 워크로드에 적합합니다.  
유연한 실행 클래스는 사전 프로덕션 작업, 테스트 및 일회성 데이터 로드와 같은 긴급하지 않은 작업에 적합합니다. 유연한 작업 실행은 AWS Glue 버전 3.0 이상 및 `G.1X` 또는 `G.2X` 작업자 유형을 사용하는 작업에 지원됩니다. 새 작업자 유형(`G.12X`, `G.16X` 및 `R.1X`\$1`R.8X`)은 유연한 실행을 지원하지 않습니다.  

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/FnHCoTuDLXU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/FnHCoTuDLXU)

유연한 작업 실행은 한 번에 실행하는 작업자 수를 기준으로 요금이 청구됩니다. 유연한 작업 실행에 대한 작업자 수를 추가하거나 제거할 수 있습니다. `Max Capacity`\$1`Execution Time`의 간단한 계산으로 청구하는 대신 각 작업자는 작업 실행 중에 실행된 시간으로 요금이 청구됩니다. 청구 금액은 (`Number of DPUs per worker`\$1`time each worker ran`)의 합입니다.  
자세한 내용은 AWS Studio 또는 [작업](aws-glue-api-jobs-job.md) 및 [작업 실행](aws-glue-api-jobs-runs.md)의 도움말 패널을 참조하세요.

**재시도 횟수**  
AWS Glue가 자동적으로 작업을 재시작하지 못하면 재시작하도록 시간 수를 0\$110사이에서 지정합니다. 시간 제한에 도달한 작업은 다시 시작되지 않습니다.

**작업 제한 시간**  
최대 실행 제한을 분으로 설정합니다. 최대 설정은 7일 또는 10,080분입니다. 그렇지 않으면 작업에서 예외가 발생합니다.  
값을 비워 두면 제한 시간은 기본적으로 2,880분으로 설정됩니다.  
제한 시간 값이 7일을 초과하는 기존 AWS Glue 작업은 기본적으로 7일로 설정됩니다. 예를 들어 배치 작업에 20일의 제한 시간을 지정했다면 7일째 되는 날에 작업이 중지됩니다.  
**작업 시간 초과에 대한 모범 사례**  
작업은 실행 시간을 기준으로 요금이 청구됩니다. 예상치 못한 요금이 부과되지 않도록 하려면 작업의 예상 실행 시간에 적합한 제한 시간 값을 구성하세요.

**고급 속성**    
**스크립트 파일 이름**  
작업의 고유한 스크립트 이름입니다. **Untitled job**으로 지정할 수 없습니다.  
**스크립트 경로**  
스크립트의 Amazon S3 위치입니다. 경로는 `s3://bucket/prefix/path/` 형식이어야 합니다. 슬래시(`/`)로 끝나야 하며 파일을 포함하지 않아야 합니다.  
**작업 지표**  
이 작업이 실행될 때 Amazon CloudWatch 지표 생성을 설정하거나 해제합니다. 프로파일링 데이터를 보려면 이 옵션을 활성화해야 합니다. 지표를 설정하고 시각화하는 방법에 대한 자세한 내용은 [작업 모니터링 및 디버깅](monitor-profile-glue-job-cloudwatch-metrics.md) 섹션을 참조하세요.  
**작업 관찰성 지표**  
이 작업이 실행될 때 추가 통합 가시성 CloudWatch 지표 생성을 사용하도록 설정합니다. 자세한 내용은 [AWS Glue 관찰성 메트릭을 사용한 모니터링](monitor-observability.md) 섹션을 참조하세요.  
**연속 로깅**  
Amazon CloudWatch에 대한 연속 로깅을 설정합니다. 이 옵션이 활성화되지 않으면 작업이 완료된 후에만 로그를 사용할 수 있습니다. 자세한 내용은 [AWS Glue 작업의 로깅](monitor-continuous-logging.md) 섹션을 참조하세요.  
**Spark UI**  
이 작업 모니터링에 Spark UI 사용을 설정합니다. 자세한 내용은 [AWS Glue 작업을 위한 Apache Spark 웹 UI 사용 설정](monitor-spark-ui-jobs.md) 섹션을 참조하세요.  
**Spark UI 로그 경로**  
Spark UI를 사용하도록 설정한 경우 로그를 작성할 경로입니다.  
**Spark UI 로깅 및 모니터링 구성**  
다음 옵션 중 하나를 선택하세요.  
+ **표준: AWS Glue 작업 실행 ID를 파일 이름으로 사용하여 로그를 작성합니다. AWS Glue 콘솔에서 Spark UI 모니터링을 켜세요.
+ **레거시: 'spark-application-\$1timestamp\$1'를 파일 이름으로 사용하여 로그를 작성합니다. Spark UI 모니터링을 켜지 마세요.
+ **표준 및 레거시: 표준 위치와 레거시 위치 모두에 로그를 작성합니다. AWS Glue 콘솔에서 Spark UI 모니터링을 켜세요.  
**최대 동시성**  
이 작업에 허용된 최대 동시 실행 수를 설정합니다. 기본 값은 1입니다. 이 임곗값에 도달하면 오류가 반환됩니다. 지정할 수 있는 최대값은 서비스 제한에 따라 통제됩니다. 예를 들어, 새로운 인스턴스가 시작된 후에도 이전 작업이 여전히 실행되고 있다면 오류를 반환하여 동일한 작업의 두 개의 인스턴스를 동시에 실행하지 않도록 방지합니다.  
**임시 경로**  
AWS Glue가 스크립트를 실행할 때 임시 중간 결과가 작성된 Amazon S3의 작업 디렉터리의 위치를 제공합니다. 경로의 임시 디렉터리와 동일한 이름의 파일이 없다는 것을 확인합니다. 이 디렉터리는 AWS Glue가 Amazon Redshift에 읽고 쓸 때 및 일부 AWS Glue 변환에 사용됩니다.  
리전에 버킷이 아직 없는 경우 AWS Glue에서 작업에 대한 임시 버킷을 생성합니다. 이 버킷은 퍼블릭 액세스를 허용할 수 있습니다. Amazon S3에서 버킷을 수정하여 퍼블릭 액세스 차단을 설정하거나 나중에 해당 리전의 모든 작업이 완료된 후 버킷을 삭제할 수 있습니다.  
**지연 알림 임계값(분)**  
지연 알림이 전송되기 전까지의 임계값(분)을 설정합니다. `RUNNING`, `STARTING` 또는 `STOPPING` 작업 실행이 예상 시간(분)을 초과할 때 알림을 전송하도록 이 임계값을 설정할 수 있습니다.  
**보안 구성**  
목록에서 보안 구성을 선택합니다. 보안 구성은 암호화 없음, AWS KMS 관리형 키(SSE-KMS)를 사용한 서버 측 암호화, Amazon S3 관리형 암호화 키(SSE-S3) 등 Amazon S3 대상의 데이터 암호화 방법을 지정합니다.  
**서버 측 암호화**  
이 옵션을 선택할 경우, ETL 작업을 Amazon S3에 작성하면 SSE-S3 암호화를 사용하여 데이터는 암호화합니다. Amazon S3 임시 디렉터리에 쓴 모든 데이터와 Amazon S3 데이터 대상 모두 암호화됩니다. 이 옵션은 작업 파라미터로 전달됩니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3 관리형 암호화 키(SSE-S3)로 서버 측 암호화를 사용하여 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)를 참조하세요.  
보안 구성이 지정된 경우 이 옵션은 무시됩니다.  
**Glue 데이터 카탈로그를 Hive 메타스토어로 사용**  
이를 선택하여 AWS Glue 데이터 카탈로그를 Hive 메타스토어로 사용합니다. 작업에 사용되는 IAM 역할에는 `glue:CreateDatabase` 권한이 있어야 합니다. "기본값"이라는 데이터베이스가 없는 경우에 데이터 카탈로그에서 생성됩니다.

**연결**  
Virtual Private Cloud(VPC)에 있는 Amazon S3 데이터 소스에 액세스하려면 VPC 구성을 선택합니다. AWS Glue에서 네트워크 연결을 생성하고 관리할 수 있습니다. 자세한 내용은 [데이터에 연결](glue-connections.md) 섹션을 참조하세요.

**라이브러리**    
**Python 라이브러리 경로, 종속 JAR 경로 및 참조된 파일 경로**  
스크립트에 필요한 경우 이러한 옵션을 지정합니다. 작업을 정의할 때 이러한 옵션에 대해 쉼표로 구분된 Amazon S3 경로를 정의할 수 있습니다. 작업을 실행할 때 이 경로를 무시할 수 있습니다. 자세한 내용은 [사용자 지정 스크립트 제공](console-custom-created.md) 섹션을 참조하세요.  
**작업 파라미터**  
이름이 지정된 파라미터로 스크립트에 전달되는 키-값 쌍의 집합입니다. 이러한 값은 스크립트가 실행될 때 사용되는 기본값이지만 트리거에서 또는 작업을 실행할 때 재정의할 수 있습니다. 키 이름 앞에 `--`를 붙여야 합니다(예: `--myKey`). AWS Command Line Interface를 사용할 때 맵으로 작업 파라미터를 전달합니다 .  
예를 들어 [AWS Glue에서 Python 파라미터 전달 및 액세스](aws-glue-programming-python-calling.md#aws-glue-programming-python-calling-parameters)의 Python 파라미터를 참조하세요.  
**Tags**  
**태그 키**와 선택 사항인 **태그 값**으로 작업에 태그를 지정합니다. 생성된 태그 키는 읽기 전용입니다. 일부 리소스에서 태그를 이용하면 리소스를 정리하고 식별하는 데 도움이 됩니다. 자세한 내용은 [AWS Glue의 AWS 태그](monitor-tags.md) 섹션을 참조하세요.

## Lake Formation 관리형 테이블에 액세스하는 작업에 대한 제한 사항
<a name="lf-table-restrictions"></a>

AWS Lake Formation에서 관리되는 테이블에서 읽거나 쓰는 작업을 생성하는 경우 다음 참고 사항과 제한 사항에 유의하세요.
+ 셀 수준 필터가 있는 테이블에 액세스하는 작업에서는 다음 기능이 지원되지 않습니다.
  + [작업 북마크](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html) 및 [제한된 실행](https://docs.aws.amazon.com/glue/latest/dg/bounded-execution.html)
  + [푸시다운 조건자](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-pushdowns)
  + [서버 측 카탈로그 파티션 조건자](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates)
  + [enableUpdateCatalog](https://docs.aws.amazon.com/glue/latest/dg/update-from-job.html)

# AWS Glue 콘솔에서 Spark 스크립트 편집
<a name="edit-script-spark"></a>

스크립트는 소스에서 데이터를 추출하고 데이터를 변환한 다음 대상으로 로드하는 스크립트를 실행하는 코드를 포함합니다. AWS Glue는 작업 시작 시 스크립트를 실행합니다.

AWS Glue ETL 스크립트는 Python 또는 Scala에 코딩될 수 있습니다. Python 스크립트는 추출, 변환 및 로드(ETL) 작업 스크립트의 PySpark Python의 확장 언어를 사용합니다. 스크립트는 ETL 변환을 다루는 *확장된 구조*를 포함합니다. 자동적으로 작업의 소스 코드 논리를 생성하면 스크립트가 생성됩니다. 스크립트를 편집하거나 자체 스크립트를 제공하여 ETL 작업을 실행할 수 있습니다.

 AWS Glue에서 스크립트를 정의하고 편집하는 방법에 대한 자세한 내용은 [AWS Glue 프로그래밍 안내서](edit-script.md) 섹션을 참조하세요.

## 추가 라이브러리 또는 파일
<a name="w2aac37c11c12c13b9"></a>

스크립트가 추가 라이브러리 혹은 파일은 요구하면 다음과 같이 지정합니다.

**Python 라이브러리 경로**  
스크립트에 필요한 Python 라이브러리로 이동하는, 쉼표로 구분된 Amazon Simple Storage Service(Amazon S3) 경로입니다.  
순수 Python 라이브러리만 사용할 수 있습니다. pandas Python 데이터 분석 라이브러리 등 C 확장을 활용하는 라이브러리는 아직 지원되지 않습니다.

**종속된 jars 경로**  
스크립트에 필요한 JAR 파일로 이동하는, 쉼표로 구분된 Amazon S3 경로입니다.  
현재 순수 Java 또는 Scala(2.11) 라이브러리만 사용할 수 있습니다.

**참조된 파일 경로**  
스크립트에 필요한 추가 파일(예: 구성 파일)로 이동하는, 쉼표로 구분된 Amazon S3 경로입니다.

# 작업(레거시)
<a name="console-edit-script"></a>

스크립트는 작업을 추출, 변환 및 로드(ETL)하는 코드를 포함합니다. 사용자가 스크립트를 제공하거나 AWS Glue가 사용자의 지시에 따라 스크립트를 생성할 수 있습니다. 스크립트 생성에 대한 자세한 내용은 [사용자 지정 스크립트 제공](console-custom-created.md) 섹션을 참조하십시오.

AWS Glue 콘솔의 스크립트를 편집할 수 있습니다. 스크립트를 편집하려면 원본, 대상 및 변환을 추가할 수 있습니다.

**스트립트 편집**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다. 그런 다음 [**Jobs(작업)**] 탭을 선택합니다.

1. 목록에서 작업을 선택한 다음 [**Action(작업)**]과 [**Edit script(스크립트 편집)**]을 선택하여 스크립트 에디터를 엽니다.

   작업 상세 정보 페이지에서 스크립트 에디터로 액세스할 수 있습니다. [**스크립트(Script)**] 탭을 선택한 다음 [**스크립트 편집(Edit Script)**]을 선택합니다.

   

## 스크립트 에디터
<a name="console-edit-script-editor"></a>

AWS Glue 스크립트 편집기를 사용하여 스트립트에서 원본, 대상 및 변환을 삽입, 수정 및 삭제할 수 있습니다. 스크립트 편집기는 데이터 흐름을 시각화하여 스크립트와 다이어그램을 모두 보여줍니다.

스크립트용 다이어그램을 생성하려면 **다이어그램 생성**을 선택합니다. AWS Glue는 **\$1\$1**로 시작하는 스크립트 문장을 사용하여 다이어그램을 만듭니다. 다이어그램에서 스크립트를 정확하게 나타내기 위해서 파라미터를 주석에 있도록 하고 Apache Spark 코드와 동기화되도록 합니다.

스크립트 편집기는 커서가 스크립트 어디에 있든지 코드 템플릿을 추가합니다. 편집기 상단에서 다음 옵션을 선택합니다.
+ [**Source(원본)**]을 선택하여 원본 테이블을 스크립트에 추가합니다.
+ [**Target(대상)**]을 선택하여 대상 테이블을 스크립트에 추가합니다.
+ [**Target location(대상 위치)**]을 선택하여 대상 위치를 스크립트에 추가합니다.
+ [**Transform(변환)**]을 선택하여 변환을 스크립트에 추가합니다. 스크립트에 호출된 함수에 대한 자세한 내용은 [PySpark의 AWS Glue ETL 스크립트 프로그래밍](aws-glue-programming-python.md) 단원을 참조하십시오.
+ [**Spigot(스피곳)**]을 선택하여 스피곳 변환을 스크립트에 추가합니다.

삽입된 코드의 경우, 주석과 Apache Spark 코드 모두에서 `parameters`를 수정합니다. 예를 들어, [**Spigot(스피곳)**] 변환을 추가하면 `path`가 `@args` 주석과 `output` 코드 라인으로 바뀌었는지 확인합니다.

[**Logs(로그)**] 탭은 작업이 실행되면서 작업과 관련된 로그를 보여줍니다. 최신 1,000 라인이 표시됩니다.

[**스키마(Schema)**] 탭에는 선택한 원본 및 대상의 스키마가 표시됩니다(Data Catalog에서 사용 가능한 경우).

# 처리된 데이터를 작업 북마크로 추적
<a name="monitor-continuations"></a>

AWS Glue는 작업 실행의 상태 정보를 유지하여 이전에 ETL 작업을 실행할 때 이미 처리된 데이터를 추적합니다. 이와 같은 지속 상태 정보를 *작업 북마크*라고 합니다. AWS Glue는 작업 북마크로 상태 정보를 유지하고 이전 데이터의 재처리를 방지합니다. 작업 북마크를 사용하면 예약된 간격으로 재실행 중인 새 데이터를 처리할 수 있습니다. 작업 북마크는 원본, 변환 및 대상과 같은 다양한 작업 요소의 상태로 구성됩니다. 예를 들어, ETL 작업에서 Amazon S3 파일의 새 파티션을 읽어야 할 수 있습니다. AWS Glue는 그 작업에서 처리한 파티션을 추적하여 중복 실행을 방지하고 작업 대상인 데이터 스토어에 데이터를 복제합니다.

작업 북마크는 JDBC 데이터 원본, Relationalize 변환 및 일부 Amazon Simple Storage Service(Amazon S3) 소스에 대해 구현됩니다. 다음 테이블에는 AWS Glue가 작업 북마크에 대해 지원하는 Amazon S3 소스 포맷이 나열됩니다.


| AWS Glue 버전 | Amazon S3 소스 포맷 | 
| --- | --- | 
| 버전 0.9 | JSON, CSV, Apache Avro, XML | 
| 버전 1.0 이상 | JSON, CSV, Apache Avro, XML, Parquet, ORC | 

AWS Glue 버전에 대한 자세한 내용은 [Spark 작업에 대한 작업 속성 정의](add-job.md#create-job) 섹션을 참조하세요.

AWS Glue 스크립트를 통해 액세스할 경우 작업 북마크 기능에는 추가 기능이 있습니다. 생성된 스크립트를 찾아보면 이 기능과 관련된 변환 컨텍스트가 표시될 수 있습니다. 자세한 내용은 [작업 북마크 사용](programming-etl-connect-bookmarks.md) 섹션을 참조하세요.

**Topics**
+ [AWS Glue에서 작업 북마크 사용](#monitor-continuations-implement)
+ [작업 북마크 기능의 운영 세부 정보](#monitor-continuations-script)

## AWS Glue에서 작업 북마크 사용
<a name="monitor-continuations-implement"></a>

작업이 시작되면 작업 북마크 옵션을 파라미터로 전달합니다. 다음 표에 AWS Glue 콘솔에서 작업 북마크를 설정하기 위한 옵션이 설명되어 있습니다.


****  

| 작업 북마크 | 설명 | 
| --- | --- | 
| Enable | 이전에 처리된 데이터를 추적하기 위해 작업 실행 후 상태를 업데이트하도록 합니다. 작업 북마크가 지원되는 소스의 작업이라면 이미 처리된 데이터를 추적하고, 작업 실행 시 마지막 체크포인트 이후에 받은 새 데이터를 처리합니다. | 
| 비활성화 | 작업 북마크를 사용하지 않고, 작업에서 항상 전체 데이터 세트를 처리합니다. 이전에 실행된 작업의 출력값 관리는 여러분이 직접 수행해야 합니다. 이 값이 기본값입니다. | 
| 일시 중지 |  마지막 북마크의 상태를 업데이트하지 않고 마지막으로 성공한 실행 이후의 증분 데이터 또는 다음 하위 옵션으로 식별된 범위의 데이터를 처리합니다. 이전에 실행된 작업의 출력값 관리는 여러분이 직접 수행해야 합니다. 두 개의 하위 옵션은 다음과 같습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitor-continuations.html) 이 옵션 세트를 지정하면 작업 북마크 상태가 업데이트되지 않습니다. 하위 옵션은 선택 사항이지만, 두 하위 옵션이 모두 사용되는 경우에는 제공해야 합니다.  | 

명령줄에서 작업에 전달된 파라미터, 특히 작업 북마크에 대한 자세한 내용은 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 단원을 참조하십시오.

Amazon S3 입력 소스의 경우 AWS Glue 작업 북마크는 객체의 마지막 수정 시간을 검사해 어떤 객체를 재처리해야 하는지 확인합니다. 마지막 작업 실행 이후로 입력 소스 데이터가 수정된 경우, 작업을 다시 실행하면 그 파일이 재처리됩니다.

JDBC 소스의 경우 다음 규칙이 적용됩니다.
+ 각 테이블에 대해 AWS Glue는 하나 이상의 열을 북마크 키로 사용하여 새 데이터와 처리된 데이터를 결정합니다. 북마크 키가 결합되어 단일 복합 키를 형성합니다.
+ AWS Glue에서는 기본적으로 프라이머리 키를 북마크 키로 사용합니다. 단, 해당 키는 간격 없이 순차적으로 증가하거나 감소합니다.
+ AWS Glue 스크립트에서 북마크 키로 사용할 열을 지정할 수 있습니다. AWS Glue 스크립트에서 작업 북마크를 사용하는 방법에 대한 자세한 내용은 [작업 북마크 사용](programming-etl-connect-bookmarks.md) 섹션을 참조하세요.
+ AWS Glue에서는 대소문자를 구분하는 열을 작업 북마크 키로 사용하는 것을 지원하지 않습니다.

AWS Glue Spark ETL 작업에 대한 작업 북마크를 이전 작업 실행으로 되돌릴 수 있습니다. 작업 북마크를 이전의 작업 실행으로 되돌릴 수 있어 후속 작업 실행 시 북마크로 지정된 작업 실행의 데이터만 다시 처리하므로 데이터 다시 채우기 시나리오를 훨씬 효율적으로 지원할 수 있습니다.

모든 데이터를 동일한 작업에서 재처리하려는 경우에는 작업 북마크를 재설정합니다. 작업 북마크 상태를 재설정하려면 AWS Glue 콘솔, [ResetJobBookmark 작업(Python: reset\$1job\$1bookmark)](aws-glue-api-jobs-runs.md#aws-glue-api-jobs-runs-ResetJobBookmark) API 작업 또는 AWS CLI를 사용합니다. 예를 들어, AWS CLI에서는 다음 명령을 입력합니다.

```
    aws glue reset-job-bookmark --job-name my-job-name
```

북마크를 되감거나 재설정할 때 여러 대상이 있을 수 있고 대상이 작업 북마크로 추적되지 않기 때문에 AWS Glue는 대상 파일을 정리하지 않습니다. 소스 파일만 북마크로 추적됩니다. 출력에서 중복 데이터를 피하기 위해 소스 파일을 되감고 다시 처리할 때 다른 출력 대상을 생성할 수 있습니다.

AWS Glue는 작업 북마크를 작업별로 추적합니다. 작업을 삭제하면 작업 북마크가 삭제됩니다.

AWS Glue 작업 북마크를 활성화했는데도 ETL 작업이 앞선 실행에서 이미 처리된 데이터를 재처리하는 경우가 있을 수 있습니다. 이러한 오류의 일반적인 원인 해결에 대한 자세한 내용은 [Glue 일반 설정 오류 문제 해결](glue-troubleshooting-errors.md) 단원을 참조하십시오.

## 작업 북마크 기능의 운영 세부 정보
<a name="monitor-continuations-script"></a>

이 단원에서는 작업 북마크 사용의 실무적 측면에 대해 좀 더 자세히 설명합니다.

작업 북마크는 작업의 상태를 저장합니다. 각각의 상태 인스턴스를 작업 이름과 버전 번호로 입력합니다. 스크립트가 `job.init`를 호출하면 상태를 검색해 항상 최신 버전을 가져옵니다. 상태 안에는 여러 가지 상태 요소가 있는데, 이러한 요소는 해당 스크립트에서 소스, 변환 및 싱크 인스턴스별로 고유합니다. 이러한 상태 요소는 스크립트의 해당 요소(소스, 변환 또는 싱크)에 연결된 변환 컨텍스트로 식별할 수 있습니다. 상태 요소는 사용자 스크립트에서 `job.commit`를 호출할 때 기본적으로 저장됩니다. 이 스크립트는 인수에서 작업 이름과 작업 북마크에 대한 제어 옵션을 가져옵니다.

작업 북마크의 상태 요소는 소스, 변환 또는 싱크 관련 데이터입니다. 예를 들어, 업스트림 작업 또는 프로세스에서 끊임 없이 쓰는 Amazon S3 위치에서 증분 데이터를 읽으려 한다고 가정해 보겠습니다. 이 경우, 스크립트는 지금까지 처리된 항목을 확인해야 합니다. Amazon S3 소스에 대해 작업 북마크를 구현하면 정보를 저장하기 때문에 작업을 다시 실행할 때 저장된 정보를 사용해 새 객체만 필터링하여 작업의 다음 실행을 위해 상태를 재컴퓨팅할 수 있습니다. 타임스탬프는 새 파일을 필터링하는 데 사용됩니다.

작업 북마크에는 상태 요소 외에도 *실행 횟수*, *시도 횟수* 및 *버전 번호*가 포함되어 있습니다. 실행 횟수는 작업의 실행을 추적하고, 시도 횟수는 작업 실행을 시도한 횟수를 기록합니다. 작업 실행 횟수는 실행에 성공할 때마다 단순하게 늘어나는 숫자입니다. 시도 횟수는 각각의 실행 시도를 추적하며, 시도 실패 후 실행하는 경우에만 숫자가 늘어납니다. 버전 번호는 단순히 증가하고, 작업 북마크에 대한 업데이트를 추적합니다.

AWS Glue 서비스 데이터베이스에서 모든 변환에 대한 북마크 상태는 키-값 쌍으로 함께 저장됩니다.

```
{
  "job_name" : ...,
  "run_id": ...,
  "run_number": ..,
  "attempt_number": ...
  "states": {
    "transformation_ctx1" : {
      bookmark_state1
    },
    "transformation_ctx2" : {
      bookmark_state2
    }
  }
}
```

**모범 사례**  
다음은 작업 북마크 사용에 관한 모범 사례입니다.
+ *북마크가 사용 설정된 상태에서 데이터 원본 속성을 변경하지 마세요*. 예를 들어, Amazon S3 입력 경로 A를 가리키는 datasource0가 있으며 작업은 북마크가 사용 설정된 상태에서 여러 라운드 동안 실행 중인 소스에서 읽어오고 있습니다. `transformation_ctx`를 변경하지 않고 datasource0의 입력 경로를 Amazon S3 경로 B로 변경하는 경우, AWS Glue 작업은 저장된 이전 북마크 상태를 사용합니다. 그러면 AWS Glue가 해당 파일이 이전 실행에서 처리되었다고 가정하여 입력 경로 B에서 파일이 누락되거나 파일을 건너뛰게 됩니다.
+ *더 효과적인 파티션 관리를 위해 북마크가 있는 카탈로그 테이블을 사용하세요*. 책갈피는 Data Catalog 또는 옵션의 데이터 원본에 모두 작동합니다. 그러나 옵션 접근 방식을 사용하면 새 파티션을 제거/추가하는 것은 어렵습니다. 크롤러로 카탈로그 테이블을 사용하면 새로 추가된 [파티션](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html#tables-partition)을 추적하는 더 향상된 자동화를 제공할 수 있으며, [푸시다운 조건자](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html)로 특정 파티션을 선택할 수 있는 유연성이 확보됩니다.
+ *대용량 데이터 집합에 대해 [AWS Glue Amazon S3 파일 리스터](https://aws.amazon.com/premiumsupport/knowledge-center/glue-oom-java-heap-space-error/)를 사용하세요*. 북마크는 각 입력 파티션 아래의 모든 파일을 나열하고 필터링을 수행하므로 단일 파티션 아래에 파일이 너무 많으면 북마크가 드라이버 OOM으로 실행될 수 있습니다. 메모리에 있는 모든 파일을 한 번에 나열하지 않도록 AWS Glue Amazon S3 파일 리스터를 사용하세요.

# Spark 셔플 데이터 저장
<a name="monitor-spark-shuffle-manager"></a>

셔플링은 데이터가 파티션 간에 재배열될 때마다 Spark 작업에서 중요한 단계입니다. 이는 `join`, ` groupByKey`, `reduceByKey`, `repartition` 등의 광범위한 변환이 처리를 완료하기 위해 다른 파티션의 정보를 필요로 하기 때문에 필요합니다. Spark는 각 파티션에서 필요한 데이터를 수집하여 새 파티션으로 결합합니다. 셔플 중에 데이터가 디스크에 기록되고 네트워크를 통해 전송됩니다. 결과적으로 셔플 작업은 로컬 디스크 용량에 바인딩됩니다. Spark는 실행기에 디스크 공간이 충분하지 않고 복구가 없을 때 `No space left on device` 또는 ` MetadataFetchFailedException` 오류를 발생시킵니다.

**참고**  
 Amazon S3의 AWS Glue Spark 셔플 플러그인은 AWS Glue ETL 작업에서만 지원됩니다.

**Solution**  
AWS Glue에서는 이제 Amazon S3를 사용하여 Spark 셔플 데이터를 저장할 수 있습니다. Amazon S3는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다. 이 솔루션은 Spark 작업에 대한 컴퓨팅 및 스토리지를 분해하고 완전한 탄력성과 저비용 셔플 스토리지를 제공하여 가장 셔플 집약적인 워크로드를 안정적으로 실행할 수 있도록 합니다.

![\[Spark workflow showing Map and Reduce stages using Amazon S3 for shuffle data storage.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/gs-s3-shuffle-diagram.png)


Amazon S3를 사용하기 위한 새로운 Apache Spark용 클라우드 셔플 스토리지 플러그인을 소개합니다. 대규모 셔플 작업을 위한 로컬 디스크 용량에 의해 제한되는 것으로 알려진 경우 Amazon S3 셔플링을 켜서 AWS Glue 작업을 실패 없이 안정적으로 실행할 수 있습니다. 경우에 따라 Amazon S3에 기록된 작은 파티션이나 셔플 파일이 많은 경우 Amazon S3로의 셔플링은 로컬 디스크(또는 EBS)보다 약간 느립니다.

## 클라우드 셔플 스토리지 플러그인 사용을 위한 필수 조건
<a name="monitor-spark-shuffle-manager-prereqs"></a>

 클라우드 셔플 스토리지 플러그인을 AWS Glue ETL 작업에서 사용하려면 다음이 필요합니다.
+ 중간 셔플 및 유출된 데이터를 저장할, 작업 실행과 동일한 리전에 위치한 Amazon S3 버킷. 셔플 스토리지의 Amazon S3 접두사는 다음 예제와 같이 `--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket/prefix/`으로 지정될 수 있습니다.

  ```
  --conf spark.shuffle.glue.s3ShuffleBucket=s3://glue-shuffle-123456789-us-east-1/glue-shuffle-data/
  ```
+  셔플 관리자는 작업이 완료된 후 파일을 정리하지 않으므로 *접두사*(예: `glue-shuffle-data`)에서 Amazon S3 스토리지 수명 주기 정책을 설정합니다. 중간 셔플 및 유출된 데이터는 작업 완료 후 삭제해야 합니다. 사용자는 접두사에 간단한 수명 주기 정책을 설정할 수 있습니다. Amazon S3 수명 주기 정책 설정 지침은 Amazon Simple Storage Service Console 사용 설명서의 [버킷에서 수명 주기 구성 설정](https://docs.aws.amazon.com//AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)을 참조하세요.

## AWS 콘솔에서 AWS Glue Spark 셔플 관리자 사용
<a name="monitor-spark-shuffle-manager-using-console"></a>

작업을 구성할 때 AWS Glue 콘솔 또는 AWS Glue Studio를 사용하여 AWS Glue Spark 셔플 관리자를 설정하려면 **--write-shuffle-files-to-s3** 작업 파라미터를 선택하여 작업에 대해 Amazon S3 셔플을 설정합니다.

![\[Job parameters interface showing --write-shuffle-files- parameter and option to add more.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/gs-s3-shuffle.png)


## AWS Glue Spark 셔플 플러그인 사용
<a name="monitor-spark-shuffle-manager-using"></a>

다음 작업 파라미터는 AWS Glue 셔플 매니저를 설정하고 조정합니다. 이러한 파라미터는 플래그이므로 제공된 값은 고려되지 않습니다.
+ `--write-shuffle-files-to-s3` - AWS Glue Spark 셔플 관리자가 Amazon S3 버킷을 사용하여 셔플 데이터를 쓰고 읽을 수 있도록 하는 기본 플래그입니다. 플래그가 지정되지 않은 경우 셔플 관리자가 사용되지 않습니다.
+ `--write-shuffle-spills-to-s3` - (AWS Glue 버전 2.0에서만 지원됨). 유출 파일을 Amazon S3 버킷으로 오프로드하도록 허용하는 선택적 플래그로, Spark 작업에 복원력을 추가로 제공합니다. 이는 많은 데이터를 디스크로 유출하는 대규모 워크로드에만 필요합니다. 플래그를 지정하지 않으면 중간 유출 파일이 작성되지 않습니다.
+ ` --conf spark.shuffle.glue.s3ShuffleBucket=s3://<shuffle-bucket>` - 셔플 파일을 작성하는 Amazon S3 버킷을 지정하는 또 다른 선택적 플래그입니다. 기본값은 `--TempDir` /shuffle-data입니다. AWS Glue 3.0 이상에서는 `--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket-1/prefix,s3://shuffle-bucket-2/prefix/`에서와 같이 쉼표 구분자를 사용해 버킷을 지정함으로써 여러 버킷에 셔플 파일을 쓸 수 있도록 지원합니다. 버킷을 여러 개 사용하면 성능이 향상됩니다.

셔플 데이터의 유휴 암호화를 활성화하려면 보안 구성 설정을 제공해야 합니다. 보안 구성에 대한 자세한 내용은 [AWS Glue에서 암호화 설정](set-up-encryption.md) 섹션을 참조하세요. AWS Glue는 Spark에서 제공하는 다른 모든 셔플 관련 구성을 지원합니다.

**클라우드 셔플 스토리지 플러그인을 위한 소프트웨어 바이너리**  
또한 Apache 2.0 라이선스에 따라 Apache Spark용 클라우드 셔플 스토리지 플러그인의 소프트웨어 바이너리를 다운로드하여 Spark 환경에서 실행할 수 있습니다. 새 플러그인은 Amazon S3에 대한 기본 지원과 함께 제공되며 [Google Cloud Storage 및 Microsoft Azure Blob Storage](https://github.com/aws-samples/aws-glue-samples/blob/master/docs/cloud-shuffle-plugin/README.md)와 같은 다른 형태의 클라우드 스토리지를 사용하도록 쉽게 구성할 수도 있습니다. 자세한 내용은 [Apache Spark용 클라우드 셔플 스토리지 플러그인](https://docs.aws.amazon.com/glue/latest/dg/cloud-shuffle-storage-plugin.html)을 참조하세요.

**참고 및 제한 사항**  
다음은 AWS Glue 셔플 관리자에 대한 참고 또는 제한 사항입니다.
+  AWS Glue 셔플 관리자는 작업이 완료된 후 Amazon S3 버킷에 저장된 (임시) 셔플 데이터 파일을 자동으로 삭제하지 않습니다. 데이터를 보호하려면 클라우드 셔플 스토리지 플러그인을 활성화하기 전에 [클라우드 셔플 스토리지 플러그인 사용을 위한 필수 조건](#monitor-spark-shuffle-manager-prereqs)의 지침을 따릅니다.
+ 데이터가 왜곡된 경우 이 기능을 사용할 수 있습니다.

# Apache Spark용 클라우드 셔플 스토리지 플러그인
<a name="cloud-shuffle-storage-plugin"></a>

클라우드 셔플 스토리지 플러그인은 [`ShuffleDataIO` API](https://github.com/apache/spark/blob/master/core/src/main/java/org/apache/spark/shuffle/api/ShuffleDataIO.java)와 호환되는 Apache Spark 플러그인으로, 셔플 데이터를 클라우드 스토리지 시스템(예: Amazon S3)에 저장할 수 있습니다. Spark 애플리케이션에서 일반적으로 `join`, `reduceByKey`, `groupByKey`, `repartition`과 같은 변환에 의해 트리거되는 대규모 셔플 작업을 위해 로컬 디스크 스토리지 용량을 보충하거나 교체하여 서버리스 데이터 분석 작업 및 파이프라인의 일반적인 장애 또는 가격 대비 성능 문제를 줄일 수 있습니다.

**AWS Glue**  
AWS Glue 버전 3.0 및 4.0에는 플러그인이 미리 설치되어 있으며 추가 단계 없이 Amazon S3로 셔플링할 수 있습니다. 자세한 내용을 보려면 [Amazon S3의 AWS Glue Spark 셔플 클러그인](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-shuffle-manager.html)을 참조하여 Spark 애플리케이션에 대한 기능을 활성화하세요.

**기타 Spark 환경**  
플러그인을 사용하려면 다른 Spark 환경에서 다음과 같은 Spark 구성을 설정해야 합니다.
+ `--conf spark.shuffle.sort.io.plugin.class=com.amazonaws.spark.shuffle.io.cloud.ChopperPlugin`: Shuffle IO에 이 플러그인을 사용하도록 Spark에 알려줍니다.
+ `--conf spark.shuffle.storage.path=s3://bucket-name/shuffle-file-dir`: 셔플 파일이 저장되는 경로입니다.

**참고**  
플러그인은 Spark 코어 클래스 하나를 덮어씁니다. 따라서 플러그인 jar을 Spark jar보다 먼저 로드해야 합니다. 플러그인을 AWS Glue 외부에서 사용하는 경우 온-프레미스 YARN 환경에서 `userClassPathFirst`를 사용하여 이 작업을 수행할 수 있습니다.

## Spark 애플리케이션과 플러그인 번들링
<a name="cloud-shuffle-storage-plugin-bundling"></a>

Spark 애플리케이션을 로컬에서 개발하는 동안 Maven `pom.xml`에 플러그인 종속성을 추가하여 플러그인을 Spark 애플리케이션 및 Spark 배포(버전 3.1 이상)와 함께 번들로 제공할 수 있습니다. 플러그인 및 Spark 버전에 대한 자세한 내용은 [플러그인 버전](#cloud-shuffle-storage-plugin-versions) 섹션을 참조하세요.

```
<repositories>
   ...
    <repository>
        <id>aws-glue-etl-artifacts</id>
        <url>https://aws-glue-etl-artifacts.s3.amazonaws.com/release/ </url>
    </repository>
</repositories>
...
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>chopper-plugin</artifactId>
    <version>3.1-amzn-LATEST</version>
</dependency>
```

또는 다음과 같이 AWS Glue Maven 아티팩트에서 바이너리를 직접 다운로드하여 Spark 애플리케이션에 포함시킬 수도 있습니다.

```
#!/bin/bash
sudo wget -v https://aws-glue-etl-artifacts.s3.amazonaws.com/release/com/amazonaws/chopper-plugin/3.1-amzn-LATEST/chopper-plugin-3.1-amzn-LATEST.jar -P /usr/lib/spark/jars/
```

예제 spark-submit

```
spark-submit --deploy-mode cluster \
--conf spark.shuffle.storage.s3.path=s3://<ShuffleBucket>/<shuffle-dir> \
--conf spark.driver.extraClassPath=<Path to plugin jar> \ 
--conf spark.executor.extraClassPath=<Path to plugin jar> \
--class <your test class name> s3://<ShuffleBucket>/<Your application jar> \
```

## 구성 옵션
<a name="cloud-shuffle-storage-plugin-optional"></a>

Amazon S3 셔플 동작을 제어하는 구성 옵션 값이 있습니다.
+ `spark.shuffle.storage.s3.enableServerSideEncryption`: 셔플 및 유출 파일에 대한 S3 SSE를 활성화/비활성화합니다. 기본값은 `true`입니다.
+ `spark.shuffle.storage.s3.serverSideEncryption.algorithm`: 사용할 SSE 알고리즘입니다. 기본값은 `AES256`입니다.
+ `spark.shuffle.storage.s3.serverSideEncryption.kms.key`: SSE aws:kms가 활성화된 경우의 KMS 키 ARN입니다.

이러한 구성과 함께 `spark.hadoop.fs.s3.enableServerSideEncryption` 및 **기타 환경별 구성**과 같은 구성을 설정하여 사용 사례에 적합한 암호화가 적용되도록 해야 할 수도 있습니다.

## 플러그인 버전
<a name="cloud-shuffle-storage-plugin-versions"></a>

이 플러그인은 각 AWS Glue 버전과 연결된 Spark 버전에서 지원됩니다. 다음 표에는 플러그인 소프트웨어 바이너리의 AWS Glue 버전, Spark 버전 및 Amazon S3 위치와 연결된 플러그인 버전이 나와 있습니다.


| AWS Glue 버전 | Spark 버전 | 플러그인 버전 | Amazon S3 위치 | 
| --- | --- | --- | --- | 
| 3.0 | 3.1 | 3.1-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.1-amzn-0/chopper-plugin-3.1-amzn-LATEST.jar  | 
| 4.0 | 3.3 | 3.3-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.3-amzn-0/chopper-plugin-3.3-amzn-LATEST.jar  | 

## 라이선스
<a name="cloud-shuffle-storage-plugin-binary-license"></a>

이 플러그인의 소프트웨어 바이너리는 Apache-2.0 라이선스에 따라 사용이 허가됩니다.

# AWS Glue Spark 작업 모니터링
<a name="monitor-spark"></a>

**Topics**
+ [AWS Glue Studio에서 사용할 수 있는 Spark 지표](#console-jobs-details-metrics-spark)
+ [Apache Spark 웹 UI를 사용하여 작업 모니터링](monitor-spark-ui.md)
+ [AWS Glue 작업 실행 인사이트를 사용한 모니터링](monitor-job-insights.md)
+ [Amazon CloudWatch를 사용한 모니터링](monitor-cloudwatch.md)
+ [작업 모니터링 및 디버깅](monitor-profile-glue-job-cloudwatch-metrics.md)

## AWS Glue Studio에서 사용할 수 있는 Spark 지표
<a name="console-jobs-details-metrics-spark"></a>

[**지표(Metrics)**] 탭에는 작업이 실행되고 프로파일링이 활성화될 때 수집되는 지표가 표시됩니다. 다음 그래프가 Spark 작업에 표시됩니다.
+ ETL 데이터 이동
+ 메모리 프로필: 드라이버 및 실행기

다음 그래프를 표시하려면 **View additional metrics(추가 측정치 보기)**를 선택합니다.
+ ETL 데이터 이동
+ 메모리 프로필: 드라이버 및 실행기
+ 실행기 간의 데이터 셔플
+ CPU 부하: 드라이버 및 실행기
+ 작업 실행: 활성 실행기, 완료된 단계 및 최대 필요 실행기

지표를 수집하도록 작업이 구성된 경우 이러한 그래프에 대한 데이터가 CloudWatch 지표로 푸시됩니다. 지표를 설정하고 그래프를 해석하는 방법에 대한 자세한 내용은 [작업 모니터링 및 디버깅](monitor-profile-glue-job-cloudwatch-metrics.md) 섹션을 참조하세요.

**Example ETL 데이터 이동 그래프**  
ETL 데이터 이동 그래프는 다음 측정치를 표시합니다.  
+ 모든 실행기가 Amazon S3에서 읽은 바이트 수 - [`glue.ALL.s3.filesystem.read_bytes`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes)
+ 모든 실행기가 Amazon S3에 쓴 바이트 수 - [`glue.ALL.s3.filesystem.write_bytes`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes)

![\[AWS Glue 콘솔의 [지표(Metrics)] 탭의 ETL 데이터 이동 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/job_detailed_etl.png)


**Example 메모리 프로필 그래프**  
메모리 프로필 그래프는 다음 측정치를 표시합니다.  
+ 드라이버에 의해 이 드라이버용 JVM 힙에 사용되는 메모리 부분(규모: 0\$11), *executorId*에 의해 식별되는 실행기, 또는 모든 실행기 -
  + [`glue.driver.jvm.heap.usage`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.jvm.heap.usage)
  + [`glue.executorId.jvm.heap.usage`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.jvm.heap.usage)
  + [`glue.ALL.jvm.heap.usage`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)

![\[AWS Glue 콘솔의 [지표(Metrics)] 탭의 메모리 프로파일 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/job_detailed_mem.png)


**Example 실행기 간의 데이터 셔플 그래프**  
실행기 간의 데이터 셔플 그래프는 다음 측정치를 표시합니다.  
+ 서로 간에 데이터를 셔플링하기 위해 모든 실행기가 읽은 바이트 수 - [`glue.driver.aggregate.shuffleLocalBytesRead`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleLocalBytesRead)
+ 서로 간에 데이터를 셔플링하기 위해 모든 실행기가 쓴 바이트 수 - [`glue.driver.aggregate.shuffleBytesWritten`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleBytesWritten)

![\[AWS Glue 콘솔의 [지표(Metrics)] 탭의 실행기 간의 데이터 셔플 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/job_detailed_data.png)


**Example CPU 부하 그래프**  
CPU 부하 그래프는 다음 측정치를 표시합니다.  
+ 드라이버, *executorId*로 식별되는 실행기 또는 모든 실행기가 사용한 CPU 시스템 로드 부분(규모: 0\$11).
  + [`glue.driver.system.cpuSystemLoad`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.system.cpuSystemLoad)
  + [`glue.executorId.system.cpuSystemLoad`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.system.cpuSystemLoad)
  + [`glue.ALL.system.cpuSystemLoad`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.system.cpuSystemLoad)

![\[AWS Glue 콘솔의 [지표(Metrics)] 탭의 CPU 로드 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/job_detailed_cpu.png)


**Example 작업 실행 그래프**  
작업 실행 그래프는 다음 측정치를 표시합니다.  
+ 능동적으로 실행 중인 실행기 수 - [`glue.driver.ExecutorAllocationManager.executors.numberAllExecutors`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberAllExecutors)
+ 완료된 단계 수 - [`glue.aggregate.numCompletedStages`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.numCompletedStages)
+ 최대 필요 실행기 수 - [`glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors)

![\[AWS Glue 콘솔의 [지표(Metrics)] 탭의 작업 실행 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/job_detailed_exec.png)


# Apache Spark 웹 UI를 사용하여 작업 모니터링
<a name="monitor-spark-ui"></a>

Apache Spark 웹 UI를 사용하여 AWS Glue 작업 시스템에서 실행 중인 AWS Glue ETL 작업과 AWS Glue 개발 엔드포인트에서 실행 중인 Spark 애플리케이션을 모니터링하고 디버그할 수 있습니다. Spark UI를 사용하면 각 작업에 대해 다음을 확인할 수 있습니다.
+ 각 Spark 단계의 이벤트 타임라인
+ 작업의 방향성 비순환 그래프(DAG)
+ SparkSQL 쿼리에 대한 물리적, 논리적 계획
+ 각 작업에 대한 기본 Spark 환경 변수

Spark 웹 UI 사용에 대한 자세한 내용은 Spark 설명서의 [웹 UI](https://spark.apache.org/docs/3.3.0/web-ui.html)를 참조하십시오. Spark UI 결과를 해석하여 작업 성능을 개선하는 방법에 대한 지침은 AWS 권장 가이드의 [Apache Spark 용 AWS Glue 작업 성능 조정 모범 사례](https://docs.aws.amazon.com/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/introduction.html)를 참조하세요.

 AWS Glue 콘솔에서 Spark UI를 확인할 수 있습니다. 이 기능은 AWS Glue 작업이 AWS Glue 3.0 이상 버전에서 실행되고 새로운 작업의 기본값인 레거시 형식이 아닌 표준 형식으로 생성된 로그가 있는 경우 사용할 수 있습니다. 로그 파일이 0.5GB를 초과하는 경우 AWS Glue 4.0 이상 버전에서 작업 실행에 대한 로그 롤링 지원을 활성화하여 로그 아카이브, 분석 및 문제 해결을 간소화할 수 있습니다.

AWS Glue 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 Spark UI를 활성화할 수 있습니다. Spark UI를 사용하면 AWS Glue 개발 엔드포인트의 AWS Glue ETL 작업과 Spark 애플리케이션은 Amazon Simple Storage Service(Amazon S3)에서 지정한 위치에 Spark 이벤트 로그를 백업할 수 있습니다. 작업이 작동 중일 때와 완료된 후 모두 실시간으로 Amazon S3에서 Spark UI를 통해 백업된 이벤트 로그를 사용할 수 있습니다. 로그가 Amazon S3에 남아 있는 동안 AWS Glue 콘솔의 Spark UI에서 해당 로그를 볼 수 있습니다.

## 권한
<a name="monitor-spark-ui-limitations-permissions"></a>

 AWS Glue 콘솔에서 Spark UI를 사용하려면 `UseGlueStudio`를 사용하거나 모든 개별 서비스 API를 추가할 수 있습니다. Spark UI를 완전히 사용하려면 모든 API가 필요하지만, 사용자는 세분화된 액세스를 위해 IAM 권한에 해당 서비스 API를 추가하여 SparkUI 기능에 액세스할 수 있습니다.

 `RequestLogParsing`은 로그 구문 분석을 수행하므로 가장 중요합니다. 나머지 API는 각각의 구문 분석된 데이터를 읽는 데 사용됩니다. 예를 들어 `GetStages`는 Spark 작업의 모든 단계에 대한 데이터에 액세스할 수 있습니다.

 `UseGlueStudio`에 매핑된 Spark UI 서비스 API 목록은 아래 샘플 정책에 나와 있습니다. 아래 정책은 Spark UI 기능만 사용할 수 있는 액세스 권한을 제공합니다. Amazon S3 및 IAM과 같은 권한을 더 추가하려면 [AWS Glue Studio에 대한 사용자 지정 IAM 정책 만들기](https://docs.aws.amazon.com/glue/latest/dg/getting-started-min-privs.html#getting-started-all-gs-privs.html)를 참조하세요.

 `UseGlueStudio`에 매핑된 Spark UI 서비스 API 목록은 아래 샘플 정책에 나와 있습니다. Spark UI 서비스 API를 사용할 때는 다음 네임스페이스를 사용하세요. `glue:<ServiceAPI>` 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGlueStudioSparkUI",
      "Effect": "Allow",
      "Action": [
        "glue:RequestLogParsing",
        "glue:GetLogParsingStatus",
        "glue:GetEnvironment",
        "glue:GetJobs",
        "glue:GetJob",
        "glue:GetStage",
        "glue:GetStages",
        "glue:GetStageFiles",
        "glue:BatchGetStageFiles",
        "glue:GetStageAttempt",
        "glue:GetStageAttemptTaskList",
        "glue:GetStageAttemptTaskSummary",
        "glue:GetExecutors",
        "glue:GetExecutorsThreads",
        "glue:GetStorage",
        "glue:GetStorageUnit",
        "glue:GetQueries",
        "glue:GetQuery"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

## 제한 사항
<a name="monitor-spark-ui-limitations"></a>
+ AWS Glue 콘솔의 Spark UI는 레거시 로그 형식이므로 2023년 11월 20일 이전에 발생한 작업 실행에는 사용할 수 없습니다.
+  AWS Glue 콘솔의 Spark UI는 스트리밍 작업에서 기본적으로 생성되는 로그와 같이 AWS Glue 4.0에 대한 로그 롤링을 지원합니다. 생성된 모든 롤링된 로그 이벤트 파일의 최대 합계는 2GB입니다. 롤링된 로그를 지원하지 않는 AWS Glue 작업의 경우 SparkUI에 대해 지원되는 최대 로그 이벤트 파일 크기는 0.5GB입니다.
+  VPC에서만 액세스할 수 있는 Amazon S3 버킷에 저장된 Spark 이벤트 로그에 대해서는 서버리스 Spark UI를 사용할 수 없습니다.

## 예: Apache Spark 웹 UI
<a name="monitor-spark-ui-limitations-example"></a>

이 예제에서는 Spark UI를 사용하여 작업 성과를 이해하는 방법을 보여줍니다. 스크린샷은 자체 관리형 Spark 기록 서버에서 제공하는 Spark 웹 UI를 보여줍니다. AWS Glue 콘솔의 Spark UI에서도 비슷한 화면을 볼 수 있습니다. Spark 웹 UI 사용에 대한 자세한 내용은 Spark 설명서의 [웹 UI](https://spark.apache.org/docs/3.3.0/web-ui.html)를 참조하십시오.

다음은 Spark 애플리케이션에서 두 데이터 소스의 데이터를 읽고 조인 변환을 수행하여 Parquet 형식으로 Amazon S3에 쓰는 예제입니다.

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql.functions import count, when, expr, col, sum, isnull
from pyspark.sql.functions import countDistinct
from awsglue.dynamicframe import DynamicFrame
 
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
 
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
 
job = Job(glueContext)
job.init(args['JOB_NAME'])
 
df_persons = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/persons.json")
df_memberships = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/memberships.json")
 
df_joined = df_persons.join(df_memberships, df_persons.id == df_memberships.person_id, 'fullouter')
df_joined.write.parquet("s3://aws-glue-demo-sparkui/output/")
 
job.commit()
```

다음 DAG 시각화는 이 Spark 작업의 여러 단계를 보여줍니다.

![\[작업 0의 완료된 2단계를 보여주는 Spark UI의 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/spark-ui1.png)


작업에 대한 다음 이벤트 타임라인은 다양한 Spark 실행기의 시작, 실행 및 종료를 보여줍니다.

![\[다양 Spark 실행기의 완료, 실패 및 활성 단계를 보여주는 Spark UI의 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/spark-ui2.png)


다음 화면은 SparkSQL 쿼리 계획의 세부 정보를 보여줍니다.
+ 구문 분석된 논리적 계획
+ 분석된 논리적 계획
+ 최적화된 논리적 계획
+ 실행할 물리적 계획

![\[SparkSQL 쿼리 계획 : 구문 분석, 분석 및 최적화된 논리적 계획과 실행할 물리적 계획.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/spark-ui3.png)


**Topics**
+ [권한](#monitor-spark-ui-limitations-permissions)
+ [제한 사항](#monitor-spark-ui-limitations)
+ [예: Apache Spark 웹 UI](#monitor-spark-ui-limitations-example)
+ [AWS Glue 작업을 위한 Apache Spark 웹 UI 사용 설정](monitor-spark-ui-jobs.md)
+ [Spark 기록 서버 시작](monitor-spark-ui-history.md)

# AWS Glue 작업을 위한 Apache Spark 웹 UI 사용 설정
<a name="monitor-spark-ui-jobs"></a>

Apache Spark 웹 UI를 사용하여 AWS Glue 작업 시스템에서 실행 중인 AWS Glue ETL 작업을 모니터링하고 디버그할 수 있습니다. AWS Glue 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 Spark UI를 구성할 수 있습니다.

30초마다 AWS Glue가 Spark 이벤트 로그를 지정한 Amazon S3 경로로 백업합니다.

**Topics**
+ [Spark UI 구성(콘솔)](#monitor-spark-ui-jobs-console)
+ [Spark UI 구성(AWS CLI)](#monitor-spark-ui-jobs-cli)
+ [노트북을 사용하여 세션에 대한 Spark UI 구성](#monitor-spark-ui-sessions)
+ [롤링 로그 활성화](#monitor-spark-ui-rolling-logs)

## Spark UI 구성(콘솔)
<a name="monitor-spark-ui-jobs-console"></a>

AWS Management Console을 사용하여 Spark UI를 구성하려면 다음 단계를 따르세요. AWS Glue 작업을 생성할 때 Spark UI는 기본으로 활성화됩니다.

**작업을 생성하거나 편집할 때 Spark UI를 켜려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서, **작업**을 선택합니다.

1. **작업 추가**를 선택하거나 기존 작업을 선택합니다.

1. **작업 세부 정보**에서 **고급 속성**을 엽니다.

1. **Spark UI** 탭에서 **Amazon S3에 Spark UI 로그 쓰기**를 선택합니다.

1. 작업의 Spark 이벤트 로그를 저장할 Amazon S3 경로를 지정합니다. 작업에서 보안 구성을 사용하는 경우 암호화는 Spark UI 로그 파일에도 적용됩니다. 자세한 내용은 [AWS Glue에서 작성한 데이터 암호화](encryption-security-configuration.md) 섹션을 참조하세요.

1. **Spark UI 로깅 및 모니터링** 구성에서:
   + AWS Glue 콘솔에서 볼 로그를 생성하는 경우 **표준**을 선택합니다.
   + Spark 기록 서버에서 볼 로그를 생성하는 경우 **레거시**를 선택합니다.
   + 둘 다 생성하도록 선택할 수도 있습니다.

## Spark UI 구성(AWS CLI)
<a name="monitor-spark-ui-jobs-cli"></a>

AWS CLI를 사용하여 AWS Glue 콘솔에서 Spark UI로 볼 로그를 생성하려면 다음 작업 파라미터를 AWS Glue 작업에 전달합니다. 자세한 내용은 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 섹션을 참조하세요.

```
'--enable-spark-ui': 'true',
'--spark-event-logs-path': 's3://s3-event-log-path'
```

기존 위치에 로그를 배포하려면 `--enable-spark-ui-legacy-path` 파라미터를 `"true"`로 설정합니다. 두 가지 형식으로 로그를 생성하지 않으려면 `--enable-spark-ui` 매개변수를 제거하십시오.

## 노트북을 사용하여 세션에 대한 Spark UI 구성
<a name="monitor-spark-ui-sessions"></a>

**주의**  
AWS Glue 대화형 세션은 현재 콘솔의 Spark UI를 지원하지 않습니다. Spark 기록 서버를 구성합니다.

 AWS Glue 노트북을 사용하는 경우 세션을 시작하기 전에 SparkUI 구성을 설정합니다. 이렇게 하려면 `%%configure` 셀 매직을 사용합니다.

```
%%configure { “--enable-spark-ui”: “true”, “--spark-event-logs-path”: “s3://path” }
```

## 롤링 로그 활성화
<a name="monitor-spark-ui-rolling-logs"></a>

 AWS Glue 작업에 SparkUI 및 로그 이벤트 파일 롤링을 활성화하면 다음과 같은 몇 가지 이점이 있습니다.
+  로그 이벤트 파일 롤링 - 로그 이벤트 파일 롤링이 활성화된 상태에서 AWS Glue는 작업 실행의 각 단계에 대해 별도의 로그 파일을 생성하므로 특정 단계 또는 변환과 관련된 문제를 쉽게 식별하고 해결할 수 있습니다.
+  더 나은 로그 관리 - 로그 이벤트 파일을 롤링하면 로그 파일을 더 효율적으로 관리하는 데 도움이 됩니다. 잠재적으로 큰 단일 로그 파일을 보유하는 대신, 작업 실행 단계에 따라 더 작고 관리 가능한 파일로 로그가 분할됩니다. 이렇게 하면 로그 아카이빙, 분석 및 문제 해결을 간소화할 수 있습니다.
+  내결함성 개선 - AWS Glue 작업이 실패하거나 중단되는 경우 로그 이벤트 파일 롤링은 마지막 성공 단계에 대한 중요한 정보를 제공할 수 있으므로 처음부터 시작하는 대신 해당 시점부터 작업을 더 쉽게 재개할 수 있습니다.
+  비용 최적화 - 로그 이벤트 파일 롤링을 활성화하면 로그 파일과 관련된 스토리지 비용을 절감할 수 있습니다. 잠재적으로 큰 단일 로그 파일을 저장하는 대신 더 작고 관리 가능한 로그 파일을 저장합니다. 특히 장기 실행 또는 복잡한 작업의 경우 더 비용 효율적일 수 있습니다.

 새 환경에서 사용자는 다음을 통해 로그 롤링을 명시적으로 활성화할 수 있습니다.

```
'—conf': 'spark.eventLog.rolling.enabled=true'
```

or

```
'—conf': 'spark.eventLog.rolling.enabled=true —conf 
spark.eventLog.rolling.maxFileSize=128m'
```

 로그 롤링이 활성화된 경우 `spark.eventLog.rolling.maxFileSize`에서는 롤오버하기 전 이벤트 로그 파일의 최대 크기를 지정합니다. 지정하지 않으면 이 선택적 파라미터의 기본값은 128MB입니다. 최소 10MB입니다.

 생성된 모든 롤링된 로그 이벤트 파일의 최대 합계는 2GB입니다. 로그 롤링을 지원하지 않는 AWS Glue 작업의 경우 SparkUI에 대해 지원되는 최대 로그 이벤트 파일 크기는 0.5GB입니다.

추가 구성을 전달하여 스트리밍 작업에 대한 롤링 로그를 끌 수 있습니다. 로그 파일이 매우 크면 유지 관리 비용이 많이 들 수 있습니다.

롤링 로그를 끄려면 다음 구성을 제공하십시오.

```
'--spark-ui-event-logs-path': 'true',
'--conf': 'spark.eventLog.rolling.enabled=false'
```

# Spark 기록 서버 시작
<a name="monitor-spark-ui-history"></a>

Spark 기록 서버를 사용하여 자체 인프라에서 Spark 로그를 시각화할 수 있습니다. AWS Glue 콘솔에서는 AWS Glue 4.0 이상 버전의 AWS Glue 작업 실행에 대한 동일한 시각화를 레거시 형식이 아닌 표준 형식으로 생성된 로그와 함께 볼 수 있습니다. 자세한 내용은 [Apache Spark 웹 UI를 사용하여 작업 모니터링](monitor-spark-ui.md) 섹션을 참조하세요.

EC2 인스턴스에서 서버를 호스팅하는 AWS CloudFormation 템플릿을 사용하여 Spark 기록 서버를 시작하거나 Docker를 사용하여 로컬로 시작할 수 있습니다.

**Topics**
+ [AWS CloudFormation을 사용하여 Spark 기록 서버 시작 및 Spark UI 보기](#monitor-spark-ui-history-cfn)
+ [Docker를 사용하여 Spark 기록 서버 시작 및 Spark UI 보기](#monitor-spark-ui-history-local)

## AWS CloudFormation을 사용하여 Spark 기록 서버 시작 및 Spark UI 보기
<a name="monitor-spark-ui-history-cfn"></a>

AWS CloudFormation 템플릿을 사용하여 Apache Spark 기록 서버를 시작하고 Spark 웹 UI를 볼 수 있습니다. 이 템플릿은 요구 사항에 맞게 수정해야 하는 샘플입니다.

**CloudFormation을 사용하여 Spark History Server를 시작하고 Spark UI를 보려면**

1. 다음 표에서 **스택 시작** 버튼 중 하나를 선택하십시오. 그러면 CloudFormation 콘솔에서 스택이 시작됩니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitor-spark-ui-history.html)

1. **Specify template(템플릿 지정)** 페이지에서 **다음**을 선택합니다.

1. **스택 세부 정보 지정** 페이지에서 **스택 이름**을 입력합니다. **파라미터(Parameters)** 아래에 추가 정보를 입력합니다.

   1. 

**Spark UI 구성**

      다음 정보를 제공합니다.
      + [**IP 주소 범위(IP address range)**] - Spark UI를 보는 데 사용할 수 있는 IP 주소 범위입니다. 특정 IP 주소 범위의 액세스를 제한하려면 사용자 지정 값을 사용해야 합니다.
      + [**기록 서버 포트(History server port)**] - Spark UI의 포트입니다. 기본값을 사용할 수 있습니다.
      + [**이벤트 로그 디렉터리(Event log directory)**] - AWS Glue 작업 또는 개발 엔드포인트에서 Spark 이벤트 로그가 저장되는 위치를 선택합니다. 이벤트 로그 경로 체계에 **s3a://**를 사용해야 합니다.
      + [**Spark 패키지 위치(Spark package location)**] - 기본값을 사용할 수 있습니다.
      + [**키 스토어 경로(Keystore path)**] - HTTPS의 SSL/TLS 키 스토어 경로입니다. 사용자 지정 키 스토어 파일을 사용하려면 여기에서 S3 경로 `s3://path_to_your_keystore_file`을 지정하면 됩니다. 이 파라미터를 비워두면 자체 서명된 인증서 기반 키 스토어가 생성되어 사용됩니다.
      + **키 스토어 암호(Keystore password)** - HTTPS에 대한 SSL/TLS 키 스토어 암호를 입력합니다.

   1. 

**EC2 인스턴스 구성**

      다음 정보를 제공합니다.
      + [**인스턴스 유형(Instance type)**] - Spark 기록 서버를 호스팅하는 Amazon EC2 인스턴스 유형입니다. 이 템플릿은 계정에서 Amazon EC2 인스턴스를 시작하므로 계정에 별도로 Amazon EC2 비용이 청구됩니다.
      + [**최신 AMI ID(Latest AMI ID)**] - Spark 기록 서버 인스턴스에 대한 Amazon Linux 2의 AMI ID입니다. 기본값을 사용할 수 있습니다.
      + [**VPC ID**] - Spark 기록 서버 인스턴스의 Virtual Private Cloud(VPC) ID입니다. 계정에 제공된 모든 VPC를 사용할 수 있습니다. [기본 네트워크 ACL](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#default-network-acl)과 함께 기본 VPC를 사용하지 않는 것이 좋습니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [기본 VPC 및 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)과 [VPC 생성](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC)을 참조하세요.
      + [**서브넷 ID(Subnet ID)**] - Spark 기록 서버 인스턴스의 ID입니다. VPC의 모든 서브넷을 사용할 수 있습니다. 클라이언트에서 서브넷으로 네트워크에 도달할 수 있어야 합니다. 인터넷을 통해 액세스하려면 라우팅 테이블에 인터넷 게이트웨이가 있는 퍼블릭 서브넷을 사용해야 합니다.

   1. **다음**을 선택합니다.

1. **스택 옵션 구성(Configure stack options)** 페이지에서 현재 사용자 자격 증명을 사용하여 CloudFormation이 스택의 리소스를 생성, 수정 또는 삭제하는 방식을 확인하려면 **다음(Next)**을 선택합니다. **권한** 섹션에서 현재 사용자 권한 대신 사용할 역할을 지정하고 **다음**을 선택할 수도 있습니다.

1. **검토** 페이지에서 설정을 확인합니다.

   **CloudFormation에서 IAM 리소스를 생성할 수 있음을 승인합니다**를 선택하고 **스택 생성**을 선택합니다.

1. 스택이 생성되기를 기다립니다.

1. **출력** 탭을 클릭합니다.

   1. 퍼블릭 서브넷을 사용하는 경우 **SparkUiPublicUrl**의 URL을 복사하십시오.

   1. 프라이빗 서브넷을 사용하는 경우 **SparkUiPrivateUrl**의 URL을 복사하십시오.

1. 웹 브라우저를 열고 URL에 붙여 넣습니다. 지정된 포트에서 HTTPS를 사용하여 서버에 액세스할 수 있습니다. 브라우저가 서버 인증을 인식하지 못할 수 있어 서버 보호를 재정의하여 실행해야 합니다.

## Docker를 사용하여 Spark 기록 서버 시작 및 Spark UI 보기
<a name="monitor-spark-ui-history-local"></a>

로컬 액세스를 선호하는 경우(Apache Spark 기록 서버에 EC2 인스턴스가 없는 경우) Docker를 사용하여 Apache Spark 기록 서버를 시작하고 Spark UI를 로컬로 볼 수도 있습니다. 이 Dockerfile은 요구 사항에 맞게 수정해야 하는 샘플입니다.

 **사전 조건** 

노트북에 도커를 설치하는 방법에 대한 자세한 내용은 [Docker Engine community](https://docs.docker.com/install/)를 참조하십시오.

**Docker를 사용하여 로컬로 Spark History Server를 시작하고 Spark UI를 보려면**

1. GitHub에서 파일을 다운로드하십시오.

   [ AWS Glue 코드 샘플](https://github.com/aws-samples/aws-glue-samples/tree/master/utilities/Spark_UI/)에서 Dockerfile과 `pom.xml`을 다운로드합니다.

1. AWS에 액세스하는 데 사용자 자격 증명을 사용할지 또는 페더레이션 사용자 자격 증명을 사용할지 결정합니다.
   + 현재 사용자 자격 증명을 사용하여 AWS에 액세스하려면 `docker run` 명령의 ` AWS_ACCESS_KEY_ID`와 `AWS_SECRET_ACCESS_KEY`에 사용할 값을 가져옵니다. 자세한 내용은 * IAM 사용 설명서*의 [IAM 사용자의 액세스 키 관리](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)를 참조하세요.
   + SAML 2.0 페더레이션 사용자를 사용하여 AWS에 액세스하려면 ` AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` 및 ` AWS_SESSION_TOKEN`의 값을 가져옵니다. 자세한 내용은 [임시 보안 자격 증명 요청](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)을 참조하세요.

1. `docker run` 명령에서 사용할 이벤트 로그 디렉터리의 위치를 결정합니다.

1. 이름 ` glue/sparkui` 및 태그 `latest`를 사용하여 로컬 디렉터리의 파일을 통해 Docker 이미지를 구축합니다.

   ```
   $ docker build -t glue/sparkui:latest . 
   ```

1. Docker 컨테이너를 생성하고 시작합니다.

   다음 명령에서는 이전 2단계와 3단계에서 얻은 값을 사용합니다.

   1. 사용자 자격 증명을 사용하여 Docker 컨테이너를 생성하려면 다음과 비슷한 명령을 사용합니다.

      ```
      docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=s3a://path_to_eventlog
       -Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY"
       -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
      ```

   1. 임시 자격 증명을 사용하여 Docker 컨테이너를 생성하려면 ` org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider`를 공급자로 사용하고 2단계에서 얻은 자격 증명 값을 제공합니다. 자세한 내용은 *Hadoop: Amazon Web Services와 통합* 설명서의 [TemporaryAWSCredentialsProvider로 세션 자격 증명 사용](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html#Using_Session_Credentials_with_TemporaryAWSCredentialsProvider)을 참조하세요.

      ```
      docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=s3a://path_to_eventlog
       -Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY
       -Dspark.hadoop.fs.s3a.session.token=AWS_SESSION_TOKEN
       -Dspark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider"
       -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
      ```
**참고**  
이러한 구성 파라미터는 [ Hadoop-AWS 모듈](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html)에서 나옵니다. 사용 사례를 바탕으로 특정 구성을 추가해야 할 수 있습니다. 예를 들어, 격리된 리전에 있는 사용자는 ` spark.hadoop.fs.s3a.endpoint`를 구성해야 합니다.

1. 브라우저에서 `http://localhost:18080`을 열어 로컬로 Spark UI를 봅니다.

# AWS Glue 작업 실행 인사이트를 사용한 모니터링
<a name="monitor-job-insights"></a>

AWS Glue 작업 실행 인사이트는 작업 디버깅 및 AWS Glue 작업의 최적화를 간소화해 주는 AWS Glue의 기능입니다. AWS Glue는 AWS Glue 작업을 모니터링할 수 있도록 [Spark UI](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui.html)와 [CloudWatch 로그 및 지표](https://docs.aws.amazon.com/glue/latest/dg/monitor-cloudwatch.html)를 제공합니다. 이 기능을 사용하면 AWS Glue 작업의 실행에 대해 다음과 같은 정보를 확인할 수 있습니다.
+ 실패가 발생한 AWS Glue 작업 스크립트의 행 번호
+ 작업 실패가 발생하기 직전에 Spark 쿼리 계획에서 마지막으로 실행된 Spark 작업
+ 실패와 관련된 Spark 예외 이벤트의 시간순으로 된 로그 스트림
+ 근본 원인 분석 및 문제 해결을 위한 권장 작업(예: 스크립트 튜닝)
+ 일반적인 Spark 이벤트(Spark 작업과 관련된 로그 메시지)와 근본 원인 해결을 위한 권장 작업

이러한 인사이트는 AWS Glue 작업의 CloudWatch 로그에 추가된 2가지 로그 스트림을 사용하여 확인할 수 있습니다.

## 요구 사항
<a name="monitor-job-insights-requirements"></a>

AWS Glue 작업 실행 인사이트 기능은 AWS Glue 버전 2.0 이상에서 사용할 수 있습니다. 기존 작업의 [마이그레이션 가이드](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-30.html)에 따라 이전 버전의 AWS Glue에서 업그레이드할 수 있습니다.

## AWS Glue ETL 작업에 대해 작업 실행 인사이트 활성화
<a name="monitor-job-insights-enable"></a>

작업 실행 인사이트는 AWS Glue Studio 또는 CLI를 통해 활성화할 수 있습니다.

### AWS Glue Studio
<a name="monitor-job-insights-requirements"></a>

AWS Glue Studio를 통해 작업을 생성할 때는 **Job Details**(작업 세부 정보) 탭에서 작업 실행 인사이트를 활성화 또는 비활성화할 수 있습니다. **작업 인사이트 생성** 상자가 선택되어 있는지 확인합니다.

![\[AWS Glue Studio에서 작업 실행 인사이트 활성화.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-job-run-insights-1.png)


### 명령줄
<a name="monitor-job-insights-enable-cli"></a>

CLI를 통해 작업을 생성할 때는 새로 추가된 단일 [작업 파라미터](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html) `--enable-job-insights = true`를 사용하여 작업 실행을 시작할 수 있습니다.

기본적으로 작업 실행 인사이트 로그 스트림은 [AWS Glue 연속 로깅](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging.html)에서 사용되는 것과 동일한 기본 로그 그룹인 `/aws-glue/jobs/logs-v2/` 아래에 생성됩니다. 연속 로깅에 사용된 것과 동일한 인수 세트를 사용하여 사용자 지정 로그 그룹 이름, 로그 필터 및 로그 그룹 구성을 설정할 수 있습니다. 자세한 내용은 [Enabling Continuous Logging for AWS Glue Jobs](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging-enable.html)(작업에 대해 연속 로깅 활성화)를 참조하세요.

## CloudWatch에서 작업 실행 인사이트 로그 스트림에 액세스
<a name="monitor-job-insights-access"></a>

작업 실행 인사이트 기능이 활성화된 상태에서 작업 실행이 실패할 경우 2가지 로그 스트림이 생성될 수 있습니다. 작업이 성공적으로 완료되면 2가지 스트림 모두 생성되지 않습니다.

1. *예외 분석 로그 스트림*: `<job-run-id>-job-insights-rca-driver`. 이 스트림은 다음과 같은 정보를 제공합니다.
   + 실패의 원인이 된 AWS Glue 작업 스크립트의 행 번호.
   + Spark 쿼리 계획(DAG)에서 마지막으로 실행된 Spark 작업.
   + Spark 드라이버 및 실행기의 예외와 관련 있는 시간순 이벤트. 필요한 경우 전체 오류 메시지, 실패한 Spark 작업과 해당 실행기 ID(특정 실행기의 로그 스트림을 살펴보는 데 사용)와 같은 세부 정보를 볼 수 있습니다.

1. *규칙 기반 인사이트 스트림*: 
   + 근본 원인 분석 및 오류 수정을 위한 권장 사항(예: 특정 작업 파라미터를 사용하여 성능 최적화).
   + 근본 원인 분석의 기반이 되는 관련 있는 Spark 이벤트 및 권장 작업.

**참고**  
첫 번째 스트림은 실패한 작업 실행의 예외 Spark 이벤트가 있는 경우에만 생성되고, 두 번째 스트림은 실패한 작업 실행에 대한 인사이트가 있는 경우에만 생성됩니다. 예를 들어, 작업이 성공적으로 완료되었다면 2가지 스트림 모두 생성되지 않고, 작업이 실패했으나 실패 시나리오와 일치하는 서비스 정의 규칙이 없는 경우에는 첫 번째 스트림만 생성됩니다.

작업이 AWS Glue Studio에서 생성되었다면 Job Run Details(작업 실행 세부 정보) 탭 아래의 Job run insights(작업 실행 인사이트)에 위 스트림의 링크가 각각 ‘Concise and consolidated error logs’(간결하고 통합된 오류 로그) 및 ‘Error analysis and guidance’(오류 분석 및 가이드)로 표시됩니다.

![\[로그 스트림 링크가 표시된 Job Run Details(작업 실행 세부 정보) 페이지.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-job-run-insights-2.png)


## AWS Glue 작업 실행 인사이트의 예
<a name="monitor-job-insights-example"></a>

이 섹션에서는 작업 실행 인사이트 기능을 사용하여 실패한 작업의 문제를 해결하는 방법을 예를 통해 살펴봅니다. 이 예제에서는 사용자가 AWS Glue 작업에서 데이터에 대한 기계 학습 모델을 분석 및 빌드하는 데 필요한 모듈(tensorflow)을 가져오지 않았습니다.

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql.types import *
from pyspark.sql.functions import udf,col

args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

data_set_1 = [1, 2, 3, 4]
data_set_2 = [5, 6, 7, 8]

scoresDf = spark.createDataFrame(data_set_1, IntegerType())

def data_multiplier_func(factor, data_vector):
    import tensorflow as tf
    with tf.compat.v1.Session() as sess:
        x1 = tf.constant(factor)
        x2 = tf.constant(data_vector)
        result = tf.multiply(x1, x2)
        return sess.run(result).tolist()

data_multiplier_udf = udf(lambda x:data_multiplier_func(x, data_set_2), ArrayType(IntegerType(),False))
factoredDf = scoresDf.withColumn("final_value", data_multiplier_udf(col("value")))
print(factoredDf.collect())
```

작업 실행 인사이트 기능이 없다면 작업이 실패해도 Spark에 의해 발생된 다음과 같은 메시지만 볼 수 있습니다.

`An error occurred while calling o111.collectToPython. Traceback (most recent call last):`

이 메시지는 명확하지 않으므로 디버깅에 큰 도움이 되지 않습니다. 작업 실행 인사이트 기능은 다음과 같은 2가지 CloudWatch 로그 스트림을 통해 추가 인사이트를 제공합니다.

1. `job-insights-rca-driver` 로그 스트림:
   + *예외 이벤트*: 이 로그 스트림에서 Spark 드라이버 및 여러 분산 작업자로부터 수집된, 실패와 관련 있는 Spark 예외 이벤트를 볼 수 있습니다. 이러한 이벤트를 검토하면 여러 AWS Glue 작업자에 분산된 Spark 작업, 실행기 및 단계에서 결함 있는 코드가 실행되는 과정에서 예외가 전파된 상황을 시간순으로 살펴볼 수 있습니다.
   + *행 번호*: 이 로그 스트림에서 누락된 Python 모듈 가져오기를 호출하여 실패의 원인이 된 것이 21번 행이고 스크립트에서 마지막으로 실행된 Spark 작업 `collect()`의 호출은 24번 행인 것을 알 수 있습니다.  
![\[job-insights-rca-driver 로그 스트림.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-job-run-insights-3.png)

1. `job-insights-rule-driver` 로그 스트림:
   + *근본 원인 분석 및 권장 사항*: 스크립트에서 결함이 되는 행 번호와 마지막으로 실행된 행 번호 외에도 이 로그 스트림에서는 근본 원인 분석과 권장 사항(AWS Glue 작업에서 추가 Python 모듈을 사용하려면 AWS Glue 문서에 따라 필요한 작업 파라미터를 설정할 것)을 볼 수 있습니다.
   + *기본 이벤트*: 이 로그 스트림에서는 근본 원인을 유추할 수 있도록, 서비스 정의 규칙을 사용하여 평가된 Spark 예외 이벤트를 볼 수 있으며 권장 사항을 제공합니다.  
![\[job-insights-rule-driver 로그 스트림.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-job-run-insights-4.png)

# Amazon CloudWatch를 사용한 모니터링
<a name="monitor-cloudwatch"></a>

AWS Glue에서 원시 데이터를 수집하여 읽기 가능하며 실시간에 가까운 지표로 처리하는 Amazon CloudWatch를 통해 AWS Glue를 모니터링할 수 있습니다. 이러한 통계는 2주간 기록되므로 기록 정보에 액세스하여 웹 애플리케이션 또는 서비스가 어떻게 실행되고 있는지 전체적으로 더 잘 파악할 수 있습니다. 기본적으로 AWS Glue 지표 데이터는 CloudWatch에 자동으로 전송됩니다. 자세한 내용은 [AWS Glue 지표](monitoring-awsglue-with-cloudwatch-metrics.md#awsglue-metrics) 및 *Amazon CloudWatch User Guide*의 [What Is Amazon CloudWatch?](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatch.html)를 참조하세요.

 **연속 로깅** 

AWS Glue에서도 AWS Glue 작업에 대한 실시간 지속 로깅을 지원합니다. 작업에 대한 지속 로깅이 활성화되어 있으면 AWS Glue 콘솔 또는 CloudWatch 콘솔 대시보드에서 실시간 로그를 볼 수 있습니다. 자세한 내용은 [AWS Glue 작업의 로깅](monitor-continuous-logging.md) 섹션을 참조하세요.

 **관찰성 메트릭** 

 **작업 관찰성 지표**가 활성화되면 작업이 실행될 때 추가 Amazon CloudWatch 지표가 생성됩니다. AWS Glue 관찰성 메트릭을 사용하면 AWS Glue 내부에서 일어나는 일에 대한 통찰력을 얻어 문제의 분류 및 분석을 개선할 수 있습니다.

**Topics**
+ [Amazon CloudWatch 지표를 사용하여 AWS Glue 모니터링](monitoring-awsglue-with-cloudwatch-metrics.md)
+ [AWS Glue 작업 프로파일에서 Amazon CloudWatch 경보 설정](monitor-profile-glue-job-cloudwatch-alarms.md)
+ [AWS Glue 작업의 로깅](monitor-continuous-logging.md)
+ [AWS Glue 관찰성 메트릭을 사용한 모니터링](monitor-observability.md)

# Amazon CloudWatch 지표를 사용하여 AWS Glue 모니터링
<a name="monitoring-awsglue-with-cloudwatch-metrics"></a>

AWS Glue 작업 프로파일러를 사용하여 AWS Glue 작업을 프로파일링하고 모니터링할 수 있습니다. AWS Glue 작업에서 원시 데이터를 수집한 후 Amazon CloudWatch에 저장된 판독이 가능한 지표로 실시간에 가깝게 처리합니다. 이러한 통계는 CloudWatch에서 보관 및 집계되므로 기록 정보에 액세스하여 애플리케이션이 어떻게 실행되고 있는지 전체적으로 더 잘 파악할 수 있습니다.

**참고**  
 작업 지표를 활성화하고 CloudWatch 사용자 지정 지표를 생성하면 추가 요금이 발생할 수 있습니다. 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

## AWS Glue 지표 개요
<a name="metrics-overview"></a>

AWS Glue는 사용자와 상호 작용할 때 지표를 CloudWatch로 전송합니다. AWS Glue 콘솔(기본 방법), CloudWatch 콘솔 대시보드 또는 AWS Command Line Interface(AWS CLI)를 사용하여 이러한 지표를 볼 수 있습니다.

**AWS Glue 콘솔 대시보드를 사용하여 지표를 보려면**

작업에 대한 요약이나 세부 그래프, 또는 작업 실행에 대한 세부 그래프를 볼 수 있습니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 **작업 실행 모니터링**을 선택합니다.

1. **작업 실행**에서 현재 실행 중인 **작업**을 중지하거나, 작업을 보거나, 작업 북마크를 되돌립니다.

1. 작업을 선택한 다음 **실행 세부 정보 보기**를 선택하여 작업 실행에 대한 추가 정보를 확인합니다.

**CloudWatch 콘솔 대시보드를 사용하여 지표를 보려면**

지표는 먼저 서비스 네임스페이스별로 그룹화된 다음 각 네임스페이스 내에서 다양한 차원 조합별로 그룹화됩니다.

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **지표**를 선택합니다.

1. **Glue** 네임스페이스를 선택합니다.

**AWS CLI을(를) 사용하여 지표를 보려면**
+ 명령 프롬프트에서 다음 명령을 사용합니다.

  ```
  1. aws cloudwatch list-metrics --namespace Glue
  ```

AWS Glue는 30초마다 CloudWatch에 지표를 보고하며, CloudWatch 지표 대시보드는 1분마다 이러한 지표를 표시하도록 구성되어 있습니다. AWS Glue 지표는 이전에 보고한 값의 델타 값을 나타냅니다. 적절한 경우 지표 대시보드는 30초 값을 집계(합)하여 마지막 1분 전체에 대한 값을 얻습니다.

### Spark 작업에 대한 AWS Glue 지표 동작
<a name="metrics-overview-spark"></a>

 AWS Glue 지표는 스크립트에서 `GlueContext`를 초기화할 때 활성화되며 일반적으로 Apache Spark 작업이 끝날 때만 업데이트됩니다. 이러한 지표는 지금까지 완료된 모든 Spark 작업의 집계 값을 나타냅니다.

그러나 AWS Glue가 CloudWatch로 전달하는 Spark 지표는 일반적으로 보고되는 시점의 현재 상태를 나타내는 절대 값입니다. AWS Glue는 이 지표를 30초마다 CloudWatch로 보고하며, 일반적으로 지표 대시보드에는 마지막 1분 동안 받은 데이터 포인트의 평균이 표시됩니다.

AWS Glue 지표 이름은 모두 다음 접두사 유형 중 하나로 시작합니다.
+ `glue.driver.` – 이 접두사로 시작하는 이름의 지표는 Spark 드라이버의 모든 실행기에서 집계된 AWS Glue 지표 또는 Spark 드라이버에 해당하는 Spark 지표를 나타냅니다.
+ `glue.`*executorId*`.` – *executorId*는 특정 Spark 실행기의 번호입니다. 이는 로그에 나열된 실행기에 해당됩니다.
+ `glue.ALL.` – 이름이 이 접두사로 시작하는 지표는 모든 Spark 실행기의 값을 집계합니다.

## AWS Glue 지표
<a name="awsglue-metrics"></a>

AWS Glue는 30초 간격으로 다음 지표를 프로파일링하여 CloudWatch로 전송하며, AWS Glue 지표 대시보드는 1분마다 이들 지표를 보고합니다.


| 지표 | 설명 | 
| --- | --- | 
|  `glue.driver.aggregate.bytesRead` |  모든 실행기에서 실행되는 모든 완료된 Spark 태스크가 모든 데이터 원본에서 읽은 바이트 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 바이트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 지표는 `glue.ALL.s3.filesystem.read_bytes` 지표와 동일한 방식으로 사용할 수 있으며(차이는 이 지표가 Spark 작업 종료 시 업데이트된다는 것) 비 S3 데이터 원본도 캡처합니다.  | 
|  `glue.driver.aggregate.elapsedTime` |  밀리초 단위의 ETL 경과 시간(작업 부트스트랩 시간은 포함하지 않음). 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 밀리초 작업 실행이 평균적으로 얼마나 오래 실행되는지 측정하는 데 사용할 수 있습니다. 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.aggregate.numCompletedStages` |  작업에서 완료된 단계 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.aggregate.numCompletedTasks` |  작업에서 상관관계가 있는 태스크 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.aggregate.numFailedTasks` |  실패한 태스크 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터를 사용하여 데이터, 클러스터 또는 스크립트 이상을 암시하는 실패 증가에 대해 경보를 설정할 수 있습니다.  | 
|  `glue.driver.aggregate.numKilledTasks` |  중지된 태스크 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.aggregate.recordsRead` |  모든 실행기에서 실행되는 모든 완료된 Spark 작업이 모든 데이터 원본에서 읽은 레코드 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 지표는 `glue.ALL.s3.filesystem.read_bytes` 지표와 동일한 방식으로 사용할 수 있으며, 차이는 이 지표가 Spark 작업 종료 시 업데이트된다는 것입니다.  | 
|   `glue.driver.aggregate.shuffleBytesWritten` |  이전 보고 이후 데이터 셔플을 위해 모든 실행기가 기록한 바이트 수(AWS Glue 지표 대시보드가 이 목적으로 이전 1분 동안 기록된 바이트 수로 집계). 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 바이트 다음을 모니터링하는 데 사용: 작업(대규모 joins, groupBy, repartition, coalesce) 내 데이터 셔플. 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.aggregate.shuffleLocalBytesRead` |  이전 보고 이후 데이터 셔플을 위해 모든 실행기가 읽은 바이트 수(AWS Glue 지표 대시보드가 이 목적으로 이전 1분 동안 읽은 바이트 수로 집계). 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. 단위: 바이트 다음을 모니터링하는 데 사용: 작업(대규모 joins, groupBy, repartition, coalesce) 내 데이터 셔플. 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.BlockManager.disk.diskSpaceUsed_MB` |  모든 실행기에서 사용된 디스크 공간의 메가바이트 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(게이지). 유효 통계: Average. 이 Spark 지표는 절대값으로 보고됩니다. 단위: 메가바이트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.ExecutorAllocationManager.executors.numberAllExecutors` |  능동적으로 실행 중인 실행기 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(게이지). 유효 통계: Average. 이 Spark 지표는 절대값으로 보고됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors` |  현재 로드를 충족하는 데 필요한 최대 작업 (능동 실행 및 보류) 실행기 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(게이지). 유효한 통계: Maximum. 이 Spark 지표는 절대값으로 보고됩니다. 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.jvm.heap.usage`  `glue.`*executorId*`.jvm.heap.usage`  `glue.ALL.jvm.heap.usage`  |  드라이버, executorId로 식별되는 실행기 또는 모든 실행기에 대해 이 드라이버용 JVM 힙이 사용하는 메모리 부분(규모: 0-1). 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(게이지). 유효 통계: Average. 이 Spark 지표는 절대값으로 보고됩니다. 단위: 퍼센트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.jvm.heap.used`  `glue.`*executorId*`.jvm.heap.used`  `glue.ALL.jvm.heap.used`  |  드라이버, *executorId*로 식별되는 실행기 또는 모든 실행기에 대해 JVM 힙이 사용하는 메모리 바이트 수. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(게이지). 유효 통계: Average. 이 Spark 지표는 절대값으로 보고됩니다. 단위: 바이트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.s3.filesystem.read_bytes`  `glue.`*executorId*`.s3.filesystem.read_bytes`  `glue.ALL.s3.filesystem.read_bytes`  |  이전 보고 이후 드라이버, *executorId*로 식별되는 실행기 또는 모든 실행기가 Amazon S3에서 읽은 바이트 수(AWS Glue 지표 대시보드가 이 목적으로 이전 1분 동안 읽은 바이트 수로 집계). 유효 차원: `JobName`, `JobRunId`, `Type`(게이지). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. AWS Glue 지표 대시보드에서 곡선 아래 영역은 두 작업 실행이 읽은 바이트 수를 시각적으로 비교하는 데 사용할 수 있습니다. 단위: 바이트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 결과 데이터는 다음 용도로 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.s3.filesystem.write_bytes`  `glue.`*executorId*`.s3.filesystem.write_bytes`  `glue.ALL.s3.filesystem.write_bytes`  |  이전 보고 이후 드라이버, *executorId*로 식별되는 실행기 또는 모든 실행기가 Amazon S3에 쓴 바이트 수(AWS Glue 지표 대시보드가 이 목적으로 이전 1분 동안 기록된 바이트 수로 집계). 유효 차원: `JobName`, `JobRunId`, `Type`(게이지). 유효 통계: SUM. 이 지표는 마지막으로 보고된 값의 델타 값입니다. 그러므로 AWS Glue 지표 대시보드에서 SUM 통계가 집계에 사용됩니다. AWS Glue 지표 대시보드에서 곡선 아래 영역은 두 작업 실행이 기록한 바이트 수를 시각적으로 비교하는 데 사용할 수 있습니다. 단위: 바이트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.streaming.numRecords` |  마이크로 배치로 수신된 레코드 수입니다. 이 지표는 AWS Glue 버전 2.0 이상의 AWS Glue 스트리밍 작업에만 사용할 수 있습니다. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: Sum, Maximum, Minimum, Average, Percentile 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.streaming.batchProcessingTimeInMs` |  배치를 처리하는 데 걸리는 시간(밀리초)입니다. 이 지표는 AWS Glue 버전 2.0 이상의 AWS Glue 스트리밍 작업에만 사용할 수 있습니다. 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(개수). 유효 통계: Sum, Maximum, Minimum, Average, Percentile 단위: 수 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.system.cpuSystemLoad`  `glue.`*executorId*`.system.cpuSystemLoad`  `glue.ALL.system.cpuSystemLoad`  |  드라이버, *executorId*로 식별되는 실행기 또는 모든 실행기가 사용한 CPU 시스템 부하 부분(규모: 0-1). 유효 차원: `JobName`(AWS Glue 작업 이름), `JobRunId`(JobRun ID. 또는 `ALL`), `Type`(게이지). 유효 통계: Average. 이 지표는 절대값으로 보고됩니다. 단위: 퍼센트 다음을 모니터링하는 데 사용: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 이 데이터는 다음과 같이 사용할 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 

## AWS Glue 지표의 차원
<a name="awsglue-metricdimensions"></a>

AWS Glue 지표는 AWS Glue 네임스페이스를 사용하며 다음 차원의 지표를 제공합니다.


| 차원 | 설명 | 
| --- | --- | 
|  `JobName`  |  이 차원은 특정 AWS Glue 작업 내 모든 작업 실행의 지표를 필터링합니다.  | 
|  `JobRunId`  |  이 차원은 JobRun ID에 의해 실행되는 특정 AWS Glue 작업 또는 `ALL`의 지표를 필터링합니다.  | 
|  `Type`  |  이 차원은 `count`(집계 값) 또는 `gauge`(특정 시점 값) 기준 지표를 필터링합니다.  | 

자세한 내용은 [Amazon CloudWatch 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)를 참조하세요.

# AWS Glue 작업 프로파일에서 Amazon CloudWatch 경보 설정
<a name="monitor-profile-glue-job-cloudwatch-alarms"></a>

AWS Glue 지표는 Amazon CloudWatch에서도 사용할 수 있습니다. 예약된 작업의 AWS Glue 측정치에 대해 경보를 설정할 수 있습니다.

경보 설정을 위한 몇 가지 일반적인 시나리오는 다음과 같습니다.
+ 메모리 부족(OOM) 발생 작업: 메모리 사용량이 AWS Glue 작업에 대한 드라이버 또는 실행기에 대해 정상 평균을 초과할 때 경보를 설정합니다.
+ 스트래글링 실행기: AWS Glue 작업에서 실행기 수가 오랜 시간 동안 특정 임곗값보다 낮을 때 경보를 설정합니다.
+ 데이터 백로그 또는 재처리: CloudWatch 수학 표현식을 사용하여 워크플로 내 개별 작업의 지표를 비교합니다. 결과 표현식 값(작업이 쓴 바이트 수와 다음 작업이 읽은 바이트 수의 비율 등)에 대해 경보를 트리거할 수 있습니다.

경보 설정에 대한 자세한 지침은 *[Amazon CloudWatch Events User Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/)*의 [Create or Edit a CloudWatch Alarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)을 참조하세요.

CloudWatch를 사용한 모니터링 및 디버깅 시나리오는 [작업 모니터링 및 디버깅](monitor-profile-glue-job-cloudwatch-metrics.md) 섹션을 참조하세요.

# AWS Glue 작업의 로깅
<a name="monitor-continuous-logging"></a>

 AWS Glue 5.0에서는 모든 작업에 실시간 로깅 기능이 제공됩니다. 또한 사용자 지정 구성 옵션을 지정하여 로깅 동작을 조정할 수 있습니다. 이러한 옵션으로는 Amazon CloudWatch 로그 그룹 이름, Amazon CloudWatch 로그 스트림 접두사(AWS Glue 작업 실행 ID 및 드라이버/실행기 ID 앞에 있음), 로그 메시지의 로그 변환 패턴 설정이 있습니다. 이러한 구성을 사용하면 만료 정책이 서로 다른 사용자 지정 Amazon CloudWatch 로그 그룹의 로그를 집계할 수 있습니다. 여기에 더해 사용자 지정 로그 스트림 접두사와 변환 패턴을 사용하여 로그를 보다 효과적으로 분석할 수 있습니다. 이러한 수준의 사용자 지정을 통해 특정 요구 사항에 따라 로그 관리 및 분석을 최적화할 수 있습니다.

## AWS Glue 5.0의 로깅 동작
<a name="monitor-logging-behavior-glue-50"></a>

 기본적으로 시스템 로그, Spark 대몬 로그 및 사용자 AWS Glue Logger 로그는 Amazon CloudWatch의 `/aws-glue/jobs/error` 로그 그룹에 기록됩니다. 반면 사용자 stdout(표준 출력) 및 stderr(표준 오류) 로그는 기본적으로 `/aws-glue/jobs/output` 로그 그룹에 기록됩니다.

## 사용자 지정 로깅
<a name="monitor-logging-custom"></a>

 다음 작업 인수를 사용하여 기본 로그 그룹 및 로그 스트림 접두사를 사용자 지정할 수 있습니다.
+  `--custom-logGroup-prefix`: `/aws-glue/jobs/error` 및 `/aws-glue/jobs/output` 로그 그룹에 대한 사용자 지정 접두사를 지정할 수 있습니다. 사용자 지정 접두사를 입력하는 경우 로그 그룹 이름의 형식은 다음과 같습니다.
  +  `/aws-glue/jobs/error`은 `<customer prefix>/error`이 됩니다.
  +  `/aws-glue/jobs/output `은 `<customer prefix>/output`이 됩니다.
+  `--custom-logStream-prefix`: 로그 그룹 내에 있는 로그 스트림 이름의 사용자 지정 접두사를 지정할 수 있습니다. 사용자 지정 접두사를 입력하는 경우 로그 스트림 이름의 형식은 다음과 같습니다.
  +  `jobrunid-driver`은 `<customer log stream>-driver`이 됩니다.
  +  `jobrunid-executorNum`은 `<customer log stream>-executorNum`이 됩니다.

 사용자 지정 접두사의 검증 규칙 및 제한 사항: 
+  전체 로그 스트림 이름은 1\$1512자여야 합니다.
+  사용자 지정 접두사 자체는 400자로 제한됩니다.
+  사용자 지정 접두사는 정규식 패턴 `[^:\$1]\$1`(허용되는 특수 문자는 '\$1', '-' 및 '/')과 일치해야 합니다.

## 사용자 지정 스크립트 로거를 사용하여 애플리케이션별 메시지 로깅
<a name="monitor-logging-script"></a>

AWS Glue 로거를 사용하면 드라이버 로그 스트림에 실시간으로 전송되는 모든 애플리케이션별 메시지를 스크립트에서 로깅할 수 있습니다.

다음 예제에서는 Python 스크립트를 보여줍니다.

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
```

다음 예제에서는 Scala 스크립트를 보여줍니다.

```
import com.amazonaws.services.glue.log.GlueLogger

object GlueApp {
  def main(sysArgs: Array[String]) {
    val logger = new GlueLogger
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
  }
}
```

## 작업 진행률을 보여주는 진행률 표시줄 사용 설정
<a name="monitor-logging-progress"></a>

AWS Glue는 AWS Glue 작업 실행 상태를 확인하기 위해 `JOB_RUN_ID-progress-bar` 로그 스트림 아래에 실시간 진행률 표시줄을 제공합니다. 현재 `glueContext`를 초기화하는 작업만 지원합니다. `glueContext`를 초기화하지 않고 기본 Spark 작업을 실행하는 경우에는 AWS Glue 진행률 표시줄이 나타나지 않습니다.

이 진행률 표시줄에서는 5초마다 다음 진행률 업데이트를 표시합니다.

```
Stage Number (Stage Name): > (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]
```

## Amazon CloudWatch 로깅을 사용한 보안 구성
<a name="monitor-security-config-logging"></a>

 Amazon CloudWatch 로그에 대한 보안 구성이 활성화되면 AWS Glue는 보안 구성 이름을 포함하는 특정 명명 패턴이 있는 로그 그룹을 생성합니다.

### 보안 구성을 사용한 로그 그룹 이름 지정
<a name="monitor-log-group-naming"></a>

 기본 및 사용자 정의 로그 그룹은 다음과 같습니다.
+  **기본 오류 로그 그룹:** `/aws-glue/jobs/Security-Configuration-Name-role/glue-job-role/error` 
+  **기본 출력 로그 그룹:** `/aws-glue/jobs/Security-Configuration-Name-role/glue-job-role/output` 
+  **사용자 지정 오류 로그 그룹(AWS Glue 5.0):** `custom-log-group-prefix/Security-Configuration-Name-role/glue-job-role/error` 
+  **사용자 지정 출력 로그 그룹(AWS Glue 5.0):** `custom-log-group-prefix/Security-Configuration-Name-role/glue-job-role/output` 

### 필수 IAM 권한
<a name="monitor-logging-iam-permissions"></a>

 Amazon CloudWatch Logs로 보안 구성을 사용하는 경우 IAM 역할 권한에 `logs:AssociateKmsKey` 권한을 추가해야 합니다. 해당 권한이 포함되지 않으면 연속 로깅이 사용 중지됩니다.

 또한 Amazon CloudWatch Logs에 대한 암호화를 구성하려면 Amazon Amazon CloudWatch Logs 사용 설명서의 [AWS Key Management Service를 사용하여 Amazon CloudWatch 로그에서 로그 데이터 암호화](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)를 참조하세요.

### 추가 정보
<a name="additional-info"></a>

 보안 구성 생성에 대한 자세한 내용은 [AWS Glue 콘솔에서 보안 구성 관리](https://docs.aws.amazon.com/glue/latest/dg/console-security-configurations.html)를 참조하세요.

**Topics**
+ [AWS Glue 5.0의 로깅 동작](#monitor-logging-behavior-glue-50)
+ [사용자 지정 로깅](#monitor-logging-custom)
+ [사용자 지정 스크립트 로거를 사용하여 애플리케이션별 메시지 로깅](#monitor-logging-script)
+ [작업 진행률을 보여주는 진행률 표시줄 사용 설정](#monitor-logging-progress)
+ [Amazon CloudWatch 로깅을 사용한 보안 구성](#monitor-security-config-logging)
+ [AWS Glue 4.0 이하 작업에 대한 지속 로깅 활성화](monitor-continuous-logging-enable.md)
+ [AWS Glue 작업 로그 보기](monitor-continuous-logging-view.md)

# AWS Glue 4.0 이하 작업에 대한 지속 로깅 활성화
<a name="monitor-continuous-logging-enable"></a>

**참고**  
 AWS Glue 4.0 이하 버전에서는 지속 로깅이 사용 가능한 기능이었습니다. 하지만 AWS Glue 5.0이 도입됨에 따라 모든 작업에는 실시간 로깅 기능이 제공됩니다. AWS Glue 5.0의 로깅 기능 및 구성 옵션에 대한 자세한 내용은 [AWS Glue 작업의 로깅](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging.html)을 참조하세요.

AWS Glue 콘솔을 사용하거나 AWS Command Line Interface(AWS CLI)를 통해 지속 로깅을 활성화할 수 있습니다.

새 작업을 만들거나 기존 작업을 편집할 때 또는 AWS CLI를 통해 연속 로깅을 사용 설정할 수 있습니다.

Amazon CloudWatch 로그 그룹 이름, AWS Glue 작업 실행 ID 드라이버/실행기 ID 앞의 CloudWatch 로그 스트림 접두사 및 로그 메시지에 대한 로그 변환 패턴 등의 사용자 정의 구성 옵션을 지정할 수도 있습니다. 이러한 구성을 사용하면 만료 정책이 서로 다른 사용자 지정 CloudWatch 로그 그룹에 집계 로그를 설정하고 사용자 지정 로그 스트림 접두사 및 변환 패턴을 사용하여 더 자세히 분석할 수 있습니다.

**Topics**
+ [AWS Management Console 사용](#monitor-continuous-logging-enable-console)
+ [사용자 지정 스크립트 로거를 사용하여 애플리케이션별 메시지 로깅](#monitor-continuous-logging-script)
+ [작업 진행률을 보여주는 진행률 표시줄 사용 설정](#monitor-continuous-logging-progress)
+ [지속 로깅을 사용한 보안 구성](#monitor-logging-encrypt-log-data)

## AWS Management Console 사용
<a name="monitor-continuous-logging-enable-console"></a>

AWS Glue 작업을 생성하거나 편집할 때 콘솔에서 지속 로깅을 활성화하려면 다음 절차를 수행합니다.

**지속 로깅으로 새 AWS Glue 작업을 생성하려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 **ETL 작업**을 선택합니다.

1. **시각적 ETL**을 선택합니다.

1. **작업 세부 정보** 탭에서 **고급 속성** 섹션을 확장합니다.

1. **연속 로깅**에서 **CloudWatch에서 로그 활성화**를 선택합니다.

**기존 AWS Glue 작업에 대한 지속 로깅을 활성화하려면**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서, **작업**을 선택합니다.

1. **작업** 목록에서 기존 작업을 선택합니다.

1. **작업**, **작업 편집**을 선택합니다.

1. **작업 세부 정보** 탭에서 **고급 속성** 섹션을 확장합니다.

1. **연속 로깅**에서 **CloudWatch에서 로그 활성화**를 선택합니다.

### AWS CLI 사용
<a name="monitor-continuous-logging-cli"></a>

지속 로깅을 활성화하려면 작업 파라미터를 AWS Glue 작업에 전달합니다. 다른 AWS Glue 작업 파라미터와 유사한 다음 특수 작업 파라미터를 전달합니다. 자세한 내용은 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 섹션을 참조하세요.

```
'--enable-continuous-cloudwatch-log': 'true'
```

사용자 정의 Amazon CloudWatch 로그 그룹 이름을 지정할 수 있습니다. 지정하지 않으면 기본 로그 그룹 이름은 `/aws-glue/jobs/logs-v2`입니다.

```
'--continuous-log-logGroup': 'custom_log_group_name'
```

사용자 정의 Amazon CloudWatch 로그 스트림 접두사를 지정할 수 있습니다. 지정하지 않으면 기본 로그 스트림 접두사는 작업 실행 ID입니다.

```
'--continuous-log-logStreamPrefix': 'custom_log_stream_prefix'
```

사용자 지정 지속적 로깅 변환 규칙을 지정할 수 있습니다. 지정하지 않으면 기본 변환 패턴은 `%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n`입니다. 변환 패턴은 드라이버 로그 및 실행기 로그에만 적용되며 AWS Glue 진행률 표시줄에는 영향을 주지 않습니다.

```
'--continuous-log-conversionPattern': 'custom_log_conversion_pattern'
```

## 사용자 지정 스크립트 로거를 사용하여 애플리케이션별 메시지 로깅
<a name="monitor-continuous-logging-script"></a>

AWS Glue 로거를 사용하면 드라이버 로그 스트림에 실시간으로 전송되는 모든 애플리케이션별 메시지를 스크립트에서 로깅할 수 있습니다.

다음 예제에서는 Python 스크립트를 보여줍니다.

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
```

다음 예제에서는 Scala 스크립트를 보여줍니다.

```
import com.amazonaws.services.glue.log.GlueLogger

object GlueApp {
  def main(sysArgs: Array[String]) {
    val logger = new GlueLogger
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
  }
}
```

## 작업 진행률을 보여주는 진행률 표시줄 사용 설정
<a name="monitor-continuous-logging-progress"></a>

AWS Glue는 AWS Glue 작업 실행 상태를 확인하기 위해 `JOB_RUN_ID-progress-bar` 로그 스트림 아래에 실시간 진행률 표시줄을 제공합니다. 현재 `glueContext`를 초기화하는 작업만 지원합니다. `glueContext`를 초기화하지 않고 기본 Spark 작업을 실행하는 경우에는 AWS Glue 진행률 표시줄이 나타나지 않습니다.

이 진행률 표시줄에서는 5초마다 다음 진행률 업데이트를 표시합니다.

```
Stage Number (Stage Name): > (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]
```

## 지속 로깅을 사용한 보안 구성
<a name="monitor-logging-encrypt-log-data"></a>

CloudWatch 로그에 보안 구성이 사용되는 경우 AWS Glue는 연속 로그에 대해 다음과 같은 이름의 로그 그룹을 생성합니다.

```
<Log-Group-Name>-<Security-Configuration-Name>
```

기본 및 사용자 정의 로그 그룹은 다음과 같습니다.
+ 기본 연속 로그 그룹은 `/aws-glue/jobs/error-<Security-Configuration-Name>`입니다.
+ 사용자 정의 연속 로그 그룹은 `<custom-log-group-name>-<Security-Configuration-Name>`입니다.

CloudWatch Logs로 보안 구성을 사용하는 경우 IAM 역할 권한에 `logs:AssociateKmsKey`를 추가해야 합니다. 해당 권한이 포함되지 않으면 연속 로깅이 사용 중지됩니다. 또한 CloudWatch Logs에 대한 암호화를 구성하려면 *Amazon CloudWatch Logs User Guide*의 [Encrypt Log Data in CloudWatch Logs Using AWS Key Management Service](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)를 참조하세요.

보안 구성 생성에 대한 자세한 내용은 [AWS Glue 콘솔에서 보안 구성 관리](console-security-configurations.md) 섹션을 참조하세요.

**참고**  
 로깅을 활성화하고 추가 CloudWatch 로그 이벤트가 생성되면 추가 요금이 발생할 수 있습니다. 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

# AWS Glue 작업 로그 보기
<a name="monitor-continuous-logging-view"></a>

AWS Glue 콘솔 또는 Amazon CloudWatch 콘솔을 사용하여 실시간 로그를 볼 수 있습니다.

**AWS Glue 콘솔 대시보드를 사용하여 실시간 로그를 보려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서, **작업**을 선택합니다.

1. 기존 작업을 추가하거나 시작합니다. **작업**, **작업 실행**을 선택합니다.

   작업 실행을 시작할 때 실행 중인 작업에 대한 정보가 포함된 페이지로 이동합니다.
   + **로그** 탭에 이전에 집계된 애플리케이션 로그가 표시됩니다.
   + **로그** 탭에는 `glueContext`가 초기화된 작업이 실행 중일 때 실시간 진행률 표시줄이 표시됩니다.
   + **로그** 탭에는 실시간 Apache Spark 드라이버 로그를 캡처하는 **드라이버 로그** 및 작업이 실행 중일 때 AWS Glue 애플리케이션 로거를 사용하여 로깅한 스크립트의 애플리케이션 로그도 포함됩니다.

1. 이전 작업의 경우 [**로그(Logs)**]를 선택하여 [**작업 기록(Job History)**] 보기에서 실시간 로그를 볼 수도 있습니다. 이러한 작업을 수행하면 해당 작업 실행에 대한 모든 Spark 드라이버, 실행기 및 진행률 표시줄 로그 스트림을 표시하는 CloudWatch 콘솔로 이동합니다.

**CloudWatch 콘솔 대시보드를 사용하여 실시간 로그를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**를 선택합니다.

1. **/aws-glue/jobs/error/** 로그 그룹을 선택합니다.

1. **필터** 상자에 작업 실행 ID를 붙여넣습니다.

   드라이버 로그, 실행기 로그 및 진행률 표시줄을 볼 수 있습니다(**Standard filter(표준 필터)**를 사용하는 경우).

# AWS Glue 관찰성 메트릭을 사용한 모니터링
<a name="monitor-observability"></a>

**참고**  
AWS Glue 관찰성 지표는 AWS Glue 4.0 이상 버전에서 사용할 수 있습니다.

 AWS Glue 관찰성 메트릭을 사용하면 Apache Spark의 AWS Glue 내부에서 일어나는 일에 대한 통찰력을 얻어 문제의 분류 및 분석을 개선할 수 있습니다. 관찰성 지표는 Amazon CloudWatch 대시보드를 통해 시각화되며 오류의 근본 원인 분석을 수행하고 성능 병목 현상을 진단하는 데 사용할 수 있습니다. 대규모 문제 디버깅에 소요되는 시간을 줄여 문제를 더 빠르고 효과적으로 해결하는 데 집중할 수 있습니다.

 AWS Glue 관찰성은 다음 네 그룹으로 분류된 Amazon CloudWatch 메트릭을 제공합니다.
+  **신뢰성(예: 오류 클래스)** - 주어진 시간 범위에서 해결해야 할 가장 일반적인 장애 원인을 쉽게 식별할 수 있습니다.
+  **성능(예: Skewness)** - 성능 병목 지점을 식별하고 조정 기법을 적용합니다. 예를 들어 작업 왜곡으로 인해 성능이 저하되는 경우 Spark Adaptive Query Execution을 활성화하고 스큐 조인 임곗값을 미세 조정하는 것이 좋습니다.
+  **처리량(예: 소스/싱크당 처리량)** - 데이터 읽기 및 쓰기 추세를 모니터링합니다. 또한 이상 현상에 대한 Amazon CloudWatch 경보를 구성할 수 있습니다.
+  **리소스 사용률(예: 작업자, 메모리 및 디스크 사용률)** - 용량 사용률이 낮은 작업을 효율적으로 찾을 수 있습니다. 이러한 작업에 대해 AWS Glue Auto Scaling을 활성화할 수 있습니다.

## AWS Glue 관찰성 메트릭 시작하기
<a name="monitor-observability-getting-started"></a>

**참고**  
 새로운 지표는 AWS Glue Studio 콘솔에서 기본적으로 활성화됩니다.

**AWS Glue Studio에서 관찰성 지표를 구성하려면 다음을 수행합니다.**

1. AWS Glue 콘솔에 로그인하고 콘솔 메뉴에서 **ETL 작업**을 선택합니다.

1. 내 작업 섹션에서 작업 이름을 클릭하여 **작업**을 선택합니다.

1. [**작업 세부 정보(Job details)**] 탭을 선택합니다.

1. 하단으로 스크롤하여 **고급 속성**을 선택한 다음 **작업 관찰성 지표**를 선택합니다.  
![\[스크린샷은 작업 세부 정보 탭 고급 속성 탭을 보여줍니다. 작업 관찰성 메트릭 옵션이 강조 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/job-details-observability-metrics.png)

**AWS CLI를 사용하여 AWS Glue 관찰성 지표를 활성화하려면 다음을 수행합니다.**
+  입력 `--default-arguments` JSON 파일의 다음 키-값을 맵에 추가합니다.

  ```
  --enable-observability-metrics, true
  ```

## AWS Glue 관찰성 사용
<a name="monitor-observability-cloudwatch"></a>

 AWS Glue 관찰성 지표는 Amazon CloudWatch를 통해 제공되므로 Amazon CloudWatch 콘솔, AWS CLI, SDK 또는 API를 사용하여 관찰성 지표 데이터 포인트를 쿼리할 수 있습니다. AWS Glue 관찰성 지표를 사용하는 사용 사례의 예는 [Using Glue Observability for monitoring resource utilization to reduce cost](https://aws.amazon.com/blogs/big-data/enhance-monitoring-and-debugging-for-aws-glue-jobs-using-new-job-observability-metrics/)를 참조하세요.

### Amazon CloudWatch 콘솔에서 AWS Glue 관찰성 사용
<a name="monitor-observability-cloudwatch-console"></a>

**Amazon CloudWatch 콘솔에서 메트릭을 쿼리하고 시각화는 방법:**

1.  Amazon CloudWatch 콘솔을 열고 **모든 지표**를 선택합니다.

1.  사용자 지정 네임스페이스에서 **AWS Glue**를 선택합니다.

1.  **작업 관찰성 지표, 소스별 관찰 가능성 지표 또는 싱크당 관찰 가능성 지표**를 선택합니다.

1. 특정 지표 이름, 작업 이름, 작업 실행 ID를 검색하고 선택합니다.

1. **그래프로 표시된 지표** 탭에서 원하는 통계, 기간 및 기타 옵션을 구성합니다.  
![\[스크린샷은 Amazon CloudWatch 콘솔 및 지표 그래프를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/cloudwatch-console-metrics.png)

**AWS CLI를 사용하여 관찰성 지표를 쿼리하려면 다음을 수행합니다.**

1.  지표 정의 JSON 파일을 생성하고 `your-Glue-job-name` 및 `your-Glue-job-run-id`를 변경합니다.

   ```
   $ cat multiplequeries.json
   [
       {
           "Id": "avgWorkerUtil_0",
           "MetricStat": {
               "Metric": {
                   "Namespace": "Glue",
                   "MetricName": "glue.driver.workerUtilization",
                   "Dimensions": [
                       {
                           "Name": "JobName",
                           "Value": "<your-Glue-job-name-A>"
                       },
                       {
                           "Name": "JobRunId",
                           "Value": "<your-Glue-job-run-id-A>"
                       },
                       {
                           "Name": "Type",
                           "Value": "gauge"
                       },
                       {
                           "Name": "ObservabilityGroup",
                           "Value": "resource_utilization"
                       }
                   ]
               },
               "Period": 1800,
               "Stat": "Minimum",
               "Unit": "None"
           }
       },
       {
           "Id": "avgWorkerUtil_1",
           "MetricStat": {
               "Metric": {
                   "Namespace": "Glue",
                   "MetricName": "glue.driver.workerUtilization",
                   "Dimensions": [
                       {
                           "Name": "JobName",
                           "Value": "<your-Glue-job-name-B>"
                       },
                       {
                           "Name": "JobRunId",
                           "Value": "<your-Glue-job-run-id-B>"
                       },
                       {
                           "Name": "Type",
                           "Value": "gauge"
                       },
                       {
                           "Name": "ObservabilityGroup",
                           "Value": "resource_utilization"
                       }
                   ]
               },
               "Period": 1800,
               "Stat": "Minimum",
               "Unit": "None"
           }
       }
   ]
   ```

1.  `get-metric-data` 명령을 실행합니다.

   ```
   $ aws cloudwatch get-metric-data --metric-data-queries file: //multiplequeries.json \
        --start-time '2023-10-28T18: 20' \
        --end-time '2023-10-28T19: 10'  \
        --region us-east-1
   {
       "MetricDataResults": [
           {
               "Id": "avgWorkerUtil_0",
               "Label": "<your-label-for-A>",
               "Timestamps": [
                   "2023-10-28T18:20:00+00:00"
               ],
               "Values": [
                   0.06718750000000001
               ],
               "StatusCode": "Complete"
           },
           {
               "Id": "avgWorkerUtil_1",
               "Label": "<your-label-for-B>",
               "Timestamps": [
                   "2023-10-28T18:50:00+00:00"
               ],
               "Values": [
                   0.5959183673469387
               ],
               "StatusCode": "Complete"
           }
       ],
       "Messages": []
   }
   ```

## 관찰성 메트릭
<a name="monitor-observability-metrics-definitions"></a>

 AWS Glue 관찰성은 다음 지표의 프로필을 작성하고 30초마다 Amazon CloudWatch로 전송하며, 이러한 지표 중 일부는 AWS Glue Studio 작업 실행 모니터링 페이지에서 확인할 수 있습니다.


| 지표 | 설명 | 카테고리 | 
| --- | --- | --- | 
| glue.driver.skewness.stage |  지표 범주: job\$1performance Spark 스테이지 실행 왜도: 이 지표는 특정 스테이지의 최대 태스크 지속 시간이 이 스테이지의 태스크 지속 시간 중앙값과 비교하여 얼마나 긴지 나타내는 지표입니다. 이 지표는 입력 데이터 왜도 또는 변환(예: 왜곡된 조인)으로 인해 발생할 수 있는 실행 왜도를 캡처합니다. 이 지표의 값은 [0, 무한] 범위에 속합니다. 여기서 0은 스테이지의 모든 작업 중 최대 작업 실행 시간과 중간 작업 실행 시간의 비율이 특정 스테이지 왜도 인자보다 작다는 것을 의미합니다. 기본 스테이지 왜도 인자는 `5`이며 spark conf: spark.metrics.conf.driver.source.glue.jobPerformance.skewnessFactor를 통해 덮어쓸 수 있습니다. 스테이지 왜도 값이 1이면 비율이 단계 왜도 인자의 두 배임을 의미합니다. 스테이지 왜도 값은 현재 왜도를 반영하여 30초마다 업데이트됩니다. 스테이지가 끝날 때의 값은 최종 스테이지 왜도를 반영합니다. 이 스테이지 수준 지표는 작업 수준 지표 `glue.driver.skewness.job`을 계산하는 데 사용됩니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(Job\$1Performance) 유효 통계: 평균, 최대, 최소, 백분위수 단위: 수  | job\$1performance | 
| glue.driver.skewness.job |  지표 범주: job\$1performance  작업 왜도는 모든 스테이지의 최대 가중치 왜도입니다. 스테이지 왜도(glue.driver.skewness.stage)에는 스테이지 지속 시간이 가중치로 적용됩니다. 이는 매우 왜곡된 스테이지가 실제로 다른 스테이지에 비해 매우 짧은 시간 동안 실행되는 경우를 피하기 위한 것입니다. 따라서 왜도는 전체 작업 성능에 있어 중요하지 않으며 왜도를 해결하려고 노력할 필요가 없습니다. 이 지표는 각 단계가 완료될 때마다 업데이트되므로 마지막 값은 실제 전체 작업 왜도를 반영합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(Job\$1Performance) 유효 통계: 평균, 최대, 최소, 백분위수 단위: 수  | job\$1performance | 
| glue.succeed.ALL |  지표 범주: 오류 실패 범주의 그림을 완성하기 위한 총 작업 실행 성공 횟수 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(개수), ObservabilityGroup(오류) 유효 통계: SUM 단위: 수  | 오류 | 
| glue.error.ALL |  지표 범주: 오류  실패 범주의 그림을 완성하기 위한 총 작업 실행 오류 횟수 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(개수), ObservabilityGroup(오류) 유효 통계: SUM 단위: 수  | 오류 | 
| glue.error.[error category] |  지표 범주: 오류  이것은 실제로 작업 실행이 실패할 때만 업데이트되는 지표 세트입니다. 오류 분류는 분류 및 디버깅에 도움이 됩니다. 작업 실행이 실패하면 실패의 원인이 되는 오류가 분류되고 해당 오류 범주 지표가 1로 설정됩니다. 이를 통해 시간 경과에 따른 오류 분석은 물론 모든 작업에 대한 오류 분석을 수행하여 가장 일반적인 오류 범주를 식별하고 문제 해결을 시작할 수 있습니다. AWS Glue에는 OUT\$1OF\$1MEMORY(드라이버 및 실행기), PERMISSION, SYNTAX 및 THROTTLING 오류 범주를 포함한 28개의 오류 범주가 있습니다. 오류 범주는 COMPILATION, LAUNCH, TIMEOUT 오류 범주도 포함합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(개수), ObservabilityGroup(오류) 유효 통계: SUM 단위: 수  | 오류 | 
| glue.driver.workerUtilization |  지표 범주: resource\$1utilization  할당된 작업자 중 실제로 사용된 작업자의 비율입니다. 상황이 좋지 않다면 Auto Scaling이 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) 유효 통계: 평균, 최대, 최소, 백분위수 단위: 퍼센트  | resource\$1utilization | 
| glue.driver.memory.heap.[available \$1 used] |  지표 범주: resource\$1utilization  작업 실행 중 드라이버의 사용 가능/사용된 힙 메모리입니다. 이는 특히 시간 경과에 따른 메모리 사용량 추세를 파악하는 데 도움이 되며 메모리 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 바이트  | resource\$1utilization | 
| glue.driver.memory.heap.used.percentage |  지표 범주: resource\$1utilization  작업 실행 중 드라이버가 사용한 힙 메모리(%)입니다. 이는 특히 시간 경과에 따른 메모리 사용량 추세를 파악하는 데 도움이 되며 메모리 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.driver.memory.non-heap.[available \$1 used] |  지표 범주: resource\$1utilization  작업 실행 중 드라이버가 사용 가능한 또는 사용한 힙이 아닌 메모리입니다. 이는 특히 시간 경과에 따른 메모리 사용량 추세를 파악하는 데 도움이 되며 메모리 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 바이트  | resource\$1utilization | 
| glue.driver.memory.non-heap.used.percentage |  지표 범주: resource\$1utilization  작업 실행 중 드라이버가 사용한 힙이 아닌 메모리(%)입니다. 이는 특히 시간 경과에 따른 메모리 사용량 추세를 파악하는 데 도움이 되며 메모리 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.driver.memory.total.[available \$1 used] |  지표 범주: resource\$1utilization  작업 실행 중 드라이버가 사용 가능한 또는 사용한 총 메모리입니다. 이는 특히 시간 경과에 따른 메모리 사용량 추세를 파악하는 데 도움이 되며 메모리 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 바이트  | resource\$1utilization | 
| glue.driver.memory.total.used.percentage |  지표 범주: resource\$1utilization  작업 실행 중 드라이버가 사용한 총 메모리(%)입니다. 이는 특히 시간 경과에 따른 메모리 사용량 추세를 파악하는 데 도움이 되며 메모리 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.ALL.memory.heap.[available \$1 used] |  지표 범주: resource\$1utilization  실행기의 사용 가능한/사용된 힙 메모리입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 바이트  | resource\$1utilization | 
| glue.ALL.memory.heap.used.percentage |  지표 범주: resource\$1utilization  실행기가 사용한 힙 메모리(%)입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.ALL.memory.non-heap.[available \$1 used] |  지표 범주: resource\$1utilization  실행기의 사용 가능한/사용된 힙이 아닌 메모리입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 바이트  | resource\$1utilization | 
| glue.ALL.memory.non-heap.used.percentage |  지표 범주: resource\$1utilization  실행기가 사용한 힙이 아닌 메모리(%)입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.ALL.memory.total.[available \$1 used] |  지표 범주: resource\$1utilization  실행기의 사용 가능한/사용된 총 메모리입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 바이트  | resource\$1utilization | 
| glue.ALL.memory.total.used.percentage |  지표 범주: resource\$1utilization  실행기의 총 메모리 사용률(%)입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.driver.disk.[available\$1GB \$1 used\$1GB] |  지표 범주: resource\$1utilization  작업 실행 중 드라이버의 사용 가능한/사용된 디스크 공간입니다. 이는 특히 시간 경과에 따른 디스크 사용량 추세를 파악하는 데 도움이 되며 디스크 공간 부족 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 기가바이트  | resource\$1utilization | 
| glue.driver.disk.used.percentage] |  지표 범주: resource\$1utilization  작업 실행 중 드라이버의 사용 가능한/사용된 디스크 공간입니다. 이는 특히 시간 경과에 따른 디스크 사용량 추세를 파악하는 데 도움이 되며 디스크 공간 부족 관련 오류를 디버깅할 뿐만 아니라 잠재적인 오류를 방지하는 데도 도움이 될 수 있습니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.ALL.disk.[available\$1GB \$1 used\$1GB] |  지표 범주: resource\$1utilization  실행기의 사용 가능한/사용된 디스크 공간입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 기가바이트  | resource\$1utilization | 
| glue.ALL.disk.used.percentage |  지표 범주: resource\$1utilization  실행기의 사용 가능한/사용된/사용된(%) 디스크 공간입니다. ALL은 모든 실행기를 의미합니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization) Valid Statistics: Average 단위: 퍼센트  | resource\$1utilization | 
| glue.driver.bytesRead |  지표 범주: 처리량  이 작업 실행에서 입력 소스당 및 모든 소스에 대해 읽은 바이트 수입니다. 이를 통해 데이터양과 시간 경과에 따른 변화를 파악할 수 있으므로 데이터 왜도와 같은 문제를 해결하는 데 도움이 됩니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization), Source(소스 데이터 위치) Valid Statistics: Average 단위: 바이트  | 처리량 | 
| glue.driver.[recordsRead \$1 filesRead]  |  지표 범주: 처리량  이 작업 실행에서 입력 소스당 및 모든 소스에 대해 읽은 레코드/파일 수입니다. 이를 통해 데이터양과 시간 경과에 따른 변화를 파악할 수 있으므로 데이터 왜도와 같은 문제를 해결하는 데 도움이 됩니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization), Source(소스 데이터 위치) Valid Statistics: Average 단위: 수  | 처리량 | 
| glue.driver.partitionsRead  |  지표 범주: 처리량  이 작업 실행에서 Amazon S3 입력 소스당 및 모든 소스에 대해 읽은 파티션 수입니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization), Source(소스 데이터 위치) Valid Statistics: Average 단위: 수  | 처리량 | 
| glue.driver.bytesWrittten |  지표 범주: 처리량  이 작업 실행에서 출력 싱크당 및 모든 싱크에 대해 작성된 바이트 수입니다. 이를 통해 데이터양과 시간이 지남에 따라 어떻게 변화하는지 파악할 수 있으므로 처리 왜도와 같은 문제를 해결하는 데 도움이 됩니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization), Sink(싱크 데이터 위치) Valid Statistics: Average 단위: 바이트  | 처리량 | 
| glue.driver.[recordsWritten \$1 filesWritten] |  지표 범주: 처리량  이 작업 실행에서 출력 싱크당 및 모든 싱크에 대해 작성된 레코드/파일 수입니다. 이를 통해 데이터양과 시간이 지남에 따라 어떻게 변화하는지 파악할 수 있으므로 처리 왜도와 같은 문제를 해결하는 데 도움이 됩니다. 유효 차원: JobName(AWS Glue 작업 이름), JobRunId(JobRun ID 또는 ALL), Type(게이지), ObservabilityGroup(resource\$1utilization), Sink(싱크 데이터 위치) Valid Statistics: Average 단위: 수  | 처리량 | 

## 오류 범주
<a name="monitor-observability-error-categories"></a>


| 오류 범주 | 설명 | 
| --- | --- | 
| COMPILATION\$1ERROR | Scala 코드를 컴파일하는 동안 오류가 발생합니다. | 
| CONNECTION\$1ERROR | 서비스/원격 호스트/데이터베이스 서비스 등에 연결하는 동안 오류가 발생합니다. | 
| DISK\$1NO\$1SPACE\$1ERROR |  드라이버/실행기의 디스크에 공간이 남아 있지 않은 경우 오류가 발생합니다.  | 
| OUT\$1OF\$1MEMORY\$1ERROR | 드라이버/실행기의 메모리에 공간이 남아 있지 않은 경우 오류가 발생합니다. | 
| IMPORT\$1ERROR | 종속성을 가져올 때 오류가 발생합니다. | 
| INVALID\$1ARGUMENT\$1ERROR | 입력 인수가 유효하지 않거나 잘못된 경우 오류가 발생합니다. | 
| PERMISSION\$1ERROR | 서비스, 데이터 등에 대한 권한이 없는 경우 오류가 발생합니다. | 
| RESOURCE\$1NOT\$1FOUND\$1ERROR |  데이터, 위치 등이 종료되지 않을 경우 오류가 발생합니다.  | 
| QUERY\$1ERROR | Spark SQL 쿼리 실행으로 인해 오류가 발생합니다. | 
| SYNTAX\$1ERROR | 스크립트에 구문 오류가 있는 경우 오류가 발생합니다. | 
| THROTTLING\$1ERROR | 서비스 동시성 한도에 도달하거나 서비스 할당량 한도를 초과하는 경우 오류가 발생합니다. | 
| DATA\$1LAKE\$1FRAMEWORK\$1ERROR | Hudi, Iceberg 등과 같은 AWS Glue 기본 지원 데이터 레이크 프레임워크에서 오류가 발생합니다. | 
| UNSUPPORTED\$1OPERATION\$1ERROR | 지원되지 않는 작업을 수행하는 경우 오류가 발생합니다. | 
| RESOURCES\$1ALREADY\$1EXISTS\$1ERROR | 생성하거나 추가하려는 리소스가 이미 존재하는 경우 오류가 발생합니다. | 
| GLUE\$1INTERNAL\$1SERVICE\$1ERROR | AWS Glue 내부 서비스 문제가 있는 경우 오류가 발생합니다. | 
| GLUE\$1OPERATION\$1TIMEOUT\$1ERROR | AWS Glue 작업 시간이 초과되는 경우 오류가 발생합니다. | 
| GLUE\$1VALIDATION\$1ERROR | AWS Glue 작업에 필요한 값을 검증할 수 없는 경우 오류가 발생합니다. | 
| GLUE\$1JOB\$1BOOKMARK\$1VERSION\$1MISMATCH\$1ERROR | 동일한 소스 버킷에서 동일한 작업이 실행되고 동일한/다른 대상에 동시에 작성되는 경우 오류가 발생합니다(동시성 > 1). | 
| LAUNCH\$1ERROR | AWS Glue 작업 시작 단계에서 오류가 발생합니다. | 
| DYNAMODB\$1ERROR | Amazon DynamoDB 서비스에서 일반 오류가 발생합니다. | 
| GLUE\$1ERROR | AWS Glue 서비스에서 일반 오류가 발생합니다. | 
| LAKEFORMATION\$1ERROR | AWS Lake Formation 서비스에서 일반 오류가 발생합니다. | 
| REDSHIFT\$1ERROR | Amazon Redshift 서비스에서 일반 오류가 발생합니다. | 
| S3\$1ERROR | Amazon S3 서비스에서 일반 오류가 발생합니다. | 
| SYSTEM\$1EXIT\$1ERROR | 일반 시스템 종료 오류입니다. | 
| TIMEOUT\$1ERROR | 작업 시간 초과로 인해 작업이 실패하면 일반 오류가 발생합니다. | 
| UNCLASSIFIED\$1SPARK\$1ERROR | Spark에서 일반 오류가 발생합니다. | 
| UNCLASSIFIED\$1ERROR | 기본 오류 범주입니다. | 

## 제한 사항
<a name="monitoring-observability-limitations"></a>

**참고**  
`glueContext`를 초기화해야만 지표를 게시할 수 있습니다.

 소스 차원에서 값은 소스 유형에 따라 Amazon S3 경로 또는 테이블 이름입니다. 또한 소스가 JDBC이고 쿼리 옵션이 사용되는 경우 쿼리 문자열은 소스 차원에 설정됩니다. 값이 500자보다 길면 500자 이내로 잘립니다. 다음은 값의 제한 사항입니다.
+ ASCII가 아닌 문자는 제거됩니다.
+ 소스 이름에 ASCII 문자가 포함되어 있지 않으면 <비 ASCII 입력>으로 변환됩니다.

### 처리량 지표의 제한 사항 및 고려 사항
<a name="monitoring-observability-considerations"></a>
+  DataFrame 및 DataFrame 기반 DynamicFrame(예: JDBC, Amazon S3의 Parquet에서 읽기)은 지원되지만 RDD 기반 DynamicFrame(예: Amazon S3에서 csv, json 읽기 등)은 지원되지 않습니다. 기술적으로는 Spark UI에 표시되는 모든 읽기 및 쓰기가 지원됩니다.
+  데이터 소스가 카탈로그 테이블이고 형식이 JSON, CSV, 텍스트 또는 Iceberg인 경우 `recordsRead` 지표가 내보내집니다.
+  `glue.driver.throughput.recordsWritten`, `glue.driver.throughput.bytesWritten`, `glue.driver.throughput.filesWritten` 지표는 JDBC 및 Iceberg 테이블에서 사용할 수 없습니다.
+  지표가 지연될 수 있습니다. 작업이 약 1분 안에 완료되면 Amazon CloudWatch 지표에 처리량 지표가 표시되지 않을 수 있습니다.

# 작업 모니터링 및 디버깅
<a name="monitor-profile-glue-job-cloudwatch-metrics"></a>

AWS Glue 작업에 대한 지표를 수집하고 AWS Glue 및 Amazon CloudWatch 콘솔에서 이러한 지표를 시각화하여 문제를 식별하고 수정할 수 있습니다. AWS Glue 작업을 프로파일링하려면 다음 단계를 수행해야 합니다.

1.  지표를 활성화하려면 다음을 수행합니다.

   1.  작업 정의에서 **작업 측정치** 옵션을 활성화합니다. AWS Glue 콘솔에서 또는 작업의 파라미터로서 프로파일링을 활성화할 수 있습니다. 자세한 정보는 [Spark 작업에 대한 작업 속성 정의](add-job.md#create-job) 또는 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 섹션을 참조하세요.

   1.  작업 정의에서 **AWS Glue 관찰성 지표** 옵션을 활성화합니다. AWS Glue 콘솔에서 또는 작업의 파라미터로서 관찰성을 활성화할 수 있습니다. 자세한 내용은 [AWS Glue 관찰성 메트릭을 사용한 모니터링](monitor-observability.md)을 참조하세요.

1. 작업 스크립트에서 `GlueContext`를 초기화하는지 확인합니다. 예를 들면 다음 스크립트 조각은 `GlueContext`를 초가화하고 프로파일링된 코드가 스크립트에 있는 위치를 표시합니다. 이 일반적인 형식은 이어지는 디버깅 시나리오에서 사용됩니다.

   ```
   import sys
   from awsglue.transforms import *
   from awsglue.utils import getResolvedOptions
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   from awsglue.job import Job
   import time
   
   ## @params: [JOB_NAME]
   args = getResolvedOptions(sys.argv, ['JOB_NAME'])
   
   sc = SparkContext()
   glueContext = GlueContext(sc)
   spark = glueContext.spark_session
   job = Job(glueContext)
   job.init(args['JOB_NAME'], args)
   
   ...
   ...
   code-to-profile
   ...
   ...
   
   
   job.commit()
   ```

1. 작업을 실행합니다.

1. 지표를 시각화하려면 다음을 수행합니다.

   1. AWS Glue 콘솔에서 작업 지표를 시각화하고 드라이버 또는 실행기의 이상 지표를 식별합니다.

   1. 작업 실행 모니터링 페이지, 작업 실행 세부 정보 페이지 또는 Amazon CloudWatch에서 관찰성 지표를 확인합니다. 자세한 내용은 [AWS Glue 관찰성 메트릭을 사용한 모니터링](monitor-observability.md) 섹션을 참조하세요.

1. 식별된 측정치를 사용하여 근본 원인의 범위를 좁힙니다.

1. 원한다면 식별된 드라이버나 작업 실행기의 로그 스트림을 사용하여 근본 원인을 확인할 수 있습니다.

 **AWS Glue 관찰성 지표의 사용 사례** 
+  [OOM 예외 사항 및 작업 이상 현상 디버깅](monitor-profile-debug-oom-abnormalities.md) 
+  [까다로운 단계와 스트래글러 작업 디버깅](monitor-profile-debug-straggler.md) 
+  [여러 작업의 진행 상황 모니터링](monitor-debug-multiple.md) 
+  [DPU 용량 계획 모니터링](monitor-debug-capacity.md) 
+  [리소스 사용률 모니터링을 위해 AWS Glue 관찰성을 사용하여 비용 절감](https://aws.amazon.com/blogs/big-data/enhance-monitoring-and-debugging-for-aws-glue-jobs-using-new-job-observability-metrics) 

# OOM 예외 사항 및 작업 이상 현상 디버깅
<a name="monitor-profile-debug-oom-abnormalities"></a>

AWS Glue에서 메모리 부족(OOM) 예외 사항 및 작업 이상 현상을 디버깅할 수 있습니다. 다음 단원에서는 Apache Spark 드라이버 또는 Spark 실행기의 메모리 부족 예외 사항을 디버깅하는 시나리오를 설명합니다.
+ [드라이버 OOM 예외 사항 디버깅](#monitor-profile-debug-oom-driver)
+ [실행기 OOM 예외 사항 디버깅](#monitor-profile-debug-oom-executor)

## 드라이버 OOM 예외 사항 디버깅
<a name="monitor-profile-debug-oom-driver"></a>

이 시나리오에서는 Spark 작업이 Amazon Simple Storage Service(Amazon S3)에서 여러 작은 파일을 읽습니다. 파일을 Apache Parquet 포맷으로 변환한 다음 Amazon S3에 씁니다. Spark 드라이버에서 메모리 부족이 발생합니다. 입력 Amazon S3 데이터의 파일 수는 서로 다른 Amazon S3 파티션에 걸쳐 100만개가 넘습니다.

프로파일링된 코드는 다음과 같습니다.

```
data = spark.read.format("json").option("inferSchema", False).load("s3://input_path")
data.write.format("parquet").save(output_path)
```

### AWS Glue 콘솔에서 프로파일링된 지표 시각화
<a name="monitor-debug-oom-visualize"></a>

다음 그래프는 드라이버와 실행기에 대한 메모리 사용률(%)을 표시합니다. 이 사용률은 지난 1분 안에 보고된 값에 대한 평균으로 계산된 데이터 하나로 표시됩니다. [드라이버 메모리](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.jvm.heap.usage)가 50% 사용률의 안전 임계값을 넘는 작업의 메모리 프로필을 볼 수 있습니다. 반면에, 모든 실행기의 [평균 메모리 사용률](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)은 여전히 4%보다 낮습니다. 이로써 이 Spark 작업에서 드라이버 실행에 이상이 있음을 명확히 알 수 있습니다.

![\[드라이버 및 실행기의 메모리 사용률(%).\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-memoryprofile.png)


작업 실행이 곧 실패하고 AWS Glue 콘솔의 [**기록(History)**] 탭에 [종료 코드 1로 명령 실패(Command Failed with Exit Code 1)] 오류가 나타납니다. 이 오류 문자열은 시스템 전체 오류(이 경우 메모리 부족)로 인해 작업이 실패했음을 의미합니다.

![\[AWS Glue 콘솔에 표시된 오류 메시지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-errorstring.png)


콘솔의 [**기록(History)**] 탭에서 [**오류 로그(Error logs)**] 링크를 선택하여 CloudWatch Logs에서 드라이버 OOM에 대한 결과를 확인합니다. 작업의 오류 로그에서 "**Error**"를 검색하여 작업 실패의 원인이 된 OOM 예외 사항이 정말 발생했는지 확인합니다.

```
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 12039"...
```

작업에 대해 **기록** 탭에서 **로그**를 선택합니다. 작업의 시작 부분에서 다음과 같은 CloudWatch Logs의 드라이버 실행 추적 정보를 찾아볼 수 있습니다. Spark 드라이버에서 모든 디렉터리의 모든 파일을 나열하려고 했으며, `InMemoryFileIndex`를 생성하고 파일마다 작업 하나를 실행합니다. 이로 인해 Spark 드라이버는 모든 작업을 추적하기 위해 메모리에서 매우 많은 상태를 유지해야 합니다. 따라서 메모리 내 인덱스에 대해 다량의 파일을 포함하는 전체 목록을 캐시하므로 드라이버 OOM이 발생하게 됩니다.

### 그룹화를 사용하여 여러 파일의 처리 수정
<a name="monitor-debug-oom-fix"></a>

AWS Glue의 *그룹화* 기능을 사용하여 여러 파일의 처리를 수정할 수 있습니다. 그룹화는 동적 프레임을 사용할 때와 입력 데이터 세트에 파일 수가 많을 때(50,000개 초과) 자동으로 활성화됩니다. 그룹화를 통해 여러 파일을 그룹 하나로 합칠 수 있으므로 작업 하나로 단일 파일 대신에 전체 그룹을 처리할 수 있습니다. 결과적으로 Spark 드라이버는 메모리 안에 훨씬 더 적은 상태를 저장하여 몇 개 작업만 추적합니다. 데이터 세트에 대한 그룹화 수동 활성화에 대한 자세한 내용은 [입력 파일을 더 큰 그룹에서 읽기](grouping-input-files.md) 단원을 참조하십시오.

AWS Glue 작업의 메모리 프로파일을 확인하려면 그룹화가 활성화된 상태에서 다음과 같은 코드를 프로파일링합니다.

```
df = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://input_path"], "recurse":True, 'groupFiles': 'inPartition'}, format="json")
datasink = glueContext.write_dynamic_frame.from_options(frame = df, connection_type = "s3", connection_options = {"path": output_path}, format = "parquet", transformation_ctx = "datasink")
```

AWS Glue 작업 프로필에서 메모리 프로필 및 ETL 데이터 이동을 모니터링할 수 있습니다.

이 드라이버는 AWS Glue 작업의 전체 기간 동안 메모리 사용량의 50%인 임계값 미만으로 실행됩니다. 실행기가 Amazon S3에서 데이터를 스트리밍하고 처리한 후 Amazon S3에 씁니다. 결과적으로 모든 시점에서 5%보다 적은 양의 메모리가 사용됩니다.

![\[문제를 나타냈던 메모리 프로필이 수정되었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-memoryprofile-fixed.png)


아래 데이터 이동 프로파일은 작업이 진행됨에 따라 모든 실행기가 마지막 1분 동안 [읽고](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes) [쓴](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes) 총 Amazon S3 바이트 수를 보여줍니다. 둘 다 모든 실행기에서 데이터가 스트리밍될 때 유사한 패턴을 따릅니다. 이 작업은 세 시간 내에 100만 개에 이르는 모든 파일에 대한 처리를 완료합니다.

![\[문제를 나타냈던 데이터 이동 프로필이 수정되었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-etlmovement.png)


## 실행기 OOM 예외 사항 디버깅
<a name="monitor-profile-debug-oom-executor"></a>

이 시나리오에서는 Apache Spark 실행기에서 발생할 수 있는 OOM 예외 사항을 디버깅하는 방법을 알아볼 수 있습니다. 다음 코드는 Spark MySQL 리더를 사용하여 약 3400만개 행으로 이루어진 대형 테이블을 Spark 데이터 프레임으로 읽어 들입니다. 그런 다음 Parquet 포맷으로 Amazon S3에 씁니다. 연결 속성을 제공하고 기본 Spark 구성을 사용하여 테이블을 읽을 수 있습니다.

```
val connectionProperties = new Properties()
connectionProperties.put("user", user)
connectionProperties.put("password", password)
connectionProperties.put("Driver", "com.mysql.jdbc.Driver")
val sparkSession = glueContext.sparkSession
val dfSpark = sparkSession.read.jdbc(url, tableName, connectionProperties)
dfSpark.write.format("parquet").save(output_path)
```

### AWS Glue 콘솔에서 프로파일링된 지표 시각화
<a name="monitor-debug-oom-visualize-2"></a>

메모리 사용량 그래프의 경사가 양수이고 50%를 넘는 경우 다음 지표를 내보내기 전에 작업이 실패하면 메모리 부족이 실패 원인이 될 수 있습니다. 다음 그래프는 1분 실행 기간 내에 모든 실행기의 [평균 메모리 사용률](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)이 50%를 급격하게 초과함을 보여줍니다. 이 사용률은 최대 92%에 도달하며 해당 실행기를 실행 중인 컨테이너가 Apache Hadoop YARN에 의해 중지됩니다.

![\[모든 실행기의 평균 메모리 사용률.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-2-memoryprofile.png)


다음 그래프에서처럼, 작업이 실패할 때까지 항상 [단일 실행기](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberAllExecutors)가 실행 중입니다. 이는 새 실행기가 시작되어 중지된 실행기를 대체하기 때문입니다. JDBC 데이터 원본 읽기는 기본적으로 병렬화되지 않습니다. 그 이유는 한 열에서 테이블을 분할하고 여러 연결을 열어야 하기 때문입니다. 따라서 실행기 하나만 전체 테이블에서 순차적으로 읽혀집니다.

![\[이 작업 실행은 작업이 실패할 때까지 단일 실행기가 실행 중임을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-2-execution.png)


다음 그래프에서처럼, Spark는 작업 실패 전에 새 작업 시작을 4회 시도합니다. 세 개 실행기의 [메모리 프로필](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.used)을 볼 수 있습니다. 각 실행기가 모든 메모리를 신속히 소비합니다. 네 번째 실행기에서 메모리 부족이 발생하여 작업이 실패합니다. 따라서 이 작업의 측정치가 즉시 보고되지 않습니다.

![\[실행기의 메모리 프로필.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-2-exec-memprofile.png)


다음 이미지와 같이, OOM 예외로 인해 작업이 실패했던 AWS Glue 콘솔에서 오류 문자열을 확인할 수 있습니다.

![\[AWS Glue 콘솔에 표시된 오류 메시지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-2-errorstring.png)


**작업 출력 로그:** 실행기 OOM 예외 사항의 결과를 추가로 확인하려면 CloudWatch Logs를 살펴봅니다. **Error**를 검색하면 지표 대시보드처럼 거의 동일한 기간 내에 네 개 실행기가 중지됨을 확인할 수 있습니다. 이들 실행기는 메모리 제한을 초과할 때 YARN에 의해 모두 종료됩니다.

실행기 1

```
18/06/13 16:54:29 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:54:29 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:54:29 ERROR YarnClusterScheduler: Lost executor 1 on ip-10-1-2-175.ec2.internal: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:54:29 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-10-1-2-175.ec2.internal, executor 1): ExecutorLostFailure (executor 1 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

실행기 2

```
18/06/13 16:55:35 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:55:35 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:55:35 ERROR YarnClusterScheduler: Lost executor 2 on ip-10-1-2-16.ec2.internal: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:55:35 WARN TaskSetManager: Lost task 0.1 in stage 0.0 (TID 1, ip-10-1-2-16.ec2.internal, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

실행기 3

```
18/06/13 16:56:37 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:56:37 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:56:37 ERROR YarnClusterScheduler: Lost executor 3 on ip-10-1-2-189.ec2.internal: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:56:37 WARN TaskSetManager: Lost task 0.2 in stage 0.0 (TID 2, ip-10-1-2-189.ec2.internal, executor 3): ExecutorLostFailure (executor 3 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

실행기 4

```
18/06/13 16:57:18 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:57:18 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:57:18 ERROR YarnClusterScheduler: Lost executor 4 on ip-10-1-2-96.ec2.internal: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:57:18 WARN TaskSetManager: Lost task 0.3 in stage 0.0 (TID 3, ip-10-1-2-96.ec2.internal, executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

### AWS Glue 동적 프레임을 사용하여 가져오기 크기 설정 수정
<a name="monitor-debug-oom-fix-2"></a>

Spark JDBC 가져오기 크기에 대한 기본 구성이 0이므로 JDBC 테이블을 읽는 동안 실행기에서 메모리 부족이 발생했습니다. 이는 Spark가 한 번에 한 개씩 행을 스트리밍하더라도 Spark 실행기의 JDBC 드라이버가 데이터베이스의 3400만개 행을 함께 가져와서 캐시하려고 함을 의미합니다. Spark에서 가져오기 크기 파라미터를 0 이외의 기본값으로 설정하여 이 시나리오를 방지할 수 있습니다.

또한 AWS Glue 동적 프레임을 대신 사용하여 이 문제를 해결할 수도 있습니다. 기본적으로 동적 프레임에서는 가져오기 크기로 1,000개 행이 사용되는데, 일반적으로 충분한 값입니다. 결과적으로 실행기에 사용되는 메모리의 양이 총 메모리의 7%를 초과하지 않습니다. AWS Glue 작업은 단일 실행기만으로 2분 안에 완료됩니다. AWS Glue 동적 프레임을 사용하는 것이 권장되는 접근 방식이지만, Apache Spark `fetchsize` 속성을 사용하여 가져오기 크기를 설정할 수도 있습니다. [Spark SQL, DataFrames 및 데이터 세트 가이드](https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#jdbc-to-other-databases)를 참조하십시오.

```
val (url, database, tableName) = {
 ("jdbc_url", "db_name", "table_name")
 } 
val source = glueContext.getSource(format, sourceJson)
val df = source.getDynamicFrame
glueContext.write_dynamic_frame.from_options(frame = df, connection_type = "s3", connection_options = {"path": output_path}, format = "parquet", transformation_ctx = "datasink")
```

**정상 프로파일링된 측정치:** [실행기 메모리](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)(AWS Glue 동적 프레임 사용)가 다음 이미지와 같이 안전 임곗값을 절대로 초과하지 않습니다. 데이터베이스에서 행을 읽고 어느 시점에든 JDBC 드라이버에 1,000개 행만 캐시합니다. 메모리 부족 예외는 발생하지 않습니다.

![\[안전 임곗값보다 낮은 실행기 메모리를 보여주는 AWS Glue 콘솔입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-oom-2-memoryprofile-fixed.png)


# 까다로운 단계와 스트래글러 작업 디버깅
<a name="monitor-profile-debug-straggler"></a>

AWS Glue 작업 프로파일링을 사용하여 추출, 변환 및 로드(ETL) 작업에서 까다로운 단계와 스트래글러 작업을 식별할 수 있습니다. 스트래글러 작업은 AWS Glue 작업의 단계에서 나머지 작업보다 더 오래 걸립니다. 따라서 해당 단계를 완료하는 데 더 오래 걸리므로 작업의 총 실행 시간도 지연됩니다.

## 작은 입력 파일을 큰 출력 파일로 병합
<a name="monitor-profile-debug-straggler-scenario-1"></a>

스트래글러 작업은 여러 작업들 간에 작업량이 균일하지 않게 배포되거나, 데이터 스큐로 인해 한 작업에서 더 많은 데이터를 처리하는 경우에 발생할 수 있습니다.

다음 코드(Apache Spark의 일반 패턴)를 프로파일링하여 다량의 작은 파일을 큰 출력 파일로 병합할 수 있습니다. 예를 들면, 입력 데이터 세트는 JSON Gzip 압축 파일 32GB입니다. 출력 데이터 세트는 거의 190GB에 이르는 압축되지 않은 JSON 파일입니다.

프로파일링된 코드는 다음과 같습니다.

```
datasource0 = spark.read.format("json").load("s3://input_path")
df = datasource0.coalesce(1)
df.write.format("json").save(output_path)
```

### AWS Glue 콘솔에서 프로파일링된 지표 시각화
<a name="monitor-debug-straggler-visualize"></a>

작업을 프로파일링하여 네 가지 지표 세트를 살펴볼 수 있습니다.
+ ETL 데이터 이동
+ 실행기 간의 데이터 셔플
+ 작업 실행
+ 메모리 프로필

**ETL 데이터 이동**: **ETL 데이터 이동** 프로필에서는 처음 6분 안에 완료되는 첫 번째 단계에서 모든 실행기가 바이트를 매우 빠르게 [읽습니다](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes). 하지만 총 작업 실행 시간은 거의 1시간으로, 이 시간 중 대부분을 데이터 [쓰기](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes)가 차지합니다.

![\[ETL 데이터 이동 프로필을 보여주는 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-1.png)


**실행기 간 데이터 셔플:** 셔플링 중에 [읽고](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleLocalBytesRead) [쓴](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleBytesWritten) 바이트 수도 [**작업 실행(Job Execution)**] 및 [**데이터 셔플(Data Shuffle)**] 지표에서 알 수 있듯이 2단계가 끝나기 전 스파이크를 나타냅니다. 모든 실행기의 데이터 셔플 후에는 실행기 번호 3에서만 읽기 및 쓰기가 진행됩니다.

![\[실행기 간의 데이터 셔플 측정치.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-2.png)


**작업 실행:** 아래 그래프와 같이, 다른 모든 실행기는 유휴 상태이며 최종적으로 10:09에 중지됩니다. 이 시점에는 총 실행기 수가 1로 감소됩니다. 이는 실행기 번호 3이 실행 시간이 가장 오래 걸리고 작업 실행 시간의 대부분을 차지하는 스트래글러 작업으로 이루어짐을 보여줍니다.

![\[활성 실행기의 실행 측정치.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-3.png)


**메모리 프로필:** 처음 두 단계 이후에는 [실행기 번호 3](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.jvm.heap.used)에서 메모리를 적극적으로 소비하며 데이터를 처리합니다. 나머지 실행기는 단순 유휴 상태이거나 처음 두 단계가 완료되고 나서 잠시 후에 중지되었습니다.

![\[처음 두 단계 이후의 메모리 프로필 측정치.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-4.png)


### 그룹화를 사용하여 스트래글링 실행기 수정
<a name="monitor-debug-straggler-fix"></a>

AWS Glue의 *그룹화* 기능을 사용하면 실행기가 뒤처지는 것을 방지할 수 있습니다. 그룹화를 사용하면 데이터를 모든 실행기에 균일하게 분포하고 클러스터의 모든 사용 가능한 실행기를 사용하여 파일을 더 큰 파일로 병합할 수 있습니다. 자세한 내용은 [입력 파일을 더 큰 그룹에서 읽기](grouping-input-files.md) 섹션을 참조하세요.

AWS Glue 작업의 ETL 데이터 이동을 확인하려면 그룹화가 활성화된 상태에서 다음과 같은 코드를 프로파일링합니다.

```
df = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://input_path"], "recurse":True, 'groupFiles': 'inPartition'}, format="json")
datasink = glueContext.write_dynamic_frame.from_options(frame = df, connection_type = "s3", connection_options = {"path": output_path}, format = "json", transformation_ctx = "datasink4")
```

**ETL 데이터 이동:** 이제 작업 실행 시간 전체에 걸쳐 데이터 쓰기와 데이터 읽기를 병렬로 스트리밍합니다. 따라서 작업이 8분(이전보다 훨씬 빠름) 내에 완료됩니다.

![\[문제를 나타냈던 ETL 데이터 이동이 수정되었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-5.png)


**실행기 간의 데이터 셔플:** 입력 파일이 그룹화 기능을 사용하여 읽는 동안 병합되므로 데이터를 읽은 후에 비용이 많이 들던 데이터 셔플이 발생하지 않습니다.

![\[문제를 나타냈던 데이터 셔플 측정치가 수정되었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-6.png)


**작업 실행:** 작업 실행 측정치는 데이터 실행 및 처리 중인 총 활성 실행기 수가 상당히 일관되게 유지됨을 보여줍니다. 작업에 단일 스트래글러가 없습니다. 모든 실행기가 활성 상태이며 작업이 완료될 때까지 활성 상태로 유지됩니다. 실행기 간에 중간 데이터 셔플이 없으므로 작업에 단일 단계만 존재합니다.

![\[작업에 스트래글러가 없음을 보여주는 작업 실행 위젯의 측정치.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-7.png)


**메모리 프로파일:** 이 지표는 모든 실행기의 [활성 메모리 소비](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.jvm.heap.used)를 표시하여 모든 실행기에서 활동이 존재함을 재확인합니다. 데이터가 동시에 스트리밍되고 작성되므로, 모든 실행기의 총 메모리 공간이 모든 실행기의 안전 임계값보다 훨씬 낮고 거의 균일합니다.

![\[모든 실행기에서 활성 메모리 소비를 보여주는 메모리 프로필 측정치.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-straggler-8.png)


# 여러 작업의 진행 상황 모니터링
<a name="monitor-debug-multiple"></a>

여러 AWS Glue 작업을 함께 프로파일링하고 작업 간에 데이터 흐름을 모니터링할 수 있습니다. 이 모니터링은 일반적인 워크플로우 패턴으로, 개별 작업 진행 상황, 데이터 처리 백로그, 데이터 재처리 및 작업 북마크를 모니터링해야 합니다,

**Topics**
+ [프로파일링된 코드](#monitor-debug-multiple-profile)
+ [AWS Glue 콘솔에서 프로파일링된 지표 시각화](#monitor-debug-multiple-visualize)
+ [파일 처리 수정](#monitor-debug-multiple-fix)

## 프로파일링된 코드
<a name="monitor-debug-multiple-profile"></a>

이 워크플로우에는 두 가지 작업, 즉 입력 작업과 출력 작업이 있습니다. 입력 작업은 정기 트리거를 사용하여 30분마다 실행하도록 예약되어 있습니다. 출력 작업은 입력 작업의 각각의 성공적인 실행 이후에 실행하도록 예약되어 있습니다. 이러한 예약된 작업은 작업 트리거를 사용하여 제어됩니다.

![\[입력 및 출력 작업 예약을 제어하는 작업 트리거를 보여주는 콘솔 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-1.png)


**입력 작업**: 이 작업은 Amazon Simple Storage Service(Amazon S3) 위치에서 데이터를 읽고 `ApplyMapping`을 사용하여 변환한 다음, 스테이징 Amazon S3 위치에 씁니다. 다음 코드는 입력 작업용으로 프로파일링된 코드입니다.

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [map_spec])
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": staging_path, "compression": "gzip"}, format = "json")
```

**출력 작업**: 이 작업은 Amazon S3의 스테이징 위치에서 입력 작업의 출력을 읽고. 다시 변환한 다음, 대상에 씁니다.

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": [staging_path], "useS3ListImplementation":True,"recurse":True}, format="json")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [map_spec])
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": output_path}, format = "json")
```

## AWS Glue 콘솔에서 프로파일링된 지표 시각화
<a name="monitor-debug-multiple-visualize"></a>

다음 대시보드는 출력 작업에 대한 동일한 타임라인에서 입력 작업의 Amazon S3 바이트 쓰기 지표를 Amazon S3 바이트 읽기 지표에 중첩합니다. 이 타임라인은 입력 작업과 출력 작업의 서로 다른 작업 실행을 보여줍니다. 입력 작업(빨간색으로 표시됨)이 30분마다 시작됩니다. 출력 작업(갈색으로 표시됨)은 입력 작업 완료 시 시작되며, 최대 동시성은 1입니다.

![\[읽고 쓴 데이터를 표시하는 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-4.png)


이 예에서는, [작업 북마크](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html)가 활성화되지 않습니다. 변환 컨텍스트를 사용하여 스크립트 코드에서 작업 북마크를 활성화하지 않습니다.

**작업 기록**: 입력 및 출력 작업은 오후 12:00부터 시작되는 **기록** 탭에서처럼 여러 번 실행되었습니다.

AWS Glue 콘솔의 입력 작업은 다음과 같습니다.

![\[입력 작업의 기록 탭을 표시하는 콘솔 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-2.png)


다음 이미지는 출력 작업을 보여줍니다.

![\[출력 작업의 기록 탭을 표시하는 콘솔 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-3.png)


**첫 번째 작업 실행**: 아래 읽고 쓴 데이터 바이트 그래프에서처럼, 12:00 \$1 12:30의 입력 및 출력 작업의 첫 번째 작업 실행은 거의 동일한 곡선하 면적을 보입니다. 이 면적은 입력 작업에서 쓴 Amazon S3 바이트와 출력 작업에서 읽은 Amazon S3 바이트를 나타냅니다. 또한 이 데이터는 작성된 Amazon S3 바이트의 비율(30분 동안의 합계 - 입력 작업의 경우 작업 트리거 빈도)로 확인됩니다. 오후 12:00에 시작된 입력 작업 비율의 데이터 지점도 1입니다.

다음 그래프는 모든 작업 실행에 대한 데이터 흐름 비율을 보여줍니다.

![\[데이터 흐름 비율을 보여주는 그래프: 쓴 바이트와 읽은 바이트\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-5.png)


**두 번째 작업 실행**: 두 번째 작업 실행에서 입력 작업에서 쓴 바이트 수와 출력 작업에서 읽은 바이트 수 사이에는 명확한 차이가 있습니다. (출력 작업에 대한 두 작업 실행의 곡선하 면적을 비교하거나, 입력 작업과 출력 작업의 두 번째 실행 시 면적을 비교합니다.) 읽은 바이트 수와 쓴 바이트 수의 비율은 12:30 \$1 13:00의 두 번째 기간인 30분 동안 입력 작업에 의해 작성된 데이터의 약 2.5배를 출력 작업에서 읽었음을 보여줍니다. 이는 작업 북마크가 활성화되지 않았기 때문에 출력 작업이 입력 작업의 첫 번째 작업 실행에서 나오는 출력을 재처리하기 때문입니다. 비율이 1보다 크면 출력 작업에 의해 데이터의 추가 백로그가 처리되었음을 의미합니다.

**세 번째 작업 실행**: 입력 작업은 작성된 바이트 수 면에서 일관성이 거의 유지됩니다(빨간색 곡선하 면적 참조). 하지만, 입력 작업의 세 번째 작업 실행 시간이 예상보다 더 길어졌습니다(빨간색 곡선의 긴 후미부 참조). 결과적으로 출력 작업의 세 번째 작업 실행이 늦게 시작되었습니다. 세 번째 작업은 13:00 \$1 13:30의 나머지 30분 동안 스테이징 위치에 누적된 데이터 부분만 처리했습니다. 바이트 흐름의 비율은 입력 작업의 세 번째 작업 실행에 의해 작성된 데이터의 0.83만 처리되었음을 보여줍니다(13:00의 비율 참조).

**입력 작업과 출력 작업의 중첩**: 입력 작업의 네 번째 작업 실행이 출력 작업의 세 번째 작업 실행이 완료되기 전에 일정에 따라 13:30에 시작되었습니다. 두 작업 실행 사이에 약간의 중첩 부분이 있습니다. 하지만, 출력 작업의 세 번째 작업 실행은 약 13:17에 시작되었을 때 Amazon S3의 스테이징 위치에 나열되어 있는 파일만 캡처합니다. 캡처 데이터는 입력 작업의 첫 번째 작업 실행에서 얻은 모든 데이터 출력으로 구성됩니다. 13:30에서 실제 비율은 약 2.75입니다. 출력 작업의 세 번째 작업 실행에서는 13:30\$114:00의 입력 작업 중 네 번째 작업 실행에서 작성된 데이터의 약 2.75x를 처리했습니다.

이러한 이미지에 표시된 바와 같이, 출력 작업은 입력 작업에 대한 모든 이전 작업 실행의 스테이징 위치부터 데이터를 처리하고 있습니다. 결과적으로, 출력 작업에 대한 네 번째 작업 실행이 가장 길며 입력 작업의 전체 다섯 번째 작업 실행과 겹칩니다.

## 파일 처리 수정
<a name="monitor-debug-multiple-fix"></a>

출력 작업에서 출력 작업의 이전 작업 실행에 의해 처리되지 않은 파일만 처리하도록 해야 합니다. 이렇게 하려면 다음과 같이 출력 작업에서 작업 북마크를 활성화하고 변환 컨텍스트를 설정합니다.

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": [staging_path], "useS3ListImplementation":True,"recurse":True}, format="json", transformation_ctx = "bookmark_ctx")
```

작업 북마크를 활성화한 상태에서는 출력 작업이 입력 작업에 대한 모든 이전 작업 실행의 스테이징 위치에 있는 데이터를 재처리하지 않습니다. 읽고 쓴 데이터를 보여주는 다음 이미지에서는 갈색 곡선하 면적이 상당히 일관되며 빨간 곡선과 비슷합니다.

![\[읽은 데이터와 쓴 데이터를 빨간색 선과 갈색 선으로 표시하는 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-6.png)


추가 데이터 처리가 없으므로 바이트 흐름의 비율도 거의 1에 가깝게 유지됩니다.

![\[데이터 흐름 비율을 보여주는 그래프: 쓴 바이트와 읽은 바이트\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-7.png)


다음 입력 작업 실행이 시작되기 전에 출력 작업에 대한 작업 실행이 시작되고 스테이징 위치에 있는 파일을 캡처하여 더 많은 데이터를 스테이징 위치에 넣습니다. 이 작업이 계속되는 동안은 이전 입력 작업 실행에서 캡처한 파일만 처리되며 비율이 계속 1에 가깝게 유지됩니다.

![\[데이터 흐름 비율을 보여주는 그래프: 쓴 바이트와 읽은 바이트\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-multiple-7.png)


입력 작업이 예상보다 길어지며, 그 결과로서 출력 작업이 두 입력 작업 실행의 스테이징 위치에 있는 파일을 캡처한다고 가정해 보겠습니다. 그러면 해당 출력 작업 실행에 대해 비율이 1보다 높습니다. 하지만, 출력 작업의 다음 작업 실행에서는 출력 작업의 이전 작업 실행에 의해 이미 처리된 파일이 하나도 처리되지 않습니다.

# DPU 용량 계획 모니터링
<a name="monitor-debug-capacity"></a>

AWS Glue의 작업 측정치를 사용하여 AWS Glue 작업을 확장하는 데 사용할 수 있는 데이터 처리 단위(DPU) 수를 추정할 수 있습니다.

**참고**  
이 페이지는 AWS Glue 버전 0.9 및 1.0에만 적용됩니다. 최신 버전의 AWS Glue에는 용량 계획 시 추가 고려 사항을 적용하는 비용 절감 기능이 포함되어 있습니다.

**Topics**
+ [프로파일링된 코드](#monitor-debug-capacity-profile)
+ [AWS Glue 콘솔에서 프로파일링된 지표 시각화](#monitor-debug-capacity-visualize)
+ [최적 DPU 용량 결정](#monitor-debug-capacity-fix)

## 프로파일링된 코드
<a name="monitor-debug-capacity-profile"></a>

다음 스크립트는 428개의 gzip 압축된 JSON 파일을 포함하는 Amazon Simple Storage Service(Amazon S3) 파티션을 읽습니다. 이 스크립트는 필드 이름에 변경할 매핑을 적용하고 변환한 후 다시 Amazon S3에 Apache Parquet 포맷으로 씁니다. 기본값에 따라 10개 DPU를 프로비저닝하고 이 작업을 실행할 수 있습니다.

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": [input_path], "useS3ListImplementation":True,"recurse":True}, format="json")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [(map_spec])
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": output_path}, format = "parquet")
```

## AWS Glue 콘솔에서 프로파일링된 지표 시각화
<a name="monitor-debug-capacity-visualize"></a>

**작업 실행 1:** 이 작업 실행에서는 클러스터에서 부족 프로비저닝된 DPU가 있는지 알아보는 방법을 보여줍니다. AWS Glue의 작업 실행 기능은 [능동적으로 실행 중인 총 실행기 수](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberAllExecutors), [완료된 단계 수](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.numCompletedStages), 그리고 [최대 필요 실행기 수](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors)를 표시합니다.

최대 필요 실행기 수는 총 실행 중인 작업 수와 보류 작업 수를 합한 다음 실행기당 작업 수로 나누어서 계산합니다. 이 결과는 현재 부하를 충족하는 데 필요한 총 실행기 수를 나타내는 측정치입니다.

이와는 대조적으로, 능동적으로 실행 중인 실행기 수는 활성 Apache Spark 작업을 실행 중인 실행기 수를 측정합니다. 작업이 진행됨에 따라 최대 필요 실행기가 변경될 수 있으며 일반적으로 보류 작업 대기열이 축소되면서 작업 완료에 가까워질수록 줄어듭니다.

다음 그래프의 가로 빨간색 선은 최대 할당 실행기 수를 표시하며, 이는 작업에 할당하는 DPU 수에 따라 달라집니다. 이 경우, 작업 실행에 대해 10개 DPU를 할당합니다. 하나의 DPU는 관리용으로 예약되어 있습니다. 9개 DPU가 각각 실행기 두 개를 실행하며 실행기 하나가 Spark 드라이버용으로 예약되어 있습니다. Spark 드라이버는 기본 애플리케이션에서 실행됩니다. 그러므로 최대 할당 실행기 수는 2\$19 - 1 = 17개입니다.

![\[활성 실행기 및 최대 필요 실행기를 표시하는 작업 측정치.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-capacity-1.png)


그래프가 표시될 때, 최대 필요 실행기 수는 작업 시작 시 107로 시작하지만, 활성 실행기 수는 17개로 유지됩니다. 이 개수는 DPU 수가 10개인 최대 할당 실행기 수와 동일합니다. 최대 필요 실행기 수와 최대 할당 실행기 수 간의 비율(Spark 드라이버에 대해 두 수치에 모두 1을 더함)은 부족 프로비저닝 계수를 제공합니다. 즉, 108/18 = 6x. 최대 병렬화로 실행하고 더 빨리 완료하도록 작업을 확장하기 위해 6(언더프로비저닝 비율)\$19(현재 DPU 용량 - 1) \$1 DPU 1개 = DPU 55개를 프로비저닝할 수 있습니다.

AWS Glue 콘솔은 자세한 작업 지표를 원래 할당된 최대 실행기 수를 나타내는 정적 행으로 표시합니다. 이 콘솔은 지표에 대한 작업 정의에서 할당된 최대 실행기를 계산합니다. 반면 자세한 작업 실행 지표의 경우 이 콘솔은 작업 실행 구성에서 할당된 최대 실행기, 특히 작업 실행에 대해 할당된 DPU를 계산합니다. 개별 작업 실행에 대한 지표를 보려면 작업 실행을 선택하고 **View run metrics(실행 지표 보기)**를 선택합니다.

![\[ETL 데이터 이동을 표시하는 작업 측정치\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-capacity-2.png)


[읽고](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes) [쓴](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes) Amazon S3 바이트를 살펴보면 작업이 Amazon S3에서 데이터를 스트리밍하고 병렬로 쓰는 데 6분을 모두 소비함을 알 수 있습니다. 할당된 DPU의 모든 코어가 Amazon S3에(서) 읽고 쓰고 있습니다. 최대 필요 실행기 수(107)는 입력 Amazon S3 경로의 파일 수(428)와도 일치합니다. 각 실행기는 Spark 작업 네 개를 시작하여 네 개 입력 파일(JSON gzip 압축됨)을 처리할 수 있습니다.

## 최적 DPU 용량 결정
<a name="monitor-debug-capacity-fix"></a>

이전 작업 실행 결과에 따라, 총 할당된 DPU 수를 55로 늘리고 작업이 어떻게 수행되는지 알아볼 수 있습니다. 작업이 이전 소요 시간의 절반에 해당하는 3분 이내에 완료됩니다. 단기 실행 작업이므로 이 경우에는 작업 확장이 선형적이지 않습니다. 장기 지속 작업이나 다량의 작업을 포함하는 작업(최대 필요 실행기 수가 많음)은 선형에 가까운 DPU 확장 성능 가속화가 도움이 됩니다.

![\[총 할당 DPU 수 증가를 보여주는 그래프\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-capacity-3.png)


위 이미지에서 볼 수 있듯이 활성 실행기의 총 수는 할당된 최대값인 107개에 도달합니다. 마찬가지로, 최대 필요 실행기는 최대 할당 실행기 수보다 절대 높지 않습니다. 최대 필요 실행기 수는 능동적으로 실행 중인 작업 수와 보류 중인 작업 수에서 계산되므로 활성 실행기 수보다 작을 수도 있습니다. 이는 짧은 시간 동안 부분적으로 또는 전체적으로 유휴 상태이거나 아직 폐기되지 않은 실행기가 있을 수 있기 때문입니다.

![\[총 활성 실행기 수가 최대 할당 개수에 도달함을 보여주는 그래프\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-capacity-4.png)


이 작업 실행은 6x 이상의 실행기를 사용하여 Amazon S3에서 데이터를 동시에 읽고 씁니다. 결과적으로 이 작업은 읽기 및 쓰기에 모두 더 많은 Amazon S3 대역폭을 사용하여 더 빨리 완료합니다.

### 과다 프로비저닝된 DPU 식별
<a name="monitor-debug-capacity-over"></a>

다음에는, DPU가 100개(99 \$1 2 = 198개 실행기)인 작업을 확장하는 것이 성능을 향상하는 데 도움이 되는지 여부를 결정할 수 있습니다. 다음 그래프와 같이, 작업을 완료하는 데 여전히 3분이 걸립니다. 마찬가지로, 이 작업은 실행기를 107 개 이상(55개 DPU 구성)으로 확장하지 않으며, 남은 91개 실행기가 과다 프로비저닝되고 전혀 사용되지 않습니다. 이는 최대 필요 실행기 수에서 분명히 알 수 있듯이 DPU 수를 늘리는 것이 항상 성능을 향상시키지는 않을 수도 있음을 보여줍니다.

![\[DPU 수를 늘리는 것이 작업 성능을 항상 향상시키지는 않음을 보여주는 그래프.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/monitor-debug-capacity-5.png)


### 시간차 비교
<a name="monitor-debug-capacity-time"></a>

다음 표에 나와 있는 세 가지 작업 실행은 10개 DPU, 55개 DPU 및 100개 DPU에 대한 작업 실행 시간을 요약한 것입니다. 첫 번째 작업 실행을 모니터링함으로써 설정한 추정치를 사용하여 작업 실행 시간을 개선할 DPU 용량을 찾아낼 수 있습니다.


| 작업 ID | DPU 수 | 실행 시간 | 
| --- | --- | --- | 
| jr\$1c894524c8ef5048a4d9... | 10 | 6분 | 
| jr\$11a466cf2575e7ffe6856... | 55 | 3분 | 
| jr\$134fa1ed4c6aa9ff0a814... | 100 | 3분 | 

# AWS Glue에서 Apache Spark에 대한 생성형 AI 문제 해결
<a name="troubleshoot-spark"></a>

 AWS Glue에서 Apache Spark 작업에 대한 생성형 AI 문제 해결은 데이터 엔지니어와 과학자는 Spark 애플리케이션에서 문제를 쉽게 진단하고 수정할 수 있는 새로운 기능입니다. 이 기능은 기계 학습 및 생성형 AI 기술을 활용하여 Spark 작업의 문제를 분석하고 이러한 문제를 해결하기 위한 실행 가능한 권장 사항과 함께 자세한 근본 원인 분석을 제공합니다. Apache Spark용 생성형 AI 문제 해결은 AWS Glue 버전 4.0 이상에서 실행되는 작업에 사용할 수 있습니다.


|  | 
| --- |
|  이제 AWS Glue, Amazon EMR-EC2, Amazon EMR-Serverless, Amazon SageMaker AI 노트북을 포함한 모든 주요 배포 모드를 지원하는 AI 기반 문제 해결 에이전트로 Apache Spark 문제 해결을 혁신하세요. 이 강력한 에이전트는 자연어 상호 작용, 실시간 워크로드 분석, 스마트 코드 권장 사항을 원활한 경험으로 결합하여 복잡한 디버깅 프로세스를 제거합니다. 구현 세부 정보는 [Amazon EMR용 Apache Spark 문제 해결 에이전트란 무엇인가요?](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/spark-troubleshoot.html)를 참조하세요. AWS Glue 문제 해결 예제는 [문제 해결 에이전트 사용](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/spark-troubleshooting-using-troubleshooting-agent.html)의 두 번째 데모를 확인하세요.  | 

## Apache Spark에 대한 생성형 AI 문제 해결은 어떻게 작동하나요?
<a name="troubleshoot-spark-how-it-works"></a>

 실패한 Spark 작업에 대해 생성형 AI 문제 해결은 작업 메타데이터와 작업의 오류 서명과 연결된 정확한 지표 및 로그를 분석하여 근본 원인 분석을 생성하고 작업 실패를 해결하는 데 도움이 되는 특정 솔루션과 모범 사례를 권장합니다.

## 작업과 관련해 Apache Spark에 대한 생성형 AI 문제 해결 설정
<a name="w2aac37c11c12c33c13"></a>

### IAM 권한 구성
<a name="troubleshoot-spark-iam-permissions"></a>

 AWS Glue의 작업에 대해 Spark 문제 해결이 사용하는 API에 권한을 부여하려면 적절한 IAM 권한이 필요합니다. 다음과 같은 사용자 지정 AWS 정책을 IAM ID(예: 사용자, 역할 또는 그룹)에 연결하여 권한을 확보할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:StartCompletion",
        "glue:GetCompletion"
      ],
      "Resource": [
        "arn:aws:glue:*:*:completion/*",
        "arn:aws:glue:*:*:job/*"
      ]
    }
  ]
}
```

------

**참고**  
 AWS Glue Studio 콘솔을 통해 이 환경을 활성화하기 위해 IAM 정책에서 `StartCompletion` 및 `GetCompletion`과 같은 두 가지 API가 사용됩니다.

### 권한 할당
<a name="troubleshoot-spark-assigning-permissions"></a>

 액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요.
+  IAM Identity Center에서 사용자 및 그룹의 경우: 권한 세트를 생성합니다. IAM Identity Center 사용 설명서의 [권한 세트 생성](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)의 지침을 따릅니다.
+  ID 제공업체를 통해 IAM에서 관리되는 사용자의 경우: ID 페더레이션을 위한 역할을 생성합니다. IAM 사용 설명서의 [타사 ID 제공업체의 역할 생성(페더레이션)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)의 지침을 따릅니다.
+  IAM 사용자의 경우: 사용자가 수임할 수 있는 역할을 생성합니다. IAM 사용 설명서의 [IAM 사용자 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)의 지침을 따릅니다.

## 실패한 작업 실행에서 문제 해결 분석 실행
<a name="troubleshoot-spark-run-analysis"></a>

 AWS Glue 콘솔의 여러 경로를 통해 문제 해결 기능에 액세스할 수 있습니다. 시작하는 방법은 다음과 같습니다.

### 옵션 1: 작업 목록 페이지에서
<a name="troubleshoot-spark-from-jobs-list"></a>

1.  [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1.  탐색 창에서 **ETL 작업**을 선택하세요.

1.  작업 목록에서 실패한 작업을 찾으세요.

1.  작업 세부 정보 섹션에서 **실행** 탭을 선택하세요.

1.  분석하려는 실패한 작업 실행을 클릭하세요.

1.  **AI를 사용하여 문제 해결**을 선택하여 분석을 시작하세요.

1.  문제 해결 분석이 완료되면 화면 하단의 **문제 해결 분석** 탭에서 근본 원인 분석 및 권장 사항을 볼 수 있습니다.

![\[GIF에서는 실패한 실행의 엔드투엔드 구현과 AI 기능이 실행 중인 문제 해결을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/troubleshoot_spark_option_1_jobs_list.gif)


### 옵션 2: 작업 실행 모니터링 페이지 사용
<a name="troubleshoot-spark-job-run-monitoring-page"></a>

1.  **작업 실행 모니터링** 페이지로 이동하세요.

1.  실패한 작업 실행을 찾으세요.

1.  드롭다운 메뉴에서 **작업**을 선택하세요.

1.  **AI를 사용하여 문제 해결**을 선택하세요.

![\[GIF에서는 실패한 실행의 엔드투엔드 구현과 AI 기능이 실행 중인 문제 해결을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/troubleshoot_spark_option_2_job_monitoring.gif)


### 옵션 3: 작업 실행 세부 정보 페이지에서
<a name="troubleshoot-spark-job-run-details-page"></a>

1.  **실행** 탭에서 실패한 실행의 **세부 정보 보기**를 클릭하거나 **작업 실행 모니터링** 페이지에서 작업 실행을 선택하여 실패한 작업 실행의 세부 정보 페이지로 이동하세요.

1.  작업 실행 세부 정보 페이지에서 **문제 해결 분석** 탭을 찾으세요.

## 지원되는 문제 해결 범주
<a name="troubleshoot-spark-supported-troubleshooting-categories"></a>

 이 서비스는 데이터 엔지니어와 개발자가 Spark 애플리케이션에서 자주 접하는 세 가지 주요 카테고리의 문제에 중점을 둡니다.
+  **리소스 설정 및 액세스 오류:** AWS Glue에서 Spark 애플리케이션을 실행하는 경우 리소스 설정 및 액세스 오류는 가장 흔하지만 진단하기 어려운 문제 중 하나입니다. 이러한 오류는 Spark 애플리케이션에서 AWS 리소스와 상호 작용하려고 시도하지만 권한 문제, 리소스 누락 또는 구성 문제가 나타날 때 종종 발생합니다.
+  **Spark 드라이버 및 실행기 메모리 문제:** Apache Spark 작업에서 메모리 관련 오류는 진단 및 해결이 복잡할 수 있습니다. 이러한 오류는 데이터 처리 요구 사항이 드라이버 노드 또는 실행기 노드에서 사용 가능한 메모리 리소스를 초과할 때 종종 발생합니다.
+  **Spark 디스크 용량 문제:** AWS Glue Spark 작업의 스토리지 관련 오류는 셔플 작업, 데이터 유출 또는 대규모 데이터 변환 처리 중에 종종 발생합니다. 이러한 오류는 한동안 작업이 실행될 때까지 명확히 드러나지 않으므로 귀중한 컴퓨팅 시간과 리소스가 낭비될 수 있어서 특히 처리하기 까다로울 수 있습니다.
+  **쿼리 실행 오류:** 오류 메시지가 근본 원인을 명확하게 가리키지 않을 수 있고 작은 데이터 세트에서 잘 작동하던 쿼리가 갑자기 대규모에서 실패할 수 있으므로 Spark SQL 및 DataFrame 작업의 쿼리 실패 문제를 해결하기 어려울 수 있습니다. 이러한 오류는 실제 문제가 쿼리 로직 자체가 아닌 이전 단계의 데이터 품질 문제로 인해 발생할 수 있는 복잡한 변환 파이프라인 내에서 심층적으로 발생할 때 더욱 어려워집니다.

**참고**  
 프로덕션 환경에서 제안된 변경 사항을 구현하기 전에 제안된 변경 사항을 철저히 검토합니다. 이 서비스에서는 패턴과 모범 사례를 기반으로 권장 사항을 제공하지만 특정 사용 사례에는 추가 고려 사항이 필요할 수 있습니다.

## 지원되는 리전
<a name="troubleshoot-spark-supported-regions"></a>

Apache Spark용 생성형 AI 문제 해결을 사용할 수 있는 리전은 다음과 같습니다.
+ **아프리카**: 케이프타운(af-south-1)
+ **아시아 태평양**: 홍콩(ap-east-1), 도쿄(ap-northeast-1), 서울(ap-northeast-2), 오사카(ap-northeast-3), 뭄바이(ap-south-1), 싱가포르(ap-southeast-1), 시드니(ap-southeast-2), 자카르타(ap-southeast-3)
+ **유럽**: 프랑크푸르트(eu-central-1), 스톡홀름(eu-north-1), 밀라노(eu-south-1), 아일랜드(eu-west-1), 런던(eu-west-2), 파리(eu-west-3)
+ **중동**: 바레인(me-south-1), UAE(me-central-1)
+ **북미**: 캐나다(ca-central-1)
+ **남아메리카**: 상파울루(sa-east-1)
+ **미국**: 버지니아 북부(us-east-1), 오하이오(us-east-2), 캘리포니아 북부(us-west-1), 오리건(us-west-2)

# AWS Glue에서 구체화된 뷰 사용
<a name="materialized-views"></a>

AWS Glue 버전 5.1 이상은 AWS Glue Data Catalog에서 Apache Iceberg 구체화된 뷰 생성 및 관리를 지원합니다. 구체화된 뷰는 SQL 쿼리의 사전 계산된 결과를 Apache Iceberg 형식으로 저장하고 기본 소스 테이블이 변경될 때 증분 업데이트하는 관리형 테이블입니다. 구체화된 뷰를 사용하여 데이터 변환 파이프라인을 간소화하고 복잡한 분석 워크로드의 쿼리 성능을 가속화할 수 있습니다.

AWS Glue에서 Spark를 사용하여 구체화된 뷰를 생성하면 뷰 정의와 메타데이터가 AWS Glue Data Catalog에 저장됩니다. 사전 계산된 결과는 계정 내의 Amazon S3 Tables 버킷 또는 Amazon S3 범용 버킷에 Apache Iceberg 테이블로 저장됩니다. AWS Glue Data Catalog는 관리형 컴퓨팅 인프라를 사용하여 소스 테이블을 자동으로 모니터링하고 구체화된 뷰를 새로 고칩니다.

**Topics**
+ [구체화된 뷰가 AWS Glue에서 작동하는 방식](#materialized-views-how-they-work)
+ [사전 조건](#materialized-views-prerequisites)
+ [구체화된 뷰를 사용하도록 Spark 구성](#materialized-views-configuring-spark)
+ [구체화된 뷰 생성](#materialized-views-creating)
+ [구체화된 뷰 쿼리](#materialized-views-querying)
+ [구체화된 뷰 새로 고침](#materialized-views-refreshing)
+ [구체화된 뷰 관리](#materialized-views-managing)
+ [구체화된 뷰에 대한 권한](#materialized-views-permissions)
+ [구체화된 뷰 작업 모니터링](#materialized-views-monitoring)
+ [예제: 전체 워크플로](#materialized-views-complete-workflow)
+ [고려 사항 및 제한 사항](#materialized-views-considerations-limitations)

## 구체화된 뷰가 AWS Glue에서 작동하는 방식
<a name="materialized-views-how-they-work"></a>

구체화된 뷰는 AWS Glue 작업과 AWS Glue Studio 노트북에서 Apache Spark의 Iceberg 지원을 통해 AWS Glue와 통합됩니다. AWS Glue Data Catalog를 사용하도록 Spark 세션을 구성할 때 표준 SQL 구문을 사용하여 구체화된 뷰를 생성할 수 있습니다. Spark 옵티마이저는 더 나은 성능을 제공할 때 구체화된 뷰를 사용하도록 쿼리를 자동으로 재작성할 수 있으므로 애플리케이션 코드를 수동으로 수정할 필요가 없습니다.

AWS Glue Data Catalog는 다음을 포함하여 구체화된 뷰 유지 관리의 모든 운영 측면을 처리합니다.
+ Apache Iceberg의 메타데이터 계층을 사용하여 소스 테이블의 변경 사항 탐지
+ 관리형 Spark 컴퓨팅을 사용하여 새로 고침 작업 예약 및 실행
+ 데이터 변경을 기반으로 전체 새로 고침 수행 또는 증분 새로 고침 수행 여부 결정
+ 다중 엔진 액세스를 위해 사전 계산된 결과를 Apache Iceberg 형식으로 저장

일반 테이블에 사용하는 것과 동일한 Spark SQL 인터페이스를 사용하여 AWS Glue에서 구체화된 뷰를 쿼리할 수 있습니다. Amazon Athena와 Amazon Redshift를 포함한 다른 서비스에서도 사전 계산된 데이터에 액세스할 수 있습니다.

## 사전 조건
<a name="materialized-views-prerequisites"></a>

AWS Glue에서 구체화된 뷰를 사용하려면 다음이 필요합니다.
+  계정
+ AWS Glue 버전 5.1 이상
+ AWS Glue Data Catalog에 등록된 Apache Iceberg 형식의 소스 테이블
+ 소스 테이블 및 대상 데이터베이스에 대해 구성된 AWS Lake Formation 권한
+ 구체화된 뷰 데이터 저장을 위해 AWS Lake Formation에 등록된 S3 Tables 버킷 또는 S3 범용 버킷
+ AWS Glue Data Catalog와 Amazon S3에 액세스할 수 있는 권한이 있는 IAM 역할

## 구체화된 뷰를 사용하도록 Spark 구성
<a name="materialized-views-configuring-spark"></a>

AWS Glue에서 구체화된 뷰를 생성하고 관리하려면 필수 Iceberg 확장 및 카탈로그 설정으로 Spark 세션을 구성합니다. 구성 방법은 AWS Glue 작업을 사용하는지 아니면 AWS Glue Studio 노트북을 사용하는지에 따라 달라집니다.

### AWS Glue 작업 구성
<a name="materialized-views-configuring-glue-jobs"></a>

AWS Glue 작업을 생성하거나 업데이트할 때 다음 구성 파라미터를 작업 파라미터로 추가합니다.

#### S3 Tables 버킷의 경우
<a name="materialized-views-s3-tables-buckets"></a>

```
job = glue.create_job(
    Name='materialized-view-job',
    Role='arn:aws:iam::111122223333:role/GlueServiceRole',
    Command={
        'Name': 'glueetl',
        'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py',
        'PythonVersion': '3'
    },
    DefaultArguments={
        '--enable-glue-datacatalog': 'true',
        '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions '
        '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.glue_catalog.type=glue '
                  '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse '
                  '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 '
                  '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.catalog.s3t_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.s3t_catalog.type=glue '
                  '--conf spark.sql.catalog.s3t_catalog.glue.id=111122223333:s3tablescatalog/my-table-bucket ',
                  '--conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.catalog.s3t_catalog.warehouse=s3://amzn-s3-demo-bucket/mv-warehouse '
                  '--conf spark.sql.catalog.s3t_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.defaultCatalog=s3t_catalog '
                  '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true '
                  '--conf spark.sql.materializedViews.metadataCache.enabled=true'
    },
    GlueVersion='5.1'
)
```

#### S3 범용 버킷의 경우
<a name="materialized-views-s3-general-purpose-buckets"></a>

```
job = glue.create_job(
    Name='materialized-view-job',
    Role='arn:aws:iam::111122223333:role/GlueServiceRole',
    Command={
        'Name': 'glueetl',
        'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py',
        'PythonVersion': '3'
    },
    DefaultArguments={
        '--enable-glue-datacatalog': 'true',
        '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions '
                  '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.glue_catalog.type=glue '
                  '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse '
                  '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.defaultCatalog=glue_catalog '
                  '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true '
                  '--conf spark.sql.materializedViews.metadataCache.enabled=true'
    },
    GlueVersion='5.1'
)
```

### AWS Glue Studio 노트북 구성
<a name="materialized-views-configuring-glue-studio-notebooks"></a>

AWS Glue Studio 노트북에서 노트북 시작 부분에 있는 %%configure 매직 명령을 사용하여 Spark 세션을 구성합니다.

```
%%configure
{
    "conf": {
        "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
        "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog",
        "spark.sql.catalog.glue_catalog.type": "glue",
        "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse",
        "spark.sql.catalog.glue_catalog.glue.region": "us-east-1",
        "spark.sql.catalog.glue_catalog.glue.id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true",
        "spark.sql.defaultCatalog": "glue_catalog",
        "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true",
        "spark.sql.materializedViews.metadataCache.enabled": "true"
    }
}
```

### 증분 새로 고침 활성화
<a name="materialized-views-enabling-incremental-refresh"></a>

증분 새로 고침 최적화를 활성화하려면 작업 파라미터 또는 노트북 구성에 다음 구성 속성을 추가합니다.

```
--conf spark.sql.optimizer.incrementalMVRefresh.enabled=true
--conf spark.sql.optimizer.incrementalMVRefresh.deltaThresholdCheckEnabled=false
```

### 구성 파라미터
<a name="materialized-views-configuration-parameters"></a>

다음 구성 파라미터는 구체화된 뷰 동작을 제어합니다.
+ `spark.sql.extensions` - 구체화된 뷰 지원에 필요한 Iceberg Spark 세션 확장을 활성화합니다.
+ `spark.sql.optimizer.answerQueriesWithMVs.enabled` - 구체화된 뷰를 사용하기 위한 자동 쿼리 재작성을 활성화합니다. 이 최적화를 활성화하려면 true로 설정합니다.
+ `spark.sql.materializedViews.metadataCache.enabled` - 쿼리 최적화를 위해 구체화된 뷰 메타데이터의 캐싱을 활성화합니다. 쿼리 재작성 성능을 개선하려면 true로 설정합니다.
+ `spark.sql.optimizer.incrementalMVRefresh.enabled` - 증분 새로 고침 최적화를 활성화합니다. 새로 고침 작업 중에 변경된 데이터만 처리하려면 true로 설정합니다.
+ `spark.sql.optimizer.answerQueriesWithMVs.decimalAggregateCheckEnabled` - 쿼리 재작성 시 십진수 집계 작업의 유효성 검사를 제어합니다. 특정 십진수 오버플로 검사를 비활성화하려면 false로 설정합니다.

## 구체화된 뷰 생성
<a name="materialized-views-creating"></a>

AWS Glue 작업 또는 노트북에서 CREATE MATERIALIZED VIEW SQL 문을 사용하여 구체화된 뷰를 생성합니다. 뷰 정의는 변환 로직을 하나 이상의 소스 테이블을 참조하는 SQL 쿼리로 지정합니다.

### AWS Glue 작업에서 기본 구체화된 뷰 생성
<a name="materialized-views-creating-basic-glue-jobs"></a>

다음 예제에서는 AWS Glue 작업 스크립트에서 구체화된 뷰를 생성하는 방법을 보여 줍니다. 뷰 정의에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용합니다.

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Create materialized view
spark.sql("""
    CREATE MATERIALIZED VIEW customer_orders
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### 자동 새로 고침을 사용하여 구체화된 뷰 생성
<a name="materialized-views-creating-automatic-refresh"></a>

자동 새로 고침을 구성하려면 뷰 정의에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용하여 뷰를 생성할 때 새로 고침 일정을 지정합니다.

```
spark.sql("""
    CREATE MATERIALIZED VIEW customer_orders
    SCHEDULE REFRESH EVERY 1 HOUR
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### 카탈로그 간 참조를 사용하여 구체화된 뷰 생성
<a name="materialized-views-creating-cross-catalog"></a>

소스 테이블이 구체화된 뷰와 다른 카탈로그에 있는 경우 뷰 이름과 뷰 정의 모두에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용합니다.

```
spark.sql("""
    CREATE MATERIALIZED VIEW s3t_catalog.analytics.customer_summary
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### AWS Glue Studio 노트북에서 구체화된 뷰 생성
<a name="materialized-views-creating-glue-studio-notebooks"></a>

AWS Glue Studio 노트북에서는 %%sql 매직 명령을 사용하여 뷰 정의에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용하여 구체화된 뷰를 생성할 수 있습니다.

```
%%sql
CREATE MATERIALIZED VIEW customer_orders
AS 
SELECT 
    customer_name, 
    COUNT(*) as order_count, 
    SUM(amount) as total_amount 
FROM glue_catalog.sales.orders
GROUP BY customer_name
```

## 구체화된 뷰 쿼리
<a name="materialized-views-querying"></a>

구체화된 뷰를 생성한 후 AWS Glue 작업 또는 노트북에서 표준 SQL SELECT 문을 사용하여 다른 테이블처럼 쿼리할 수 있습니다.

### AWS Glue 작업에서 쿼리
<a name="materialized-views-querying-glue-jobs"></a>

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Query materialized view
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

### AWS Glue Studio 노트북에서 쿼리
<a name="materialized-views-querying-glue-studio-notebooks"></a>

```
%%sql
SELECT * FROM customer_orders
```

### 자동 쿼리 재작성
<a name="materialized-views-automatic-query-rewrite"></a>

자동 쿼리 재작성이 활성화되면 Spark 옵티마이저는 쿼리를 분석하여 성능을 개선할 수 있을 때 구체화된 뷰를 자동으로 사용합니다. 예를 들어 다음 쿼리를 실행하는 경우:

```
result = spark.sql("""
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM orders
    GROUP BY customer_name
""")
```

Spark 옵티마이저는 구체화된 뷰가 최신 상태인 경우 기본 주문 테이블을 처리하는 대신 customer\$1orders 구체화된 뷰를 사용하도록 이 쿼리를 자동으로 재작성합니다.

### 자동 쿼리 재작성 확인
<a name="materialized-views-verifying-automatic-query-rewrite"></a>

쿼리가 자동 쿼리 재작성을 사용하는지 확인하려면 EXPLAIN EXTENDED 명령을 사용합니다.

```
spark.sql("""
    EXPLAIN EXTENDED
    SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount 
    FROM orders
    GROUP BY customer_name
""").show(truncate=False)
```

실행 계획의 BatchScan 작업에서 구체화된 뷰 이름을 찾습니다. 계획에 BatchScan glue\$1catalog.sales.orders 대신 BatchScan glue\$1catalog.analytics.customer\$1orders가 표시되면 구체화된 뷰를 사용하도록 쿼리가 자동으로 재작성된 것입니다.

자동 쿼리 재작성은 구체화된 뷰를 생성한 후 Spark 메타데이터 캐시가 채워지는 데 시간이 걸립니다. 이 프로세스는 일반적으로 30초 내에 완료됩니다.

## 구체화된 뷰 새로 고침
<a name="materialized-views-refreshing"></a>

전체 새로 고침과 증분 새로 고침이라는 2가지 방법을 사용하여 구체화된 뷰를 새로 고칠 수 있습니다. 전체 새로 고침은 모든 기본 테이블 데이터에서 전체 구체화된 뷰를 다시 계산하는 반면, 증분 새로 고침은 마지막 새로 고침 이후 변경된 데이터만 처리합니다.

### AWS Glue 작업에서 수동 전체 새로 고침
<a name="materialized-views-manual-full-refresh-glue-jobs"></a>

구체화된 뷰의 전체 새로 고침을 수행하려면

```
spark.sql("REFRESH MATERIALIZED VIEW customer_orders FULL")

# Verify updated results
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

### AWS Glue 작업에서 수동 증분 새로 고침
<a name="materialized-views-manual-incremental-refresh-glue-jobs"></a>

증분 새로 고침을 수행하려면 Spark 세션 구성에서 증분 새로 고침이 활성화되어 있는지 확인한 후 다음을 실행합니다.

```
spark.sql("REFRESH MATERIALIZED VIEW customer_orders")

# Verify updated results
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

AWS Glue Data Catalog는 뷰 정의와 변경된 데이터의 양을 기반으로 증분 새로 고침의 적용 여부를 자동으로 결정합니다. 증분 새로 고침이 불가능한 경우 작업은 전체 새로 고침으로 돌아갑니다.

### AWS Glue Studio 노트북에서 새로 고침
<a name="materialized-views-refreshing-glue-studio-notebooks"></a>

노트북에서 %%sql 매직 명령을 사용합니다.

```
%%sql
REFRESH MATERIALIZED VIEW customer_orders FULL
```

### 증분 새로 고침 실행 확인
<a name="materialized-views-verifying-incremental-refresh"></a>

증분 새로 고침이 성공적으로 실행되었는지 확인하려면 AWS Glue 작업에서 디버그 로깅을 활성화합니다.

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext
import logging

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Enable debug logging
logger = logging.getLogger('org.apache.spark.sql')
logger.setLevel(logging.DEBUG)

# Execute refresh
spark.sql("REFRESH MATERIALIZED VIEW customer_orders")
```

AWS Glue 작업 로그에서 다음 메시지를 검색합니다.

```
DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh
```

## 구체화된 뷰 관리
<a name="materialized-views-managing"></a>

AWS Glue는 작업과 노트북에서 구체화된 뷰의 수명 주기를 관리하기 위한 SQL 명령을 제공합니다.

### 구체화된 뷰 설명
<a name="materialized-views-describing"></a>

정의, 새로 고침 상태, 마지막 새로 고침 타임스탬프를 포함하여 구체화된 뷰에 대한 메타데이터를 보려면:

```
spark.sql("DESCRIBE EXTENDED customer_orders").show(truncate=False)
```

### 구체화된 뷰 변경
<a name="materialized-views-altering"></a>

기존 구체화된 뷰의 새로 고침 일정을 수정하려면

```
spark.sql("""
    ALTER MATERIALIZED VIEW customer_orders 
    ADD SCHEDULE REFRESH EVERY 2 HOURS
""")
```

자동 새로 고침을 제거하려면

```
spark.sql("""
    ALTER MATERIALIZED VIEW customer_orders 
    DROP SCHEDULE
""")
```

### 구체화된 뷰 삭제
<a name="materialized-views-dropping"></a>

구체화된 뷰를 삭제하려면

```
spark.sql("DROP MATERIALIZED VIEW customer_orders")
```

이 명령은 AWS Glue Data Catalog에서 구체화된 뷰 정의를 제거하고 S3 버킷에서 기본 Iceberg 테이블 데이터를 삭제합니다.

### 구체화된 뷰 나열
<a name="materialized-views-listing"></a>

데이터베이스에서 모든 구체화된 뷰를 나열하려면

```
spark.sql("SHOW VIEWS FROM analytics").show()
```

## 구체화된 뷰에 대한 권한
<a name="materialized-views-permissions"></a>

구체화된 뷰를 생성하고 관리하려면 AWS Lake Formation 권한을 구성해야 합니다. 구체화된 뷰를 생성하는 IAM 역할(정의자 역할)에는 소스 테이블 및 대상 데이터베이스에 대한 특정 권한이 필요합니다.

### 정의자 역할에 필요한 권한
<a name="materialized-views-required-permissions-definer-role"></a>

정의자 역할에는 다음과 같은 Lake Formation 권한이 있어야 합니다.
+ 소스 테이블에서 - 행, 열 또는 셀 필터가 없는 SELECT 또는 ALL 권한
+ 대상 데이터베이스에서 - CREATE\$1TABLE 권한
+ AWS Glue Data Catalog에서 - GetTable 및 CreateTable API 권한

구체화된 뷰를 생성하면 정의자 역할의 ARN이 뷰 정의에 저장됩니다. AWS Glue Data Catalog는 자동 새로 고침 작업을 실행할 때 이 역할을 수임합니다. 정의자 역할이 소스 테이블에 대한 액세스 권한을 상실하면 권한이 복원될 때까지 새로 고침 작업이 실패합니다.

### AWS Glue 작업을 위한 IAM 권한
<a name="materialized-views-iam-permissions-glue-jobs"></a>

AWS Glue 작업의 IAM 역할에는 다음 권한이 필요합니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetCatalog",
                "glue:GetCatalogs",
                "glue:GetTable",
                "glue:GetTables",
                "glue:CreateTable",
                "glue:UpdateTable",
                "glue:DeleteTable",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}
```

구체화된 뷰 자동 새로 고침에 사용하는 역할에는 역할에 대한 iam:PassRole 권한이 있어야 합니다.

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

Glue가 구체화된 뷰를 자동으로 새로 고치도록 하려면 서비스가 역할을 수임할 수 있도록 하는 다음과 같은 신뢰 정책도 역할에 있어야 합니다.

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

구체화된 뷰가 S3 Tables 버킷에 저장된 경우 역할에 다음 권한도 추가해야 합니다.

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3tables:PutTableMaintenanceConfiguration"
      ],
      "Resource": "arn:aws:s3tables:*:123456789012:*"
    }
  ]
}
```

### 구체화된 뷰에 대한 액세스 권한 부여
<a name="materialized-views-granting-access"></a>

구체화된 뷰를 쿼리할 수 있는 액세스 권한을 다른 사용자에게 부여하려면 AWS Lake Formation을 사용하여 구체화된 뷰 테이블에 대한 SELECT 권한을 부여합니다. 사용자는 기본 소스 테이블에 직접 액세스할 필요 없이 구체화된 뷰를 쿼리할 수 있습니다.

자세한 내용은 AWS Lake Formation 개발자 안내서의 데이터 카탈로그 리소스에 대한 권한 부여를 참조하세요.

## 구체화된 뷰 작업 모니터링
<a name="materialized-views-monitoring"></a>

AWS Glue Data Catalog는 구체화된 뷰 새로 고침 작업의 지표와 로그를 Amazon CloudWatch에 게시합니다. CloudWatch 지표를 통해 새로 고침 상태, 기간, 처리되는 데이터 볼륨을 모니터링할 수 있습니다.

### 작업 로그 보기
<a name="materialized-views-viewing-job-logs"></a>

구체화된 뷰를 생성하거나 새로 고치는 AWS Glue 작업 로그를 보려면:

1. AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 작업을 선택합니다.

1. 작업을 선택하고 실행을 선택합니다.

1. 특정 실행을 선택하고 로그를 선택하여 CloudWatch 로그를 봅니다.

### 경보 설정
<a name="materialized-views-setting-up-alarms"></a>

새로 고침 작업이 실패하거나 예상 기간을 초과할 때 알림을 받으려면 구체화된 뷰 지표에 대한 CloudWatch 경보를 생성합니다. Amazon EventBridge 규칙을 구성하여 새로 고침 이벤트에 대한 자동 응답을 트리거할 수도 있습니다.

## 예제: 전체 워크플로
<a name="materialized-views-complete-workflow"></a>

다음 예제는 AWS Glue에서 구체화된 뷰를 생성하고 사용하기 위한 전체 워크플로를 보여줍니다.

### AWS Glue 작업 스크립트 예제
<a name="materialized-views-example-glue-job-script"></a>

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# Create database and base table
spark.sql("CREATE DATABASE IF NOT EXISTS sales")
spark.sql("USE sales")

spark.sql("""
    CREATE TABLE IF NOT EXISTS orders (
        id INT,
        customer_name STRING,
        amount DECIMAL(10,2),
        order_date DATE
    )
""")

# Insert sample data
spark.sql("""
    INSERT INTO orders VALUES 
        (1, 'John Doe', 150.00, DATE('2024-01-15')),
        (2, 'Jane Smith', 200.50, DATE('2024-01-16')),
        (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
""")

# Create materialized view
spark.sql("""
    CREATE MATERIALIZED VIEW customer_summary
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")

# Query the materialized view
print("Initial materialized view data:")
spark.sql("SELECT * FROM customer_summary").show()

# Insert additional data
spark.sql("""
    INSERT INTO orders VALUES 
        (4, 'Jane Smith', 350.00, DATE('2024-01-18')),
        (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
""")

# Refresh the materialized view
spark.sql("REFRESH MATERIALIZED VIEW customer_summary FULL")

# Query updated results
print("Updated materialized view data:")
spark.sql("SELECT * FROM customer_summary").show()

job.commit()
```

### AWS Glue Studio 노트북 예제
<a name="materialized-views-example-glue-studio-notebook"></a>

```
%%configure
{
    "conf": {
        "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
        "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog",
        "spark.sql.catalog.glue_catalog.type": "glue",
        "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse",
        "spark.sql.catalog.glue_catalog.glue.region": "us-east-1",
        "spark.sql.catalog.glue_catalog.glue.id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true",
        "spark.sql.defaultCatalog": "glue_catalog",
        "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true",
        "spark.sql.materializedViews.metadataCache.enabled": "true"
    }
}
```

```
%%sql
CREATE DATABASE IF NOT EXISTS sales
```

```
%%sql
USE sales
```

```
%%sql
CREATE TABLE IF NOT EXISTS orders (
    id INT,
    customer_name STRING,
    amount DECIMAL(10,2),
    order_date DATE
)
```

```
%%sql
INSERT INTO orders VALUES 
    (1, 'John Doe', 150.00, DATE('2024-01-15')),
    (2, 'Jane Smith', 200.50, DATE('2024-01-16')),
    (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
```

```
%%sql
CREATE MATERIALIZED VIEW customer_summary
AS 
SELECT 
    customer_name, 
    COUNT(*) as order_count, 
    SUM(amount) as total_amount 
FROM glue_catalog.sales.orders
GROUP BY customer_name
```

```
%%sql
SELECT * FROM customer_summary
```

```
%%sql
INSERT INTO orders VALUES 
    (4, 'Jane Smith', 350.00, DATE('2024-01-18')),
    (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
```

```
%%sql
REFRESH MATERIALIZED VIEW customer_summary FULL
```

```
%%sql
SELECT * FROM customer_summary
```

## 고려 사항 및 제한 사항
<a name="materialized-views-considerations-limitations"></a>

AWS Glue에서 구체화된 뷰를 사용할 때는 다음 사항을 고려하세요.
+ 구체화된 뷰를 사용하려면 AWS Glue 버전 5.1 이상이 필요합니다.
+ 소스 테이블은 AWS Glue Data Catalog에 등록된 Apache Iceberg 테이블이어야 합니다. Apache Hive, Apache Hudi, Linux Foundation Delta Lake 테이블은 시작 시 지원되지 않습니다.
+ 소스 테이블은 구체화된 뷰와 동일한 리전 및 계정에 있어야 합니다.
+ 모든 소스 테이블은 AWS Lake Formation에서 관리해야 합니다. IAM 전용 권한과 하이브리드 액세스는 지원되지 않습니다.
+ 구체화된 뷰는 AWS Glue Data Catalog 뷰, 다중 언어 뷰 또는 기타 구체화된 뷰를 소스 테이블로 참조할 수 없습니다.
+ 뷰 정의자 역할에는 행, 열 또는 셀 필터가 적용되지 않은 모든 소스 테이블에 대한 전체 읽기 액세스 권한(SELECT 또는 ALL 권한)이 있어야 합니다.
+ 구체화된 뷰는 소스 테이블과 최종적으로 일관됩니다. 새로 고침 기간 동안 쿼리는 오래된 데이터를 반환할 수 있습니다. 즉각적인 일관성을 위해 수동 새로 고침을 실행합니다.
+ 최소 자동 새로 고침 간격은 1시간입니다.
+ 증분 새로 고침은 제한된 SQL 작업 하위 집합을 지원합니다. 뷰 정의는 단일 SELECT-FROM-WHERE-GROUP BY-HAVING 블록이어야 하며, 설정 작업, 하위 쿼리, SELECT 또는 집계 함수의 DISTINCT 키워드, 창 함수 또는 INNER JOIN 이외의 조인을 포함할 수 없습니다.
+ 증분 새로 고침은 사용자 정의 함수 또는 특정 내장 함수를 지원하지 않습니다. Spark SQL 내장 함수의 하위 집합만 지원됩니다.
+ 쿼리 자동 재작성은 증분 새로 고침 제한과 유사한 제한된 SQL 하위 집합에 정의가 속하는 구체화된 뷰만 고려합니다.
+ 영숫자와 밑줄 이외의 특수 문자가 포함된 식별자는 CREATE MATERIALIZED VIEW 쿼리에서 지원되지 않습니다. 이는 카탈로그/네임스페이스/테이블 이름, 열 및 구조체 필드 이름, CTE, 별칭을 포함한 모든 식별자 유형에 적용됩니다.
+ \$1\$1ivm 접두사로 시작하는 구체화된 뷰 열은 시스템용으로 예약되어 있습니다. Amazon은 향후 릴리스에서 이러한 열을 수정하거나 제거할 수 있는 권한을 보유합니다.
+ SORT BY, LIMIT, OFFSET, CLUSTER BY, ORDER BY 절은 구체화된 뷰 정의에서 지원되지 않습니다.
+ 교차 리전 및 교차 계정 소스 테이블은 지원되지 않습니다.
+ 자동 새로 고침은 기본 카탈로그 및 데이터베이스 설정을 사용하지 않으므로 뷰 쿼리에서 참조되는 테이블은 3가지 부분으로 구성된 이름 지정 규칙(예: glue\$1catalog.my\$1db.my\$1table)을 사용해야 합니다.
+ 전체 새로 고침 작업은 전체 테이블을 재정의하고 이전 스냅샷을 사용할 수 없게 만듭니다.
+ rand() 또는 current\$1timestamp()와 같은 비결정적 함수는 구체화된 뷰 정의에서 지원되지 않습니다.

# AWS Glue 작업자 유형
<a name="worker-types"></a>

## 개요
<a name="worker-types-overview"></a>

AWS Glue는 소규모 스트리밍 작업부터 메모리 집약적인 대규모 데이터 처리 작업에 이르기까지 다양한 워크로드 요구 사항을 수용할 수 있는 여러 작업자 유형을 제공합니다. 이 섹션에서는 사용 가능한 모든 작업자 유형, 사양 및 사용 권장 사항과 관련된 포괄적인 정보를 제공합니다.

### 작업자 유형 범주
<a name="worker-type-categories"></a>

AWS Glue는 두 가지의 주요 작업자 유형 범주를 제공합니다.
+ **G 작업자 유형**: 표준 ETL 워크로드에 최적화된 범용 컴퓨팅 작업자
+ **R 작업자 유형**: 메모리 집약적 Spark 애플리케이션에 맞춰 설계된 메모리 최적화 작업자

### 데이터 처리 단위(DPU)
<a name="data-processing-units"></a>

AWS Glue 작업자에서 사용할 수 있는 리소스는 DPU 단위로 측정됩니다. DPU는 4 vCPU의 컴퓨팅 파워와 16GB 메모리로 구성된 프로세싱 파워의 상대적 측정값입니다.

**메모리 최적화 DPU(M-DPU)**: R 유형 작업자는 표준 DPU와 비교해 정해진 크기에서 2배의 메모리 할당을 제공하는 M-DPU를 사용합니다. 즉, 표준 DPU는 16GB의 메모리를 제공하지만 R 유형 작업자의 M-DPU는 메모리 집약적 Spark 애플리케이션에 최적화된 32GB의 메모리를 제공합니다.

## 사용 가능한 작업자 유형
<a name="available-worker-types"></a>

### G.1X
<a name="g1x-standard-worker"></a>
+ **DPU**: DPU 1개(vCPU 4개, 메모리 16GB)
+ **스토리지**: 94GB 디스크(약 44GB 무료)
+ **사용 사례**: 데이터 변환, 조인 및 쿼리(대부분의 작업에 대해 확장 가능하고 비용 효율적)

### G.2X
<a name="g2x-standard-worker"></a>
+ **DPU**: DPU 2개(vCPU 8개, 메모리 32GB)
+ **스토리지**: 138GB 디스크(약 78GB 무료)
+ **사용 사례**: 데이터 변환, 조인 및 쿼리(대부분의 작업에 대해 확장 가능하고 비용 효율적)

### G.4X
<a name="g4x-large-worker"></a>
+ **DPU**: DPU 4개(vCPU 16개, 메모리 64GB)
+ **스토리지**: 256GB 디스크(약 230GB 무료)
+ **사용 사례**: 까다로운 변환, 집계, 조인 및 쿼리

### G.8X
<a name="g8x-extra-large-worker"></a>
+ **DPU**: DPU 8개(vCPU 32개, 메모리 128GB)
+ **스토리지**: 512GB 디스크(약 485GB 무료)
+ **사용 사례**: 까다로운 변환, 집계, 조인 및 쿼리

### G.12X
<a name="g12x-very-large-worker"></a>
+ **DPU**: DPU 12개(vCPU 48개, 메모리 192GB)
+ **스토리지**: 768GB 디스크(약 741GB 무료)
+ **사용 사례**: 상당한 컴퓨팅 용량이 필요한 초대규모 및 리소스 집약적 워크로드

### G.16X
<a name="g16x-maximum-worker"></a>
+ **DPU**: DPU 16개(vCPU 64개, 메모리 256GB)
+ **스토리지**: 1,024GB 디스크(약 996GB 무료)
+ **사용 사례**: 최대한의 컴퓨팅 용량이 필요한 최대규모 리소스 집약적 워크로드

### R.1X - 메모리 최적화\$1
<a name="r1x-memory-optimized-small"></a>
+ **DPU**: M-DPU 1개(vCPU 4개, 메모리 32GB)
+ **사용 사례**: 메모리 부족 오류가 자주 발생하거나 메모리 대비 CPU 비율이 높은 메모리 집약적 워크로드

### R.2X - 메모리 최적화\$1
<a name="r2x-memory-optimized-medium"></a>
+ **DPU**: M-DPU 2개(vCPU 8개, 메모리 64GB)
+ **사용 사례**: 메모리 부족 오류가 자주 발생하거나 메모리 대비 CPU 비율이 높은 메모리 집약적 워크로드

### R.4X - 메모리 최적화\$1
<a name="r4x-memory-optimized-large"></a>
+ **DPU**: M-DPU 4개(vCPU 16개, 메모리 128GB)
+ **사용 사례**: 메모리 부족 오류가 자주 발생하거나 메모리 대비 CPU 비율이 높은 대형 메모리 집약적 워크로드

### R.8X - 메모리 최적화\$1
<a name="r8x-memory-optimized-extra-large"></a>
+ **DPU**: M-DPU 8개(vCPU 32개, 메모리 256GB)
+ **사용 사례**: 메모리 부족 오류가 자주 발생하거나 메모리 대비 CPU 비율이 높은 초대형 메모리 집약적 워크로드

**\$1** 작업자의 시작 지연 시간이 길어질 수 있습니다. 다음에 따라 문제를 해결하세요.
+ 몇 분 정도 기다린 후 다시 작업을 제출합니다.
+ 작업자 수를 줄여 새 작업을 제출합니다.
+ 다른 작업자 유형 또는 크기를 사용하여 새 작업을 제출합니다.

## 작업자 유형 사양 표
<a name="worker-type-specifications"></a>


**작업자 유형 사양**  

| 작업자 유형 | 노드당 DPU | vCPU | 메모리(GB) | 디스크(GB) | 대략적 여유 디스크 공간(GB) | 노드당 Spark 실행기 | 
| --- | --- | --- | --- | --- | --- | --- | 
| G.1X | 1 | 4 | 16 | 94 | 44 | 1 | 
| G.2X | 2 | 8 | 32 | 138 | 78 | 1 | 
| G.4X | 4 | 16 | 64 | 256 | 230 | 1 | 
| G.8X | 8 | 32 | 128 | 512 | 485 | 1 | 
| G.12X | 12 | 48 | 192 | 768 | 741 | 1 | 
| G.16X | 16 | 64 | 256 | 1024 | 996 | 1 | 
| R.1X | 1 | 4 | 32 | 94 | 44 | 1 | 
| R.2X | 2 | 8 | 64 | 138 | 78 | 1 | 
| R.4X | 4 | 16 | 128 | 256 | 230 | 1 | 
| R.8X | 8 | 32 | 256 | 512 | 485 | 1 | 

**참고: R 작업자 유형에는 사양이 메모리 집약적 워크로드에 최적화된 메모리 최적화 구성이 있습니다.

## 중요 고려 사항
<a name="important-considerations"></a>

### 시작 지연 시간
<a name="startup-latency"></a>

**중요**  
G.12X 및 G.16X 작업자 유형과 모든 R 작업자 유형(R.1X\$1R.8X)의 경우 시작 지연 시간이 길어질 수 있습니다. 다음에 따라 문제를 해결하세요.  
몇 분 정도 기다린 후 다시 작업을 제출합니다.
작업자 수를 줄여 새 작업을 제출합니다.
다른 작업자 유형 및 크기를 사용하여 새 작업을 제출합니다.

## 올바른 작업자 유형 선택
<a name="choosing-right-worker-type"></a>

### 표준 ETL 워크로드
<a name="standard-etl-workloads"></a>
+ **G.1X 또는 G.2X**: 일반적인 데이터 변환, 조인 및 쿼리에 가장 비용 효율적
+ **G.4X 또는 G.8X**: 데이터세트가 더 큰 워크로드

### 대규모 워크로드
<a name="large-scale-workloads"></a>
+ **G.12X**: 상당한 컴퓨팅 리소스가 필요한 초대형 데이터세트
+ **G.16X**: 최대 컴퓨팅 용량으로 가장 까다로운 워크로드 지원

### 메모리 집약적 워크로드
<a name="memory-intensive-workloads"></a>
+ **R.1X 또는 R.2X**: 소형에서 중형 메모리 집약적 작업
+ **R.4X 또는 R.8X**: OOM 오류가 자주 발생하는 대형 메모리 집약적 워크로드

## 비용 최적화 고려 사항
<a name="cost-optimization-considerations"></a>
+ **표준 G 작업자**: 컴퓨팅, 메모리 및 네트워킹 리소스의 균형을 맞추고, 저렴한 비용으로 다양한 워크로드에 사용 가능
+ **R 작업자**: 워크로드에서 빠른 성능을 발휘하는 메모리 집약적 작업에 특화되어 메모리에서 대규모 데이터세트 처리

## 모범 사례
<a name="best-practices"></a>

### 작업자 선택 지침
<a name="worker-selection-guidelines"></a>

1. 대부분의 워크로드에서 **표준 작업자로 시작**(G.1X, G.2X)

1. 메모리 부족 오류가 자주 발생하거나 캐싱, 셔플링 및 집계와 같은 메모리 집약적 작업이 포함된 워크로드의 경우 **R 작업자 사용**

1. 최대 리소스가 필요한 컴퓨팅 집약적 워크로드의 경우 **G.12X/G.16X 고려**

1. 시간에 민감한 워크플로에서 새 작업자 유형을 사용할 때 **용량 제약 조건 고려**

### 성능 최적화
<a name="performance-optimization"></a>
+ CloudWatch 지표를 모니터링하여 리소스 사용률 파악
+ 데이터 크기 및 복잡성을 기반으로 적절한 작업자 수 사용
+ 데이터 파티셔닝 전략을 고려하여 작업자 효율성 최적화

# AWS Glue에서 스트리밍 ETL 작업
<a name="add-job-streaming"></a>

지속적으로 실행되고 Amazon Kinesis Data Streams, Apache Kafka 및 Amazon Managed Streaming for Apache Kafka(Amazon MSK)와 같은 스트리밍 소스의 데이터를 사용하는 스트리밍 추출, 변환, 로드 작업을 생성할 수 있습니다. 작업은 데이터를 정리 및 변환한 다음 결과를 Amazon S3 데이터 레이크 또는 JDBC 데이터 스토어에 로드합니다.

또한 Amazon Kinesis Data Streams 스트림용 데이터를 생성할 수 있습니다. 이 기능은 AWS Glue 스크립트를 작성할 때만 사용할 수 있습니다. 자세한 내용은 [Kinesis 연결](aws-glue-programming-etl-connect-kinesis-home.md) 섹션을 참조하세요.

기본적으로 AWS Glue는 100초 기간에 데이터를 처리하고 작성합니다. 이를 통해 데이터를 효율적으로 처리할 수 있으며 예상보다 늦게 도착하는 데이터에 대해 집계를 수행할 수 있습니다. 이 기간 크기를 수정하여 적시성 또는 집계 정확도를 높일 수 있습니다. AWS Glue 스트리밍 작업은 작업 북마크가 아닌 체크포인트를 사용하여 읽은 데이터를 추적합니다.

**참고**  
AWS Glue는 ETL 스트리밍 작업이 실행되는 동안 시간당 요금을 청구합니다.

이 비디오에서는 스트리밍 ETL 비용 문제와 AWS Glue에서의 비용 절감 기능에 대해 설명합니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/6ggTFOtfUxU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/6ggTFOtfUxU)


스트리밍 ETL 작업을 생성하려면 다음 단계를 수행합니다.

1. Apache Kafka 스트리밍 소스의 경우 Kafka 소스 또는 Amazon MSK 클러스터에 대한 AWS Glue 연결을 생성합니다.

1. 스트리밍 소스에 대한 Data Catalog 테이블을 수동으로 생성합니다.

1. 스트리밍 데이터 원본에 대한 ETL 작업을 생성합니다. 스트리밍 관련 작업 속성을 정의하고 자체 스크립트를 제공하거나 필요에 따라 생성된 스크립트를 수정합니다.

자세한 내용은 [AWS Glue의 스트리밍 ETL](components-overview.md#streaming-etl-intro) 섹션을 참조하세요.

Amazon Kinesis Data Streams에 대한 스트리밍 ETL 작업을 생성할 때 AWS Glue 연결을 생성할 필요가 없습니다. 그러나 Kinesis Data Streams를 소스로 포함하는 AWS Glue 스트리밍 ETL 작업에 첨부된 연결이 있는 경우 Kinesis에 대한 Virtual Private Cloud(VPC) 엔드포인트가 필요합니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [인터페이스 엔드포인트 생성](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)을 참조하세요. 다른 계정에서 Amazon Kinesis Data Streams 스트림을 지정할 때 교차 계정 액세스를 허용하도록 역할과 정책을 설정해야 합니다. 자세한 내용은 [예: 다른 계정의 Kinesis 스트림에서 읽기](https://docs.aws.amazon.com/kinesisanalytics/latest/java/examples-cross.html)를 참조하세요.

AWS Glue 스트리밍 ETL 작업은 압축된 데이터를 자동으로 감지하고, 스트리밍 데이터를 투명하게 압축 해제할 수 있으며, 입력 소스에 대해 일반적인 변환을 수행하고, 출력 저장소에 로드할 수 있습니다.

AWS Glue에서는 입력 형식에 따라 다음과 같은 압축 유형에 대해 자동 압축 해제를 지원합니다.


| 압축 유형 | Avro 파일 | Avro 데이터 | JSON | CSV | Grok | 
| --- | --- | --- | --- | --- | --- | 
| bzip2 | 예 | 예 | 예 | 예 | 예 | 
| GZIP | 아니요 | 예 | 예 | 예 | 예 | 
| Snappy | 예(원시 Snappy) | 예(프레임 처리된 Snappy) | 예(프레임 처리된 Snappy) | 예(프레임 처리된 Snappy) | 예(프레임 처리된 Snappy) | 
| XZ | 예 | 예 | 예 | 예 | 예 | 
| ZSTD | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 
| DEFLATE | 예 | 예 | 예 | 예 | 예 | 

**Topics**
+ [Apache Kafka 데이터 스트림에 대한 AWS Glue 연결 생성](#create-conn-streaming)
+ [스트리밍 소스에 대한 Data Catalog 테이블 생성](#create-table-streaming)
+ [Avro 스트리밍 소스에 대한 참고 사항 및 제한 사항](#streaming-avro-notes)
+ [스트리밍 소스에 Grok 패턴 적용](#create-table-streaming-grok)
+ [스트리밍 ETL 작업에 대한 작업 속성 정의](#create-job-streaming-properties)
+ [스트리밍 ETL 참고 사항 및 제한 사항](#create-job-streaming-restrictions)

## Apache Kafka 데이터 스트림에 대한 AWS Glue 연결 생성
<a name="create-conn-streaming"></a>

Apache Kafka 스트림에서 읽으려면 AWS Glue 연결을 생성해야 합니다.

**Kafka 소스에 대한 AWS Glue 연결을 생성하려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **데이터 카탈로그**에서 **연결**을 선택합니다.

1. **연결 추가**를 선택하고 **연결 속성 설정** 페이지에서 연결 이름을 입력합니다.
**참고**  
연결 속성 지정에 대한 자세한 내용은 [AWS Glue 연결 속성](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-connections)을 참조하세요.

1. **연결 유형**에서 **Kafka**를 선택합니다.

1. [**Kafka 부트스트랩 서버 URL(Kafka bootstrap servers URLs)**]에 Amazon MSK 클러스터 또는 Apache Kafka 클러스터용 부트스트랩 브로커의 호스트 및 포트 번호를 입력합니다. Kafka 클러스터에 대한 초기 연결을 설정하려면 전송 계층 보안(TLS) 엔드포인트만 사용합니다. Plaintext 엔드포인트는 지원되지 않습니다.

   다음은 Amazon MSK 클러스터의 호스트 이름 및 포트 번호 페어 목록의 예입니다.

   ```
   myserver1.kafka.us-east-1.amazonaws.com:9094,myserver2.kafka.us-east-1.amazonaws.com:9094,
   myserver3.kafka.us-east-1.amazonaws.com:9094
   ```

   부트스트랩 브로커 정보 가져오기에 대한 자세한 내용은 *Amazon Managed Streaming for Apache Kafka Developer Guide*의 [Getting the Bootstrap Brokers for an Amazon MSK Cluster](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html)를 참조하세요.

1. Kafka 데이터 원본에 대한 보안 연결을 원하는 경우 [**SSL 연결 필요(Require SSL connection)**]를 선택하고 [**Kafka 프라이빗 CA 인증서 위치(Kafka private CA certificate location)**]에 사용자 정의 SSL 인증서에 대한 유효한 Amazon S3 경로를 입력합니다.

   자체 관리형 Kafka에 대한 SSL 연결의 경우 사용자 정의 인증서가 필수입니다. Amazon MSK의 경우 선택 사항입니다.

   Kafka에 대한 사용자 정의 인증서 지정에 대한 자세한 내용은 [AWS Glue SSL 연결 속성](connection-properties.md#connection-properties-SSL) 섹션을 참조하세요.

1. AWS Glue Studio 또는 AWS CLI를 사용하여 Kafka 클라이언트 인증 방법을 지정합니다. AWS Glue Studio에 액세스하려면 왼쪽 탐색 창의 **ETL** 메뉴에서 **AWS Glue**를 선택합니다.

   Kafka 클라이언트 인증 방법에 대한 자세한 내용은 [클라이언트 인증을 위한 AWS Glue Kafka 연결 속성](#connection-properties-kafka-client-auth) 단원을 참조하세요.

1. 필요에 따라 설명을 입력하고 [**다음(Next)**]을 선택합니다.

1. Amazon MSK 클러스터의 경우 Virtual Private Cloud (VPC), 서브넷 및 보안 그룹을 지정합니다. 자체 관리형 Kafka의 경우 VPC 정보는 선택 사항입니다.

1. [**다음(Next)**]을 선택하여 모든 연결 속성을 검토하고 [**마침(Finish)**]을 선택합니다.

AWS Glue 연결에 대한 자세한 정보는 [데이터에 연결](glue-connections.md) 섹션을 참조하세요.

### 클라이언트 인증을 위한 AWS Glue Kafka 연결 속성
<a name="connection-properties-kafka-client-auth"></a>

**SASL/GSSAPI(Kerberos) 인증**  
이 인증 방법을 선택하면 Kerberos 속성을 지정할 수 있습니다.

**Kerberos Keytab**  
keytab 파일의 위치를 선택합니다. keytab은 하나 이상의 보안 주체에 대한 장기 키를 저장합니다. 자세한 내용은 [MIT Kerberos Documentation: Keytab](https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html)(MIT Kerberos 설명서: Keytab)을 참조하세요.

**Kerberos krb5.conf 파일(Kerberos krb5.conf file)**  
krb5.conf 파일을 선택합니다. 여기에는 KDC 서버의 기본 영역(동일한 KDC 아래에 있는 시스템 그룹을 정의하는 도메인과 유사한 논리 네트워크)과 위치가 포함됩니다. 자세한 내용은 [MIT Kerberos Documentation: krb5.conf](https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html)(MIT Kerberos 설명서: krb5.conf)를 참조하세요.

**Kerberos 보안 주체 및 Kerberos 서비스 이름(Kerberos principal and Kerberos service name)**  
Kerberos 보안 주체 및 서비스 이름을 입력합니다. 자세한 내용은 [MIT Kerberos 설명서: Kerberos 보안 주체](https://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-user/What-is-a-Kerberos-Principal_003f.html)(MIT Kerberos Documentation: Kerberos principal)을 참조하세요.

**SASL/SCRAM-SHA-512 인증**  
 이 인증 방법을 선택하면 인증 자격 증명을 지정할 수 있습니다.

**AWS Secrets Manager**  
이름 또는 ARN을 입력하여 검색 상자에서 토큰을 검색합니다.

**사용자 이름 및 암호 직접 제공(Provide username and password directly)**  
이름 또는 ARN을 입력하여 검색 상자에서 토큰을 검색합니다.

**SSL 클라이언트 인증**  
이 인증 방법을 선택하면 Amazon S3를 검색하여 Kafka 클라이언트 키 스토어의 위치를 선택할 수 있습니다. 선택 사항으로 Kafka 클라이언트 키 스토어 암호와 Kafka 클라이언트 키 암호를 입력할 수 있습니다.

**IAM 인증**.  
이 인증 방법은 추가 사양이 필요하지 않으며 스트리밍 소스가 MSK Kafka인 경우에만 적용됩니다.

**SASL/PLAIN 인증**  
이 인증 방법을 선택하면 인증 자격 증명을 지정할 수 있습니다.

## 스트리밍 소스에 대한 Data Catalog 테이블 생성
<a name="create-table-streaming"></a>

데이터 스키마를 포함한 소스 데이터 스트림 속성을 지정하는 데이터 카탈로그 테이블을 스트리밍 소스에 대해 수동으로 생성할 수 있습니다. 이 테이블은 스트리밍 ETL 작업에 대한 데이터 원본으로 사용됩니다.

원본 데이터 스트림에 있는 데이터의 스키마를 모르는 경우 스키마 없이 테이블을 생성할 수 있습니다. 그런 다음 스트리밍 ETL 작업을 생성할 때 AWS Glue 스키마 감지 기능을 설정할 수 있습니다. AWS Glue는 스트리밍 데이터에서 스키마를 결정합니다.

[AWS Glue 콘솔](https://console.aws.amazon.com/glue/), AWS Command Line Interface(AWS CLI) 또는 AWS Glue API를 사용하여 테이블을 생성합니다. AWS Glue 콘솔을 사용하여 수동으로 테이블을 생성하는 방법에 대한 자세한 내용은 [테이블 생성](tables-described.md) 단원을 참조하십시오.

**참고**  
AWS Lake Formation 콘솔을 사용하여 테이블을 생성할 수 없습니다. AWS Glue 콘솔을 사용해야 합니다.

또한 Avro 포맷의 스트리밍 소스 또는 Grok 패턴을 적용할 수 있는 로그 데이터에 대한 다음 정보를 고려합니다.
+ [Avro 스트리밍 소스에 대한 참고 사항 및 제한 사항](#streaming-avro-notes)
+ [스트리밍 소스에 Grok 패턴 적용](#create-table-streaming-grok)

**Topics**
+ [Kinesis 데이터 원본](#kinesis-source)
+ [Kafka 데이터 원본](#kafka-source)
+ [AWS Glue Schema Registry 테이블 소스](#schema-registry-table)

### Kinesis 데이터 원본
<a name="kinesis-source"></a>

테이블 생성 시 다음 스트리밍 ETL 속성(콘솔)을 설정합니다.

**소스 유형**  
**Kinesis**

**동일한 계정에 있는 Kinesis 소스의 경우**    
**리전**  
Amazon Kinesis Data Streams 서비스가 상주하는 AWS 리전입니다. 리전 및 Kinesis 스트림 이름은 함께 스트림 ARN으로 변환됩니다.  
예: https://kinesis.us-east-1.amazonaws.com  
**Kinesis 스트림 이름**  
*Amazon Kinesis Data Streams Developer Guide*의 [Creating a Stream](https://docs.aws.amazon.com/streams/latest/dev/kinesis-using-sdk-java-create-stream.html)에 설명된 스트림 이름입니다.

**다른 계정의 Kinesis 소스의 경우 [이 예](https://docs.aws.amazon.com/kinesisanalytics/latest/java/examples-cross.html)를 참조하여 교차 계정 액세스를 허용하도록 역할과 정책을 설정합니다. 다음 설정을 구성합니다.**    
**스트림 ARN**  
소비자가 등록된 Kinesis 데이터 스트림의 ARN입니다. 자세한 내용은 *AWS 일반 참조*의 [Amazon 리소스 이름(ARN) 및 AWS 서비스 네임스페이스](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)를 참조하세요.  
**수임된 역할 ARN**  
수임할 역할의 Amazon 리소스 이름(ARN)입니다.  
**세션 이름(선택 사항)**  
수임한 역할 세션의 식별자입니다.  
역할 세션 이름을 사용하여 다른 보안 주체가 동일한 역할을 수임할 때 또는 다른 이유로 세션을 고유하게 식별합니다. 교차 계정 시나리오에서는 역할을 소유하는 계정이 역할 세션 이름을 보고 로그할 수 있습니다. 역할 세션 이름은 수임한 역할 보안 주체의 ARN에도 사용됩니다. 즉, 임시 보안 자격 증명을 사용하는 후속 교차 계정 API 요청은 역할 세션 이름을 AWS CloudTrail 로그의 외부 계정에 노출합니다.

**Amazon Kinesis Data Streams(AWS Glue API 또는 AWS CLI)에 대한 스트리밍 ETL 속성을 설정하려면**
+ 동일한 계정에서 Kinesis 소스에 대한 스트리밍 ETL 속성을 설정하려면 `CreateTable` API 작업 또는 `create_table` CLI 명령의 `StorageDescriptor` 구조에서 `streamName` 및 `endpointUrl` 파라미터를 지정합니다.

  ```
  "StorageDescriptor": {
  	"Parameters": {
  		"typeOfData": "kinesis",
  		"streamName": "sample-stream",
  		"endpointUrl": "https://kinesis.us-east-1.amazonaws.com"
  	}
  	...
  }
  ```

  또는 `streamARN`을 지정합니다.  
**Example**  

  ```
  "StorageDescriptor": {
  	"Parameters": {
  		"typeOfData": "kinesis",
  		"streamARN": "arn:aws:kinesis:us-east-1:123456789:stream/sample-stream"
  	}
  	...
  }
  ```
+ 다른 계정에서 Kinesis 소스에 대한 스트리밍 ETL 속성을 설정하려면 `CreateTable` API 작업 또는 `create_table` CLI 명령의 `StorageDescriptor` 구조에서 `streamARN`, `awsSTSRoleARN` 및 `awsSTSSessionName`(선택 사항) 파라미터를 지정합니다.

  ```
  "StorageDescriptor": {
  	"Parameters": {
  		"typeOfData": "kinesis",
  		"streamARN": "arn:aws:kinesis:us-east-1:123456789:stream/sample-stream",
  		"awsSTSRoleARN": "arn:aws:iam::123456789:role/sample-assume-role-arn",
  		"awsSTSSessionName": "optional-session"
  	}
  	...
  }
  ```

### Kafka 데이터 원본
<a name="kafka-source"></a>

테이블 생성 시 다음 스트리밍 ETL 속성(콘솔)을 설정합니다.

**소스 유형**  
 **Kafka**

**Kafka 소스의 경우:**    
**주제 이름**  
Kafka에 지정된 주제 이름입니다.  
**연결**  
[Apache Kafka 데이터 스트림에 대한 AWS Glue 연결 생성](#create-conn-streaming)에 설명된 대로 Kafka 소스를 참조하는 AWS Glue 연결입니다.

### AWS Glue Schema Registry 테이블 소스
<a name="schema-registry-table"></a>

AWS Glue Schema Registry를 스트리밍 작업에 사용하려면 [사용 사례: AWS Glue Data Catalog](schema-registry-integrations.md#schema-registry-integrations-aws-glue-data-catalog)에 있는 지침에 따라 Schema Registry 테이블을 생성하거나 업데이트합니다.

현재 AWS Glue 스트리밍은 스키마 추론이 `false`로 설정된 Glue Schema Registry Avro 포맷만 지원합니다.

## Avro 스트리밍 소스에 대한 참고 사항 및 제한 사항
<a name="streaming-avro-notes"></a>

Avro 포맷의 스트리밍 소스에는 다음 참고 및 제한 사항이 적용됩니다.
+ 스키마 감지가 설정되어 있으면 Avro 스키마가 페이로드에 포함되어야 합니다. 해제되어 있으면 데이터만 페이로드에 포함되어야 합니다.
+ 일부 Avro 데이터 유형은 동적 프레임에서 지원되지 않습니다. AWS Glue 콘솔의 테이블 생성 마법사에서 [**스키마 정의(Define a schema)**] 페이지를 사용하여 스키마를 정의할 때 이러한 데이터 유형을 지정할 수 없습니다. 스키마 감지 중에 Avro 스키마에서 지원되지 않는 유형은 다음과 같이 지원되는 유형으로 변환됩니다.
  + `EnumType => StringType`
  + `FixedType => BinaryType`
  + `UnionType => StructType`
+ 콘솔의 [**스키마 정의(Define a schema)**] 페이지를 사용하여 테이블 스키마를 정의하는 경우 스키마에 대한 암시적 루트 요소 유형은 `record`입니다. `record` 이외의 루트 요소 유형(예: `array` 또는 `map`)을 원하는 경우 [**스키마 정의(Define a schema)**] 페이지를 사용하여 스키마를 지정할 수 없습니다. 대신 해당 페이지를 건너뛰고 테이블 속성으로 또는 ETL 스크립트 내에서 스키마를 지정해야 합니다.
  + 테이블 속성에서 스키마를 지정하려면 테이블 생성 마법사를 완료하고 테이블 세부 정보를 편집한 다음 [**테이블 속성(Table properties)**]에서 새 키-값 페어를 추가합니다. 다음 스크린샷과 같이 키 `avroSchema`를 사용하고 값에 대한 스키마 JSON 객체를 입력합니다.  
![\[[테이블 속성(Table properties)] 머리글 아래에는 2개의 텍스트 필드 열이 있습니다. 왼쪽 열 제목은 [키(Key)]이고 오른쪽 열 머리글은 [값(Value)]입니다. 첫 번째 행의 키/값 페어는 classification/avro입니다. 두 번째 행의 키/값 페어는 avroSchema/{"type":"array","items":"string"}입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/table_properties_avro.png)
  + ETL 스크립트에서 스키마를 지정하려면 다음 Python 및 Scala 예제와 같이 `datasource0` 할당 문을 수정하고 `avroSchema` 키를 `additional_options` 인수에 추가합니다.

------
#### [ Python ]

    ```
    SCHEMA_STRING = ‘{"type":"array","items":"string"}’
    datasource0 = glueContext.create_data_frame.from_catalog(database = "database", table_name = "table_name", transformation_ctx = "datasource0", additional_options = {"startingPosition": "TRIM_HORIZON", "inferSchema": "false", "avroSchema": SCHEMA_STRING})
    ```

------
#### [ Scala ]

    ```
    val SCHEMA_STRING = """{"type":"array","items":"string"}"""
    val datasource0 = glueContext.getCatalogSource(database = "database", tableName = "table_name", redshiftTmpDir = "", transformationContext = "datasource0", additionalOptions = JsonOptions(s"""{"startingPosition": "TRIM_HORIZON", "inferSchema": "false", "avroSchema":"$SCHEMA_STRING"}""")).getDataFrame()
    ```

------

## 스트리밍 소스에 Grok 패턴 적용
<a name="create-table-streaming-grok"></a>

로그 데이터 원본에 대한 스트리밍 ETL 작업을 생성하고 Grok 패턴을 사용하여 로그를 정형 데이터로 변환할 수 있습니다. 그러면 ETL 작업은 데이터를 정형 데이터 원본으로 처리합니다. 스트리밍 원본에 대한 Data Catalog 테이블을 생성할 때 적용할 Grok 패턴을 지정합니다.

Grok 패턴 및 사용자 정의 패턴 문자열 값에 대한 자세한 내용은 [Grok 사용자 지정 분류자 작성](custom-classifier.md#custom-classifier-grok) 섹션을 참조하세요.

**Data Catalog 테이블에 Grok 패턴 추가(콘솔)**
+ 테이블 생성 마법사를 사용하여 [스트리밍 소스에 대한 Data Catalog 테이블 생성](#create-table-streaming)에 지정된 파라미터로 테이블을 생성합니다. 데이터 포맷을 Grok로 지정하고 [**Grok 패턴(Grok pattern)**] 필드를 채우고 필요에 따라 [**사용자 정의 패턴(선택 사항)(Custom patterns (optional))**] 아래에 사용자 정의 패턴을 추가합니다.  
![\[*\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/grok-data-format-create-table.png)

  각 사용자 정의 패턴 다음에 **Enter** 키를 누릅니다.

**Data Catalog 테이블에 Grok 패턴 추가(AWS Glue API 또는 AWS CLI)**
+ `CreateTable` API 작업 또는 `create_table` CLI 명령에 `GrokPattern` 파라미터와 `CustomPatterns` 파라미터(선택 사항)를 추가합니다.

  ```
   "Parameters": {
  ...
      "grokPattern": "string",
      "grokCustomPatterns": "string",
  ...
  },
  ```

  `grokCustomPatterns`를 문자열로 표현하고 패턴 사이의 구분 기호로 "\$1n"을 사용합니다.

  다음은 이러한 파라미터를 지정하는 예입니다.  
**Example**  

  ```
  "parameters": {
  ...
      "grokPattern": "%{USERNAME:username} %{DIGIT:digit:int}",
      "grokCustomPatterns": "digit \d",
  ...
  }
  ```

## 스트리밍 ETL 작업에 대한 작업 속성 정의
<a name="create-job-streaming-properties"></a>

AWS Glue 콘솔에서 스트리밍 ETL 작업을 정의할 때 다음 스트림 관련 속성을 제공합니다. 추가 작업 속성에 대한 설명은 [Spark 작업에 대한 작업 속성 정의](add-job.md#create-job) 단원을 참조하십시오.

**IAM 역할**  
작업을 실행하고, 스트리밍 소스에 액세스하고, 대상 데이터 스토어에 액세스하는 데 사용되는 리소스에 대한 권한 부여에 사용되는 AWS Identity and Access Management(IAM) 역할을 지정합니다.  
Amazon Kinesis Data Streams에 액세스하려면 `AmazonKinesisFullAccess` AWS 관리형 정책을 역할에 연결하거나 보다 세분화된 액세스를 허용하는 유사한 IAM 정책을 연결합니다. 샘플 정책은 [IAM을 사용하여 Amazon Kinesis Data Streams 리소스에 대한 액세스 제어](https://docs.aws.amazon.com/streams/latest/dev/controlling-access.html)를 참조하십시오.  
AWS Glue 작업을 실행하는 권한에 대한 자세한 내용은 [AWS Glue의 Identity and Access Management](security-iam.md) 단원을 참조하세요.

**Type**  
**Spark Streaming**을 선택합니다.

**AWS Glue 버전**  
AWS Glue 버전에 따라 작업에 사용할 수 있는 Apache Spark와 Python 또는 Scala의 버전이 정해집니다. 작업에 사용 가능한 Python 또는 Scala 버전을 지정하는 선택 항목을 선택합니다. AWS Glue Python 3을 지원하는 버전 2.0은 스트리밍 ETL 작업의 기본값입니다.

**유지 관리 윈도우**  
스트리밍 작업을 다시 시작할 수 있는 기간을 지정합니다. [AWS Glue 스트리밍을 위한 유지 관리 기간](glue-streaming-maintenance.md)을(를) 참조하세요.

**작업 제한 시간**  
필요에 따라 기간(분)을 입력합니다. 기본값은 빈 상태입니다.  
+ 스트리밍 작업의 제한 시간 값은 7일 또는 10,080분 미만이어야 합니다.
+ 값을 비워 두면 유지 관리 기간을 설정하지 않은 경우 7일 후에 작업이 다시 시작됩니다. 유지 관리 기간을 설정한 경우 7일 후 유지 관리 기간에 작업이 다시 시작됩니다.

**데이터 소스**  
[스트리밍 소스에 대한 Data Catalog 테이블 생성](#create-table-streaming)에 생성된 테이블을 지정합니다.

**데이터 대상**  
다음 중 하나를 수행하세요.  
+ **데이터 대상의 테이블 생성**을 선택하고 다음 데이터 대상 속성을 지정합니다.  
**데이터 스토어**  
Amazon S3 또는 JDBC를 선택합니다.  
**형식**  
원하는 포맷을 선택합니다. 스트리밍에 모두 지원됩니다.
+ [**데이터 카탈로그의 테이블 사용 및 데이터 대상 업데이트(Use tables in the data catalog and update your data target)**]를 선택하고 JDBC 데이터 스토어에 대한 테이블을 선택합니다.

**출력 스키마 정의**  
다음 중 하나를 수행하세요.  
+ [**각 레코드의 스키마 자동 감지(Automatically detect schema of each record)**]를 선택하여 스키마 감지를 설정합니다. AWS Glue는 스트리밍 데이터에서 스키마를 결정합니다.
+ [**모든 레코드에 대한 출력 스키마 지정(Specify output schema for all records)**]을 선택하여 매핑 적용 변환을 사용하여 출력 스키마를 정의합니다.

**Script**  
필요에 따라 자체 스크립트를 제공하거나 생성된 스크립트를 수정하여 Apache Spark Structured Streaming 엔진이 지원하는 작업을 수행합니다. 사용 가능한 작업에 대한 자세한 내용은 [스트리밍 데이터 프레임/데이터 세트에 대한 작업](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#operations-on-streaming-dataframesdatasets)을 참조하십시오.

## 스트리밍 ETL 참고 사항 및 제한 사항
<a name="create-job-streaming-restrictions"></a>

다음 참고 사항 및 제한 사항에 유의하십시오.
+ AWS Glue 스트리밍 ETL 작업에 대한 자동 압축 해제는 지원되는 압축 유형에 대해서만 사용할 수 있습니다. 또한 다음을 참조하세요.
  + 프레임 처리된 Snappy는 Snappy용 공식 [프레이밍 형식](https://github.com/google/snappy/blob/main/framing_format.txt)을 나타냅니다.
  + Deflate는 Glue 버전 2.0이 아닌 Glue 버전 3.0에서 지원됩니다.
+ 스키마 감지를 사용하는 경우 스트리밍 데이터의 조인을 수행할 수 없습니다.
+ AWS Glue 스트리밍 ETL 작업은 Avro 형식의 AWS Glue 스키마 레지스트리에 대한 Union 데이터 유형을 지원하지 않습니다.
+ ETL 스크립트는 AWS Glue의 기본 제공 변환과 Apache Spark Structured Streaming에 대한 기본 변환을 사용할 수 있습니다. 자세한 내용은 Apache Spark 웹 사이트의 [Operations on streaming DataFrames/Datasets](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#operations-on-streaming-dataframesdatasets) 또는 [AWS Glue PySpark 변환 참조](aws-glue-programming-python-transforms.md) 섹션을 참조하세요.
+ AWS Glue 스트리밍 ETL 작업은 체크포인트를 사용하여 읽은 데이터를 추적합니다. 따라서 중지되고 다시 시작된 작업은 스트림에서 중단된 부분부터 다시 시작됩니다. 데이터를 다시 처리하려는 경우 스크립트에서 참조된 체크포인트 폴더를 삭제할 수 있습니다.
+ 작업 북마크는 지원되지 않습니다.
+ Kinesis Data Streams의 향상된 팬아웃 기능을 사용하려면 [Kinesis 스트리밍 작업에서 향상된 팬아웃 사용](aws-glue-programming-etl-connect-kinesis-efo.md) 섹션을 참조하세요.
+ AWS Glue Schema Registry에서 생성된 Data Catalog 테이블을 사용하는 경우 새 스키마 버전을 사용할 수 있게 되면 새 스키마를 반영하기 위해 다음을 수행해야 합니다.

  1. 테이블과 연결된 작업을 중지합니다.

  1. Data Catalog 테이블의 스키마를 업데이트합니다.

  1. 테이블과 연결된 작업을 다시 시작합니다.

# AWS Lake Formation FindMatches로 레코드 매칭
<a name="machine-learning"></a>

**참고**  
현재 레코드 일치는 중동(UAE), 유럽(스페인), 아시아 태평양(자카르타) 및 유럽(취리히) 리전의 AWS Glue 콘솔에서 사용할 수 없습니다.

AWS Lake Formation에는 기계 학습 기능이 있어서 사용자 지정 변환을 만들어 데이터를 정리할 수 있습니다. 여기에는 FindMatches로 명명된 사용 가능 변환이 하나 있습니다. FindMatches 변환으로는 레코드에 공통된 고유 식별자가 없고 정확히 일치되는 필드 또한 없을 경우에도 데이터 세트에서 중복 레코드나 일치 레코드를 식별할 수 있습니다. 여기에서는 특정 코드 작성이나 기계 학습 진행 방법 숙지가 불필요합니다. FindMatches는 다음과 같은 다양한 문제에서 도움이 될 수 있습니다.
+ **고객 매칭(Matching customers)**: 데이터베이스상에서 여러 고객 필드가 서로 정확히 일치하지 않을 때에도(예: 이름의 철자나 주소가 다른 경우, 데이터가 누락되거나 부정확한 경우 등) 고객의 레코드를 다양한 고객 데이터베이스에 연결할 수 있습니다.
+ **제품 매칭(Matching products)**: 항목의 구조가 서로 다를 때에도 사용자 카탈로그의 제품과 다른 출처를 매칭할 수 있습니다(예: 경쟁사의 카탈로그와 매칭).
+ **부정 행위 탐지 개선(Improving fraud detection)**: 중복된 고객 계정을 식별하고 새로 생성된 계정이 이전의 부정 행위 사용자와 일치하거나 일치할 소지가 있을 때 이를 확인할 수 있습니다.
+ **기타 매칭 문제(Other matching problems)**: 주소나 영화, 파트 목록 등을 매칭할 수 있습니다. 일반적으로 사람이 데이터베이스의 행을 확인해서 일치 여부를 확인할 수 있다면 FindMatches 변환으로 업무에 도움이 될 만한 상황이 매우 많습니다.

 작업을 생성할 때 이러한 변환을 만들 수 있습니다. 생성하는 변환은 레이블을 지정한 소스 데이터 세트의 예제 데이터 및 소스 데이터 스토어 스키마를 기반으로 합니다(이 프로세스를 변환 '교육'이라고 함). 레이블을 지정하는 레코드가 소스 데이터 세트에 있어야 합니다. 이러한 프로세스에서는 사용자가 레이블 지정하는 파일을 생성한 다음 변환이 어느 정도 학습이 가능한 사항을 다시 업로드합니다. 변환을 학습시킨 다음 Spark 기반 AWS Glue 작업(PySpark 또는 Scala Spark)에서 호출하고 원본 데이터 스토어와 함께 다른 스크립트에 사용할 수 있습니다.

 생성된 변환은 AWS Glue에 저장됩니다. AWS Glue 콘솔에서 생성된 변환을 관리할 수 있습니다. **데이터 통합 및 ETL**, **데이터 분류 도구 > 레코드 일치** 아래의 탐색 창에서 기계 학습 변환을 편집하고 계속 가르칠 수 있습니다. 콘솔에서 변환을 관리하는 방법에 대한 자세한 내용은 [기계 학습 변환 작업](console-machine-learning-transforms.md) 단원을 참조하십시오.

**참고**  
AWS Glue 버전 2.0 FindMatches 작업은 변환이 데이터를 처리하는 동안 Amazon S3 버킷 `aws-glue-temp-<accountID>-<region>`을 사용하여 임시 파일을 저장합니다. 실행이 완료된 후 수동으로 또는 Amazon S3 수명 주기 규칙을 설정하여 이 데이터를 삭제할 수 있습니다.

## 기계 학습 변환의 유형
<a name="machine-learning-transforms"></a>

기계 학습 변환을 만들어 데이터를 정리할 수 있습니다. 이런 변환을 ETL 스크립트에서 호출할 수 있습니다. 데이터가 *DynamicFrame*이라는 데이터 구조 내의 변환에서 변환으로 전달됩니다. 이는 Apache Spark SQL `DataFrame`을 확장한 것입니다. `DynamicFrame`은 데이터를 포함하고 데이터 스키마를 참조하여 데이터를 진행합니다.

다음과 같은 유형의 기계 학습 변환을 사용할 수 있습니다.

*일치 항목 찾기*  
원본 데이터에서 중복 레코드를 찾습니다. 예제 데이터 세트에 일치하는 행을 나타내는 레이블을 지정하여 이 기계 학습 변환을 학습시킵니다. 레이블 지정된 예제 데이터로 학습을 많이 시킬수록 기계 학습 변환이 어떤 행을 매칭해야 하는지 배우게 됩니다. 변환의 구성 방식에 따라 다음 중 하나가 출력됩니다.  
+ 일치하는 레코드 세트를 나타내는 값이 채워진 `match_id` 열이 추가된 입력 테이블 사본 `match_id` 열은 임의 식별자입니다. `match_id`가 동일한 레코드는 서로 일치한다고 식별되었습니다. `match_id`가 서로 다른 레코드는 일치하지 않습니다.
+ 중복 행이 제거된 입력 테이블 사본 중복 항목이 여러 개 발견되면 기본 키가 가장 낮은 레코드를 유지합니다.

*증분 일치 항목 찾기*  
기존 프레임과 증분 프레임에서 일치 항목을 찾고 일치 그룹당 고유 ID를 포함하는 열을 출력으로 반환하도록 일치 항목 찾기 변환을 구성할 수도 있습니다.  
자세한 내용은 [증분 일치 항목 찾기](machine-learning-incremental-matches.md) 섹션을 참조하세요.

### FindMatches 변환 사용
<a name="machine-learning-find-matches"></a>

이 `FindMatches` 변환을 사용하여 원본 데이터에서 중복 레코드를 찾을 수 있습니다. 변환의 학습을 돕기 위한 레이블 지정 파일이 생성 또는 제공됩니다.

**참고**  
현재 사용자 지정 암호화 키를 사용하는 `FindMatches` 변환은 다음 리전에서 지원되지 않습니다.  
아시아 태평양(오사카) - `ap-northeast-3`

 FindMatches 변환을 시작하려면 아래 단계를 수행합니다. 자세한 고급 예제는 **AWS 빅 데이터 블로그**의 [ Harmonize data using AWS Glue and AWS Lake Formation FindMatches ML to build a customer 360 view](https://aws.amazon.com/blogs/big-data/harmonize-data-using-aws-glue-and-aws-lake-formation-findmatches-ml-to-build-a-customer-360-view/)를 참조하세요.

#### 일치 항목 찾기 변환을 사용하여 시작하기
<a name="machine-learning-find-mathes-workflow"></a>

`FindMatches` 변환을 시작하려면 다음 단계를 따르십시오.

1. AWS Glue Data Catalog에서 정리할 원본 데이터의 테이블을 만듭니다. 크롤러 생성 방법에 대한 자세한 내용은 [AWS Glue 콘솔에서 크롤러 작업](https://docs.aws.amazon.com/glue/latest/dg/console-crawlers.html).을 참조하세요.

   원본 데이터가 CSV(쉼표로 구분된 값) 파일 등 텍스트 기반의 파일이라면 다음을 고려하십시오.
   + 입력 레코드 CSV 파일과 레이블 지정 파일을 별도의 파일에 보관합니다. 그렇지 않으면 AWS Glue 크롤러가 이를 동일한 테이블의 각 부분으로 간주하고 Data Catalog에 테이블을 잘못 생성할 수 있습니다.
   + CSV 파일에 ASCII 문자만 들어 있는 경우를 제외하고, CSV 파일에는 BOM(바이트 순서 표시) 없는 UTF-8 인코딩을 사용해야 합니다. Microsoft Excel은 흔히 UTF-8 CSV 파일의 시작 부분에 BOM을 추가합니다. 이를 제거하려면 텍스트 편집기에서 CSV 파일을 열고 파일을 **UTF-8 without BOM(BOM 없는 UTF-8)**으로 다시 저장하십시오.

1. AWS Glue 콘솔에서 작업을 만들고 **Find matches(일치 항목 찾기)** 변환 유형을 선택합니다.
**중요**  
작업을 위해 선택하는 데이터 원본 테이블의 열 수는 100개를 넘을 수 없습니다.

1. [**레이블 지정 파일 생성(Generate labeling file)**]을 선택하여 AWS Glue에 레이블 지정 파일을 생성하도록 지시합니다. AWS Glue가 각 `labeling_set_id`에 비슷한 레코드를 그룹화하기 위한 첫 번째 전달을 맡아 그러한 그룹화를 검토할 수 있게 해줍니다. 사용자의 레이블이 `label` 열과 일치합니다.
   + 일치하는 행을 나타내는 레코드 예시인 레이블 지정 파일이 이미 있는 경우, 해당 파일을 Amazon Simple Storage Service(Amazon S3)에 업로드합니다. 레이블 지정 파일의 형식에 대한 자세한 내용은 [레이블 지정 파일 형식](#machine-learning-labeling-file) 단원을 참조하십시오. 4단계로 이동합니다.

1. 레이블 지정 파일을 다운로드하고 [레이블링](#machine-learning-labeling) 단원에 설명된 대로 해당 파일에 레이블을 지정합니다.

1. 수정된 레이블 지정 파일을 업로드합니다. AWS Glue가 일치 항목 찾는 방법을 변환에 학습시키기 위한 작업을 실행합니다.

   **Machine learning transforms(기계 학습 변환)** 목록 페이지에서 **기록** 탭을 선택합니다. AWS Glue가 다음 작업을 수행하면 이 페이지에 표시됩니다.
   + **레이블 가져오기**
   + **레이블 내보내기**
   + **레이블 생성**
   + **품질 예측**

1. 더 나은 변환을 만들기 위해 레이블 지정 파일을 반복해서 다운로드하고, 레이블 지정하고, 업로드할 수 있습니다. 처음 실행할 때는 불일치 레코드가 훨씬 더 많을 수 있습니다. 그러나 레이블 지정 파일을 확인하면서 계속 학습시키면 AWS Glue가 학습을 합니다.

1. 일치 항목 찾기의 성능과 결과를 측정하여 변환을 평가하고 조정하십시오. 자세한 내용은 [AWS Glue에서 기계 학습 변환 튜닝](add-job-machine-learning-transform-tuning.md) 섹션을 참조하세요.

#### 레이블링
<a name="machine-learning-labeling"></a>

`FindMatches`가 레이블 지정 파일을 생성할 때 사용자의 소스 테이블에서 레코드가 선택됩니다. 이전의 학습을 토대로 `FindMatches`는 학습해야 할 가장 중요한 레코드를 파악합니다.

*레이블 지정*이란 레이블 지정 파일을 편집(Microsoft Excel 같은 스프레드시트 사용을 권장)하고 일치 및 불일치 레코드를 식별하는 `label` 열에 식별자나 레이블을 추가하는 것을 뜻합니다. 소스 데이터의 일치 항목을 명확하고 일관성 있게 정의해야 합니다. `FindMatches`는 사용자가 일치(또는 불일치) 항목으로 지정한 레코드에서 학습하고, 사용자의 결정을 토대로 중복 레코드 찾는 방법을 배웁니다.

`FindMatches`에서 레이블 지정 파일이 생성될 때 약 100개의 레코드가 생성됩니다. 이러한 100개의 레코드는 보통 10개의 *레이블 지정 세트*로 나뉘며, 각각의 레이블 지정 세트는 `FindMatches`에서 생성된 고유한 `labeling_set_id`으로 식별됩니다. 각 레이블 지정 세트는 다른 레이블 지정 세트와 독립적인 별도의 레이블 지정 작업으로 간주되어야 합니다. 각각의 레이블 지정 세트 내에서 일치하는 레코드와 일치하지 않는 레코드를 식별하는 작업을 합니다.

##### 스프레드시트에서의 레이블 지정 파일 편집 관련 팁입니다.
<a name="machine-learning-labeling-tips"></a>

스프레드 시트 애플리케이션에서 레이블 지정 파일을 편집할 때는 다음을 고려하십시오.
+ 열 필드가 전부 확장된 상태에서는 파일이 열리지 않을 수 있습니다. 원하는 셀의 내용을 보기 위해 `labeling_set_id` 및 `label` 열을 확장해야 할 수 있습니다.
+ `long` 데이터 유형 등 기본 키 열이 숫자인 경우, 스프레드시트에서 이를 숫자로 해석하고 값을 변경할 수 있습니다. 이 키 값은 텍스트로 취급해야 합니다. 이 문제를 해결하려면 기본 키 열의 모든 셀을 **텍스트 데이터**로 서식 지정하십시오.

#### 레이블 지정 파일 형식
<a name="machine-learning-labeling-file"></a>

`FindMatches` 변환을 가르치기 위해 AWS Glue에서 생성된 레이블 지정 파일은 다음 형식을 사용합니다. AWS Glue에 대한 자체 파일을 생성하는 경우에는 다음 형식도 따라야 합니다.
+ CSV(쉼표로 구분된 값) 파일입니다.
+ `UTF-8`로 인코딩해야 합니다 . Microsoft Windows에서 이 파일을 편집하면 `cp1252`로 인코딩될 수 있습니다.
+ Amazon S3 위치에 있어야 AWS Glue로 전달할 수 있습니다.
+ 각각의 레이블 지정 태스크마다 적당한 수의 행을 사용하세요. 태스크당 10\$120행이 좋지만, 태스크당 2\$130행도 허용 가능합니다. 행이 50개 이상인 작업은 권장되지 않으며 결과가 좋지 않거나 시스템 오류가 발생할 수 있습니다.
+ “일치”또는 “불일치”로 레이블이 지정된 레코드 쌍으로 구성되고 이미 레이블이 지정된 데이터인 경우에는 괜찮습니다. 이렇게 레이블이 지정된 쌍은 크기가 2인 레이블 지정 세트로 표현될 수 있습니다. 이때 일치하는 경우에는 두 레코드를 모두 문자 “A”로 레이블 지정하고 일치하지 않는 경우에는 하나는 “A”로, 다른 하나는 “B”로 레이블 지정합니다.
**참고**  
 레이블 지정 파일에는 추가 열이 있기 때문에 원본 데이터가 들어 있는 파일과는 스키마가 다릅니다. AWS Glue 크롤러가 Data Catalog에서 테이블을 생성할 때 레이블 지정 파일을 고려하는 일이 없도록 이 파일을 변환 입력 CSV 파일과 다른 폴더에 저장합니다. 그렇지 않으면 AWS Glue 크롤러가 만든 테이블에 데이터가 올바르게 표현되지 않을 수 있습니다.
+ 처음 두 열(`labeling_set_id`, `label`)은 AWS Glue의 필수 열입니다. 나머지 열은 처리할 데이터의 스키마와 일치해야 합니다.
+ 각 `labeling_set_id`에 대해 동일한 레이블을 사용하여 일치하는 레코드를 모두 식별합니다. 레이블이란 `label` 열에 배치된 고유한 문자열입니다. A, B, C 같이 단순한 문자로 된 레이블을 사용하는 것이 좋습니다. 레이블은 대소문자를 구분하며 `label` 열에 입력됩니다.
+ 동일한 `labeling_set_id`과 동일한 레이블을 포함하는 행은 일치 항목으로 레이블이 지정되는 것으로 간주됩니다.
+ 동일한 `labeling_set_id`과 다른 레이블을 포함하는 행은 일치 항목이 *아닌* 것으로 레이블이 지정됩니다.
+ 다른 `labeling_set_id`를 포함하는 행은 일치하거나 일치하지 않은 정보를 전달하지 않는 것으로 간주됩니다.

  다음은 데이터 레이블 지정의 예입니다.    
<a name="table-labeling-data"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/machine-learning.html)
+ 위의 예에서는 John/Johnny/Jon Doe를 일치 항목으로 식별하고 이러한 레코드들이 Jane Smith와 일치하지 않는다고 시스템을 학습시킵니다. 이와 별도로 Richard와 Rich Jones가 같은 사람이지만 이들 레코드가 Sarah Jones/Jones-Walker와 Richie Jones Jr와 일치하지 않는다고 시스템을 학습시킵니다.
+ 보시다시피 레이블의 범위는 `labeling_set_id`로 제한됩니다 . 따라서 레이블은 `labeling_set_id` 경계를 벗어나지 않습니다. 예를 들어, `labeling_set_id` 1의 레이블 "A"는 `labeling_set_id` 2의 레이블 "A"와 아무런 관계가 없습니다.
+ 레코드가 레이블 지정 세트 내에서 일치 항목이 없는 경우, 고유한 레이블을 지정합니다. 예를 들어, Jane Smith는 레이블 지정 세트 ABC123의 레코드와 일치하지 않으므로 B라는 레이블이 있는 레이블 지정 세트의 유일한 레코드입니다.
+ 레이블 지정 세트 “GHI678"은 레이블 지정 세트가 일치한다는 것을 보여주기 위해 동일한 레이블이 지정된 두 개의 레코드로 구성 될 수 있음을 보여줍니다. 마찬가지로 “XYZABC”는 일치하지 않음을 나타내기 위해 서로 다른 레이블이 지정된 두 개의 레코드를 보여줍니다.
+ 때로 레이블 지정 세트에 일치하는 항목이 없거나(예: 레이블 지정 세트의 모든 레코드에 다른 레이블을 지정하는 경우), 레이블 지정 세트가 모두 “동일"할 수 있다는(모두 동일한 레이블을 지정한 경우) 점에 유의하십시오. 레이블 지정 세트가 기준에 따라 “동일”하지 않은 레코드의 예들을 총체적으로 포함하는 경우에는 괜찮습니다.

**중요**  
AWS Glue에 전달하는 IAM 역할이 레이블 지정 파일이 들어 있는 Amazon S3 버킷에 액세스할 수 있는지 확인합니다. 명명 규칙에 의해 AWS Glue 정책이 Amazon S3 버킷이나 폴더 등 이름에 **aws-glue-** 접두사가 붙은 곳에 권한을 부여합니다. 레이블 지정 파일이 다른 위치에 있는 경우, IAM 역할에 해당 위치에 대한 권한을 추가합니다.

# AWS Glue에서 기계 학습 변환 튜닝
<a name="add-job-machine-learning-transform-tuning"></a>

AWS Glue에서 기계 학습 변환을 튜닝하여 데이터 정리 작업의 결과를 개선함으로써 목표를 충족할 수 있습니다. 변환을 개선하려면 레이블 지정 세트를 생성하고, 레이블을 추가한 후, 원하는 결과를 얻을 때까지 이러한 단계를 여러 번 반복하여 교육할 수 있습니다. 일부 기계 학습 파라미터를 변경하여 튜닝할 수도 있습니다. 

기계 학습 변환에 대한 자세한 내용은 [AWS Lake Formation FindMatches로 레코드 매칭](machine-learning.md) 단원을 참조하십시오.

**Topics**
+ [기계 학습 측정](machine-learning-terminology.md)
+ [정밀도와 재현율 중에서 결정](machine-learning-precision-recall-tradeoff.md)
+ [정확도와 비용 중에서 결정](machine-learning-accuracy-cost-tradeoff.md)
+ [일치 신뢰도 점수를 사용하여 일치 항목의 품질 추정](match-scoring.md)
+ [일치 항목 찾기 변환 교육](machine-learning-teaching.md)

# 기계 학습 측정
<a name="machine-learning-terminology"></a>

기계 학습 변환을 튜닝하는 데 사용되는 측정을 이해하려면 다음 용어를 숙지해야 합니다.

**참 긍정(TP)**  
변환이 올바르게 찾은 데이터의 일치로, *적중*이라고도 합니다.

**참 부정(TN)**  
변환이 올바르게 거부한 데이터의 불일치입니다.

**거짓 긍정(FP)**  
변환이 일치로 잘못 분류한 데이터의 불일치로, *거짓 경보*라고도 합니다.

**거짓 부정(FN)**  
변환이 찾지 못한 데이터의 일치로, *누락*이라고도 합니다.

기계 학습에 사용되는 용어에 대한 자세한 내용은 Wikipedia에서 [Confusion matrix](https://en.wikipedia.org/wiki/Confusion_matrix)를 참조하십시오.

기계 학습 변환을 튜닝하려면 변환의 **Advanced properties(고급 속성)**에서 다음 측정 값을 변경하면 됩니다.
+ [**정밀도(Precision)**]는 변환이 긍정으로 식별하는 총 레코드 수(참 긍정 및 거짓 긍정) 중에서 참 긍정을 얼마나 잘 찾는지 측정합니다. 자세한 내용은 Wikipedia의 [정밀도 및 재현율](https://en.wikipedia.org/wiki/Precision_and_recall)을 참조하십시오.
+ **재현율**은 변환이 소스 데이터의 총 레코드에서 참 긍정을 얼마나 잘 찾는지 측정합니다. 자세한 내용은 Wikipedia의 [정밀도 및 재현율](https://en.wikipedia.org/wiki/Precision_and_recall)을 참조하십시오.
+ **정확도**는 변환이 참 긍정과 참 부정을 얼마나 잘 찾는지 측정합니다. 정확도를 증가시키려면 더 많은 기계 리소스와 비용이 필요합니다. 하지만 이렇게 하면 재현율도 증가합니다. 자세한 내용은 Wikipedia의 [Accuracy and precision](https://en.wikipedia.org/wiki/Accuracy_and_precision#In_information_systems)을 참조하십시오.
+ **비용**은 변환을 실행하는 데 사용한 컴퓨팅 리소스(따라서 비용)의 양을 측정합니다.

# 정밀도와 재현율 중에서 결정
<a name="machine-learning-precision-recall-tradeoff"></a>

각 `FindMatches` 변환에는 `precision-recall` 파라미터가 포함되어 있습니다. 이 파라미터를 사용하여 다음 중 하나를 지정합니다.
+ 변환이 실제로는 일치하지 않는 두 레코드가 일치한다고 잘못 보고할 것이 더 우려되는 경우, *정밀도*를 강조해야 합니다.
+ 변환이 정말로 일치하는 레코드를 감지하지 못할 것이 더 우려되는 경우, *재현율*을 강조해야 합니다.

AWS Glue 콘솔에서 또는 AWS Glue 기계 학습 API 작업을 사용하여 균형을 이룰 수 있습니다.

**정밀도를 추구해야 하는 경우**  
`FindMatches`가 실제로는 일치하지 않는 레코드 페어가 일치한다고 할 위험이 더 우려되는 경우 정밀도를 추구합니다. 정밀도를 추구하려면 *더 높은* 정밀도-재현율 균형 값을 선택합니다. 더 큰 값의 경우 `FindMatches` 변환에는 레코드 페어가 일치해야 한다고 결정하기 위해 더 많은 증거가 필요합니다. 이 변환은 레코드가 일치하지 않는다고 말하는 경향이 있습니다.

예를 들어 `FindMatches`를 사용하여 비디오 카탈로그에서 중복 항목을 감지하며, 변환에 더 큰 정밀도-재현율 값을 제공한다고 가정하겠습니다. 변환이 *Star Wars: A New Hope*가 *Star Wars: The Empire Strikes Back*과 같다고 잘못 감지하는 경우, *A New Hope*을 원하는 고객에게 *The Empire Strikes Back*이 표시될 수 있습니다. 이는 부정적인 고객 경험이 됩니다.

그러나 변환이 *Star Wars: A New Hope*와 *Star Wars: Episode IV—A New Hope*가 동일한 항목이라고 감지하지 못하면 고객은 처음에는 혼란스러울 수 있으나 결국에는 둘을 동일하게 인식할 수 있습니다. 이는 실수이지만, 이전 시나리오만큼 나쁘지는 않습니다.

**재현율을 추구해야 하는 경우**  
`FindMatches` 변환 결과가 실제로는 일치하는 레코드 페어를 감지하지 못할 것이 더 우려되는 경우 재현율을 추구합니다. 재현율을 추구하려면 *더 낮은* 정밀도-재현율 균형 값을 선택합니다. 더 작은 값의 경우 `FindMatches` 변환에는 레코드 페어가 일치해야 한다고 결정하기 위해 더 적은 증거가 필요합니다. 이 변환은 레코드가 일치한다고 말하는 경향이 있습니다.

예를 들어 이는 보안 조직의 우선 순위일 수 있습니다. 고객을 알려진 사기꾼 목록과 대조해 보고 있으며, 고객이 사기꾼인지 여부를 확인하는 것이 중요하다고 가정하겠습니다. `FindMatches`를 사용하여 사기꾼 목록을 고객 목록과 대조하고 있습니다. `FindMatches`가 두 목록 간에 일치 항목을 감지할 때마다 해당 사람이 실제로 사기꾼인지 확인하기 위해 인간 감사자가 지정됩니다. 조직은 정밀도보다 재현율을 선택하는 것을 선호할 수 있습니다. 다시 말해 감사자가 수동으로 검토하고 고객이 사기꾼이 아닌 일부 사례를 거부하도록 하는 것입니다. 그러면 고객이 실제로 사기꾼 목록에 있음을 식별하지 못할 일이 없습니다.

**정밀도와 재현율을 모두 추구하는 방법**  
정밀도와 재현율을 모두 개선하는 가장 좋은 방법은 더 많은 데이터에 레이블을 지정하는 것입니다. 더 많은 데이터에 레이블을 지정하면 `FindMatches` 변환의 전반적인 정확도가 개선되므로 정밀도와 재현율도 개선됩니다. 그럼에도 불구하고 가장 정확한 변환에서조차 정밀도 또는 재현율을 추구하는 실험이 필요하거나 중간 값을 선택해야 하는 애매한 상황이 항상 있습니다.

# 정확도와 비용 중에서 결정
<a name="machine-learning-accuracy-cost-tradeoff"></a>

각 `FindMatches` 변환에는 `accuracy-cost` 파라미터가 포함되어 있습니다. 이 파라미터를 사용하여 다음 중 하나를 지정할 수 있습니다.
+ 변환이 두 레코드가 일치한다고 정확하게 보고하는 것이 더 우려되는 경우, *정확도*를 강조해야 합니다.
+ 변환 실행 비용이나 속도가 더 우려되는 경우 *더 낮은 비용*을 강조해야 합니다.

AWS Glue 콘솔에서 또는 AWS Glue 기계 학습 API 작업을 사용하여 균형을 이룰 수 있습니다.

**정확도를 추구해야 하는 경우**  
`find matches` 결과에 일치 항목이 포함되지 않을 위험이 더 우려되는 경우 정확도를 추구합니다. 정확도를 추구하려면 *더 높은* 정확도-비용 균형 값을 선택합니다. 더 높은 값의 경우 `FindMatches` 변환에는 정확하게 일치하는 레코드를 더 철저히 검색하기 위해 더 많은 시간이 필요합니다. 이 파라미터는 일치하지 않는 레코드 페어를 일치한다고 잘못 호출할 가능성을 낮추지는 않습니다. 이 변환은 일치 항목을 찾는 데 더 많은 시간을 보내는 경향이 있습니다.

**비용을 추구해야 하는 경우**  
`find matches` 변환을 실행하는 데 드는 비용을 더 우려하고 일치 항목의 수를 찾는 것에 덜 우려하는 경우 비용을 추구합니다. 비용을 추구하려면 *더 낮은* 정확도-비용 균형 값을 선택합니다. 더 낮은 값의 경우 `FindMatches` 변환은 실행할 리소스가 더 적게 필요합니다. 이 변환은 일치 항목을 더 적게 찾는 경향이 있습니다. 더 낮은 비용을 추구했을 때 결과가 수용 가능한 수준인 경우 이 설정을 사용합니다.

**정확도와 더 낮은 비용을 모두 추구하는 방법**  
더 많은 레코드 쌍을 검토하여 일치 여부를 확인하려면 더 많은 시간이 걸립니다. 품질을 낮추지 않고 비용을 줄이려면 다음과 같은 단계를 수행하면 됩니다.
+ 데이트 원본에서 일치에 대해 우려하지 않는 레코드를 제거합니다.
+ 일치/불일치 결정을 내리는 것이 유용하지 않다고 확신하는 열을 데이터 원본에서 제거합니다. 이를 결정하는 좋은 방법은 레코드 세트가 “동일”한지 여부에 대한 자신의 결정에 영향을 미친다고 생각하지 않는 열을 제거하는 것입니다.

# 일치 신뢰도 점수를 사용하여 일치 항목의 품질 추정
<a name="match-scoring"></a>

일치 신뢰도 점수는 FindMatchs에서 찾은 일치 항목의 품질을 추정하여 기계 학습 모델의 신뢰도가 높거나 불확실하거나 낮은 일치 레코드를 구별합니다. 일치 신뢰도 점수는 0에서 1 사이이며, 점수가 높을수록 유사성이 높아집니다. 일치 신뢰도 점수를 검사하면 신뢰도가 높은 일치 항목 클러스터(병합하기로 결정할 수 있음), 불확실한 클러스터(사람이 검토하기로 결정할 수 있음), 신뢰도가 낮은 클러스터(거부하기로 결정할 수 있음)를 구별할 수 있습니다.

일치 신뢰도 점수가 높은데 일치 항목이 없거나 점수가 낮은데 실제로 일치 항목이 있는 경우 훈련 데이터를 조정하는 것이 좋습니다.

신뢰도 점수는 모든 FindMatches 결정을 검토하는 것이 불가능한 대규모 산업 데이터 집합이 있는 경우에 특히 유용합니다.

일치 신뢰도 점수는 AWS Glue 버전 2.0 이상에서 사용 가능합니다.

## 일치 신뢰도 점수 생성
<a name="specifying-match-scoring"></a>

`FindMatches` 또는 `FindIncrementalMatches` API를 호출할 때 `computeMatchConfidenceScores`의 부울 값을 True로 설정하면 일치 신뢰도 점수를 생성할 수 있습니다.

AWS Glue는 새 `column match_confidence_score`를 출력에 추가합니다.

## 일치 점수 매기기 예
<a name="match-scoring-examples"></a>

예를 들어 다음 일치 레코드를 고려해 보세요.

**점수 >= 0.9**  
일치 레코드 요약:

```
  primary_id  |   match_id  | match_confidence_score

3281355037663    85899345947   0.9823658302132061
1546188247619    85899345947   0.9823658302132061
```

세부 정보:

![\[인터넷 게이트웨이를 통한 라우팅 테이블 예제.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/match_score1.png)


이 예제에서는 두 레코드가 매우 유사하고 `display_position`, `primary_name`, `street name`을 공유한다는 것을 확인할 수 있습니다.

**점수 >= 0.8 및 점수 < 0.9**  
일치 레코드 요약:

```
  primary_id  |   match_id  | match_confidence_score

309237680432     85899345928   0.8309852373674638
3590592666790    85899345928   0.8309852373674638
343597390617     85899345928   0.8309852373674638
249108124906     85899345928   0.8309852373674638
463856477937     85899345928   0.8309852373674638
```

세부 정보:

![\[인터넷 게이트웨이를 통한 라우팅 테이블 예제.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/match_score2.png)


이 예제에서는 두 레코드가 동일한 `primary_name` 및 `country`를 공유한다는 것을 확인할 수 있습니다.

**점수 >= 0.6 및 점수 < 0.7**  
일치 레코드 요약:

```
  primary_id  |   match_id  | match_confidence_score

2164663519676    85899345930   0.6971099896480333
 317827595278    85899345930   0.6971099896480333
 472446424341    85899345930   0.6971099896480333
3118146262932    85899345930   0.6971099896480333
 214748380804    85899345930   0.6971099896480333
```

세부 정보:

![\[인터넷 게이트웨이를 통한 라우팅 테이블 예제.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/match_score3.png)


이 예제에서는 두 레코드가 동일한 `primary_name`만 공유한다는 것을 확인할 수 있습니다.

자세한 내용은 다음 섹션을 참조하세요.
+ [5단계: 기계 학습 변환으로 작업 추가 및 실행](machine-learning-transform-tutorial.md#ml-transform-tutorial-add-job)
+ PySpark: [FindMatches 클래스](aws-glue-api-crawler-pyspark-transforms-findmatches.md)
+ PySpark: [FindIncrementalMatches 클래스](aws-glue-api-crawler-pyspark-transforms-findincrementalmatches.md)
+ Scala: [FindMatches 클래스](glue-etl-scala-apis-glue-ml-findmatches.md)
+ Scala: [FindIncrementalMatches 클래스](glue-etl-scala-apis-glue-ml-findincrementalmatches.md)

# 일치 항목 찾기 변환 교육
<a name="machine-learning-teaching"></a>

각 `FindMatches` 변환에 일치로 간주해야 하는 사항과 일치로 간주하지 말아야 하는 사항을 교육해야 합니다. 파일에 레이블을 추가하고 AWS Glue에 선택 사항을 업로드하여 변환을 교육합니다.

AWS Glue 콘솔에서 또는 AWS Glue 기계 학습 API 작업을 사용하여 이 레이블 지정을 조정할 수 있습니다.

**레이블을 몇 번 추가해야 하나요? 몇 개의 레이블이 필요하나요?**  
이러한 질문에 대한 답은 거의 사용자에게 달려 있습니다. `FindMatches`가 필요한 정확도 수준을 제공하는지 여부와 추가 레이블 지정 노력이 가치 있다고 생각하는지 여부를 평가해야 합니다. 이를 결정하는 가장 좋은 방법은 AWS Glue 콘솔에서 [**품질 평가(Estimate quality)**]를 선택할 때 생성할 수 있는 "정밀도", "재현율" 및 "정밀도 재현율 곡선 아래 영역" 지표를 살펴보는 것입니다. 더 많은 작업 세트에 레이블을 지정한 후 이러한 지표를 다시 실행하고 개선되었는지 확인합니다. 작업 세트 몇 개에 레이블을 지정한 후 초점을 둔 지표에 개선이 보이지 않는 경우, 변환 품질이 정체 상태에 도달했을 수 있습니다.

**참 긍정과 참 부정 레이블이 모두 필요한 이유는 무엇인가요?**  
`FindMatches` 변환은 사용자가 일치한다고 생각하는 항목을 학습하려면 긍정과 부정 예가 모두 필요합니다. `FindMatches`에서 생성하는 훈련 데이터에 레이블을 지정하는 경우(예: **I do not have labels(레이블이 없음)** 옵션 사용), `FindMatches`는 “레이블 세트 ID” 세트를 생성하려고 시도합니다. 각 작업 내에서 일부 레코드에는 동일한 “레이블”을, 다른 레코드에는 다른 “레이블”을 제공합니다. 다시 말해 이 작업은 일반적으로 모두 동일하지도 모두 다르지도 않습니다(그러나 특정 작업이 모두 “동일”하거나 모두 “동일하지 않은” 경우는 괜찮음).

[**S3에서 레이블 업로드(Upload labels from S3)**] 옵션을 사용하여 `FindMatches` 변환을 가르치는 경우 일치하는 레코드와 일치하지 않는 레코드의 예를 모두 포함합니다. 한 유형만 사용할 수 있습니다. 이러한 레이블을 사용하면 더 정확한 `FindMatches` 변환을 구축할 수 있지만, **Generate labeling file(레이블 지정 파일 생성)** 옵션을 사용하여 생성하는 일부 레코드에 레이블을 지정해야 합니다.

**변환을 교육할 때 변환이 정확히 일치하도록 강제할 수 있나요?**  
`FindMatches` 변환은 사용자가 제공하는 레이블에서 학습하므로, 제공된 레이블을 따르지 않는 레코드 페어를 생성할 수 있습니다. `FindMatches` 변환이 레이블을 따르도록 하려면 **FindMatchesParameter**에서 **EnforceProvidedLabels**를 선택합니다.

**ML 변환이 항목을 참이 아닌 일치 항목으로 식별하는 경우 어떤 기술을 사용할 수 있나요?**  
다음과 같은 기술을 사용할 수 있습니다.
+ `precisionRecallTradeoff`을 더 큰 값으로 높입니다. 그러면 결국 더 적은 일치 항목을 찾게 되지만, 충분히 높은 값에 도달하면 큰 클러스터를 분리해야 합니다.
+ 잘못된 결과에 해당하는 출력 행을 가져와서 레이블 지정 세트로 다시 포맷합니다(`match_id` 열을 제거하고, `labeling_set_id` 및 `label` 열 추가). 필요한 경우 여러 레이블 지정 세트로 분리(세분화)하여 레이블러가 레이블을 할당하는 동안 각 레이블 지정 세트를 염두에 둘 수 있도록 합니다. 그런 다음 일치하는 세트에 올바르게 레이블을 지정하고 레이블 파일을 업로드한 후 기존 레이블에 추가합니다. 그러면 패턴을 이해하기 위해 찾고 있는 사항에 대해 변환기를 충분히 교육할 수 있습니다.
+ (고급) 마지막으로 데이터를 보고 시스템이 알아채지 못하고 있음을 감지할 수 있는 패턴이 있는지 확인합니다. 표준 AWS Glue 함수를 사용해 해당 데이터를 사전 처리하여 데이터를 *정규화*합니다. 중요한 데이터를 자체 열로 따로 분리하여 알고리즘이 학습하도록 할 내용을 강조 표시합니다. 또는 관련된 데이터가 있는 열에서 결합된 열을 생성합니다.

# 기계 학습 변환 작업
<a name="console-machine-learning-transforms"></a>

AWS Glue를 사용하여 데이터를 정리하는 데 사용할 수 있는 사용자 지정 기계 학습 변환을 생성할 수 있습니다. AWS Glue 콘솔에서 작업을 생성할 때 이러한 변환을 사용할 수 있습니다.

기계 학습 변환을 생성하는 방법에 대한 자세한 내용은 [AWS Lake Formation FindMatches로 레코드 매칭](machine-learning.md) 단원을 참조하십시오.

**Topics**
+ [변환 속성](#console-machine-learning-properties)
+ [기계 학습 변환 추가 및 편집](#console-machine-learning-transforms-actions)
+ [변환 세부 정보 보기](#console-machine-learning-transforms-details)
+ [레이블을 사용하여 변환 학습](#console-machine-learning-transforms-teaching-transforms)

## 변환 속성
<a name="console-machine-learning-properties"></a>

기존 기계 학습 변환을 보려면 AWS Management Console에 로그인하고 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다. 탐색 창의 **데이터 통합 및 ETL**에서 **데이터 분류 도구 > 레코드 일치**를 선택합니다.

각 변환의 속성:

**변환 이름**  
생성할 때 변환에 부여한 고유 이름입니다.

**ID**  
변환의 고유 식별자입니다.

**레이블 수**  
변환 학습에 도움이 되도록 지정된 레이블 지정 파일의 레이블 수입니다.

**Status**  
변환이 [**준비(Ready)**] 상태인지 또는 [**훈련 필요(Needs training)**] 상태인지를 나타냅니다. 작업에서 기계 학습 변환을 성공적으로 실행하려면 변환이 [**준비(Ready)**] 상태여야 합니다.

**Created**  
변환이 생성된 날짜입니다.

**수정됨**  
변환이 마지막으로 업데이트된 날짜입니다.

**설명**  
변환에 대해 제공된 설명(제공된 경우)입니다.

**AWS Glue 버전**  
사용된 AWS Glue 버전입니다.

**실행 ID**  
생성할 때 변환에 부여한 고유 이름입니다.

**작업 유형**  
기계 학습 변환의 유형입니다. 예: **Find matching records(일치하는 레코드 찾기)**

**Status**  
작업 실행 상태를 나타냅니다. 가능한 상태는 다음과 같습니다.  
+ 시작됨
+ 실행
+ Stopping(중지 중)
+ Stopped(중지됨)
+ Succeeded(성공)
+ Failed(실패)
+ 제한 시간

**오류**  
상태가 실패인 경우 실패의 원인을 설명하는 오류 메시지가 표시됩니다.

## 기계 학습 변환 추가 및 편집
<a name="console-machine-learning-transforms-actions"></a>

 AWS Glue 콘솔에서 변환을 보기, 삭제, 설정 및 교육 또는 튜닝할 수 있습니다. 목록에서 변환 옆의 확인란을 선택하고, **Action(작업)**을 선택한 다음, 수행할 작업을 선택합니다.

### 새 ML 변환 생성
<a name="w2aac37c11c24c23c11b5"></a>

 새 기계 학습 변환을 추가하려면 **변환 생성**을 선택합니다. **크롤로 추가** 마법사의 지시에 따릅니다. 자세한 내용은 [AWS Lake Formation FindMatches로 레코드 매칭](machine-learning.md) 섹션을 참조하세요.

#### 1단계. 변환 속성을 설정합니다.
<a name="w2aac37c11c24c23c11b5b7"></a>

1. 이름 및 설명(선택 사항)을 입력합니다.

1. 선택적으로 보안 구성을 설정합니다. [기계 학습 변환에 데이터 암호화 사용](#ml_transform_sec_config)을(를) 참조하세요.

1. 선택적으로 작업 실행 설정을 설정합니다. 작업 실행 설정을 통해 작업 실행 방식을 사용자 지정할 수 있습니다. 작업자 유형, 작업자 수, 작업 제한 시간(분), 재시도 횟수, AWS Glue 버전을 선택합니다.

1. 선택적으로 태그를 설정합니다. 태그는 AWS 리소스에 할당할 수 있는 레이블입니다. 각 태그는 키와 값(선택사항)으로 구성됩니다. 태그를 사용하여 리소스를 검색 및 필터링하거나 AWS 비용을 추적할 수 있습니다.

#### 2단계. 테이블과 프라이머리 키를 선택합니다.
<a name="w2aac37c11c24c23c11b5b9"></a>

1. AWS Glue 카탈로그 데이터베이스 및 테이블을 선택합니다.

1. 선택한 테이블에서 프라이머리 키를 선택합니다. 프라이머리 키 열에는 일반적으로 데이터 소스의 모든 레코드에 대한 고유 식별자가 포함됩니다.

#### 3단계. 튜닝 옵션을 선택합니다.
<a name="w2aac37c11c24c23c11b5c11"></a>

1.  **재현율 대 정밀도**의 경우 튜닝 값을 선택하여 재현율 또는 정밀도에 유리하도록 변환을 튜닝합니다. 기본적으로 **균형**이 선택되지만 재현율에 유리하거나 정밀도에 유리하도록 선택할 수 있습니다. 또는 **사용자 지정**을 선택하고 0.0에서 1.0(포함) 사이의 값을 입력할 수 있습니다.

1.  **낮은 비용 및 정확도**의 경우 낮은 비용에 유리하거나 정확도에 유리하도록 튜닝 값을 선택합니다. 또는 **사용자 지정**을 선택하고 0.0에서 1.0(포함) 사이의 값을 입력합니다.

1.  **일치 적용**의 경우 사용하는 레이블과 일치하도록 강제 출력함으로서 ML 변환을 학습시키려면 **레이블과 일치하도록 강제 출력**을 선택합니다.

#### 4단계. 검토 및 생성.
<a name="w2aac37c11c24c23c11b5c13"></a>

1.  1\$13단계의 옵션을 검토합니다.

1.  수정이 필요한 모든 단계에서 **편집**을 선택합니다. **변환 생성**을 선택하여 변환 생성 마법사를 완료합니다.

### 기계 학습 변환에 데이터 암호화 사용
<a name="ml_transform_sec_config"></a>

기계 학습 변환을 AWS Glue에 추가할 때 데이터 원본 또는 데이터 대상과 연결된 보안 구성을 선택적으로 지정할 수 있습니다. 데이터를 저장하는 데 사용된 Amazon S3 버킷이 보안 구성으로 암호화된 경우 변환을 생성할 때 동일한 보안 구성을 지정합니다.

또한 AWS KMS(SSE-KMS)로 서버 측 암호화를 사용하여 모델과 레이블을 암호화하여 권한이 없는 사람이 모델을 검사하지 못하도록 할 수 있습니다. 이 옵션을 선택하면 이름으로 AWS KMS key를 선택하라는 메시지가 나타나거나 [**키 ARN 입력(Enter a key ARN)**]을 선택할 수 있습니다. KMS 키에 대한 ARN을 입력하도록 선택하면 KMS 키 ARN을 입력할 수 있는 두 번째 필드가 나타납니다.

**참고**  
현재 사용자 지정 암호화 키를 사용하는 ML 변환은 다음 리전에서 지원되지 않습니다.  
아시아 태평양(오사카) - `ap-northeast-3`

## 변환 세부 정보 보기
<a name="console-machine-learning-transforms-details"></a>

### 변환 속성 보기
<a name="console-machine-learning-transforms-details"></a>

**변환 속성** 페이지에는 변환 속성이 포함되어 있습니다. 이 탭은 다음을 포함하여 변환 정의에 대한 세부 정보를 보여 줍니다.
+ **Transform name(변환 이름)**은 변환의 이름을 보여 줍니다.
+ **Type(유형)**에는 변환의 유형이 나열됩니다.
+ **Status(상태)**는 변환이 스크립트 또는 작업에 사용할 준비가 되었는지 여부를 표시합니다.
+ **Force output to match labels(레이블과 일치하도록 출력 강제)**는 변환이 사용자가 제공한 레이블과 일치하도록 출력을 강제하는지 여부를 표시합니다.
+ [**Spark 버전(Spark version)**]은 변환을 추가할 때 [**태스크 실행 속성(Task run properties)**]에서 선택한 AWS Glue 버전과 관련이 있습니다. AWS Glue 1.0 및 Spark 2.4는 대부분의 고객에게 권장됩니다. 자세한 내용은 [AWS Glue 버전](https://docs.aws.amazon.com/glue/latest/dg/release-notes.html#release-notes-versions)을 참조하세요.

### 기록, 품질 예측 및 태그 탭
<a name="w2aac37c11c24c23c13b5"></a>

 변환 세부 정보에는 변환을 생성할 때 정의한 정보가 포함되어 있습니다. 변환에 대한 세부 정보를 보려면 **Machine learning transforms(기계 학습 변환)** 목록에서 변환을 선택하고 다음 탭에서 정보를 검토합니다.
+ 기록
+ 품질 예측
+ Tags

#### 기록
<a name="console-machine-learning-transforms-history"></a>

**History(기록)** 탭에는 변환 작업 실행 기록이 표시됩니다. 변환을 교육하기 위해 여러 유형의 작업이 실행됩니다. 각 작업에 대한 실행 지표에는 다음이 포함됩니다.
+ **Run ID(실행 ID)**는 이 작업의 각 실행에 대해 AWS Glue에서 생성된 식별자입니다.
+ **Task type(작업 유형)**은 작업 실행의 유형을 보여 줍니다.
+ **Run status(실행 상태)**에는 맨 위에 가장 최근 실행부터 순서대로 나열된 각 작업의 성공 여부를 보여 줍니다.
+ **오류**는 성공적이지 못한 실행의 결과로서 오류 메시지의 세부 정보를 보여줍니다.
+ **Start time(시작 시간)**은 작업이 시작된 날짜와 시간(로컬 시간)을 보여줍니다.
+ **종료 시간**은 작업이 종료되는 날짜와 시간(로컬 시간)을 보여줍니다.
+ **Logs(로그)**는 이 작업을 실행할 때 `stdout`에 작성되는 로그와 연결됩니다.

  [**로그(Logs)**] 링크를 클릭하면 Amazon CloudWatch Logs로 이동됩니다. 그곳에서는 AWS Glue Data Catalog에서 생성된 테이블 및 발생한 오류에 대한 모든 세부 정보를 볼 수 있습니다. CloudWatch 콘솔에서 로그 보존 기간을 관리할 수 있습니다. 기본 로그 보관은 `Never Expire`. 보존 기간 변경 방법에 대한 자세한 내용은 *Amazon CloudWatch Logs User Guide*의 [Change Log Data Retention in CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention)를 참조하세요.
+ **레이블 파일**은 Amazon S3에 대한 생성된 레이블 지정 파일의 링크를 보여줍니다.

#### 품질 예측
<a name="console-machine-learning-transforms-metrics"></a>

 **Estimate quality(예상 품질)** 탭은 변환의 품질을 측정하는 데 사용할 수 있는 지표를 보여 줍니다. 추정치는 레이블 지정 데이터의 하위 세트를 사용하는 변환 일치 예측과 사용자가 제공한 레이블을 비교해서 계산합니다. 이 추정치는 근사값입니다. 이 탭에서 **Estimate quality(예상 품질)** 작업 실행을 호출할 수 있습니다.

**Estimate quality(예상 품질)** 탭에는 다음 속성이 포함된 마지막 **Estimate quality(예상 품질)** 실행의 지표가 표시됩니다.
+ **Area under the Precision-Recall curve(정밀도-재현율 곡선 아래 면적)**는 전체적 변환 품질의 상한값을 예측하는 단일 숫자입니다. 이 항목은 정밀도-재현율 파라미터에 대해 수행한 선택과 무관합니다. 값이 높을수록 더 매력적인 정밀도-재현율 트레이드오프가 있음을 나타냅니다.
+ **Precision(정밀도)**은 변환이 일치를 정확하게 예측하는 빈도를 예측치로 표시합니다.
+ **Recall upper limit(재현율 상한)**는 실제 일치에 대해 변환이 일치를 예측하는 빈도를 예측치로 표시합니다.
+ **F1**은 0\$11의 범위에서 변환의 정확도를 예측합니다. 여기서 1은 최상의 정확도입니다. 자세한 내용은 Wikipedia의 [F1 점수](https://en.wikipedia.org/wiki/F1_score)를 참조하십시오.
+ [**열 중요도(Column importance)**] 테이블에는 각 열의 열 이름과 중요도 점수가 표시됩니다. 열 중요도는 일치 작업을 수행하는 데 가장 많이 사용되는 레코드의 열을 식별하여 열이 모델에 기여하는 방식을 이해하는 데 도움이 됩니다. 이 데이터는 열 중요도를 높이거나 낮추기 위해 레이블 집합을 추가하거나 변경하라는 메시지를 표시할 수 있습니다.

  중요도 열은 1.0 이하의 십진수로 각 열에 대한 숫자 점수를 제공합니다.

품질 예측과 실제 품질 비교 이해에 대한 자세한 내용은 [품질 예측과 엔드 투 엔드(실제) 품질 비교](#console-machine-learning-quality-estimates-true-quality) 단원을 참조하십시오.

변환 튜닝에 대한 자세한 내용은 [AWS Glue에서 기계 학습 변환 튜닝](add-job-machine-learning-transform-tuning.md) 단원을 참조하십시오.

#### 품질 예측과 엔드 투 엔드(실제) 품질 비교
<a name="console-machine-learning-quality-estimates-true-quality"></a>

AWS Glue에서는 사용자가 일치하는 레이블을 제공했지만 이전에 모델에서는 본 적이 없는 수많은 레코드 페어로 기계 학습된 내부 모델을 제시하여 변환의 품질을 예측합니다. 이러한 품질 예측은 기계 학습된 모델의 품질 함수입니다(변환을 “교육”하기 위해 레이블 지정하는 수많은 레코드의 영향을 받음). 엔드 투 엔드 또는 *실제* 재현율(`ML transform`으로 자동 계산되지 않음)은 있을 수 있는 다양한 일치 항목을 기계 학습된 모델에 제안하는 `ML transform` 필터링 메커니즘의 영향도 받습니다.

주로 **낮은 비용 대비 정확도** 튜닝 값을 사용하여 이 필터링 방법을 튜닝할 수 있습니다. 튜닝 값이 **정확도** 쪽으로 이동할수록 시스템은 일치 항목일 수 있는 레코드 페어에 대해 더 철저하고 비용이 많이 드는 검색을 수행합니다. 더 많은 레코드 페어가 기계 학습된 모델에 공급되며, `ML transform`의 엔드 투 엔드 또는 실제 재현율은 예상된 재현율 지표에 더 가깝게 접근합니다. 그 결과 일치 항목에 대한 비용/정확성 트레이드오프 변화에 따른 일치 항목의 엔드 투 엔드 품질 변화는 일반적으로 품질 예측치에 반영되지 않습니다.

#### Tags
<a name="w2aac37c11c24c23c13b5c13"></a>

 태그는 AWS 리소스에 할당할 수 있는 레이블입니다. 각 태그는 키와 값(선택사항)으로 구성됩니다. 태그를 사용하여 리소스를 검색 및 필터링하거나 AWS 비용을 추적할 수 있습니다.

## 레이블을 사용하여 변환 학습
<a name="console-machine-learning-transforms-teaching-transforms"></a>

 ML 변환 세부 정보 페이지에서 **변환 학습**을 선택하여 레이블(예제)을 사용한 ML 변환을 학습할 수 있습니다. 예제(레이블이라고도 함)를 제공하여 기계 학습 알고리즘을 학습할 때 사용할 기존 레이블을 선택하거나 레이블 지정 파일을 생성할 수 있습니다.

![\[스크린샷은 레이블을 사용한 변환 학습의 마법사 화면을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/machine-learning-teach-transform.png)

+  **레이블 지정** - 레이블이 있는 경우 **레이블 있음**을 선택합니다. 레이블이 없으면 레이블 지정 파일을 생성하는 다음 단계를 계속할 수 있습니다.
+  **레이블 지정 파일 생성** - AWS Glue는 소스 데이터에서 레코드를 추출하고 일치 가능성이 있는 레코드를 제안합니다. 생성된 레이블 파일을 저장할 Amazon S3 버킷을 선택합니다. **레이블 지정 파일 생성**을 선택하여 프로세스를 시작합니다. 완료되면 **레이블 지정 파일 다운로드**를 선택합니다. 다운로드한 파일에는 레이블에 입력할 수 있는 레이블 열이 있습니다.
+  **Amazon S3에서 레이블 업로드** - 레이블 파일이 저장되어 있는 Amazon S3 버킷에서 완성된 레이블 지정 파일을 선택합니다. 그런 다음 기존 레이블에 레이블을 추가하거나 기존 레이블을 덮어쓸지 선택합니다. **Amazon S3에서 레이블 지정 파일 업로드**를 선택합니다.

# 자습서: AWS Glue로 기계 학습 변환 생성
<a name="machine-learning-transform-tutorial"></a>

이 자습서에서는 AWS Glue를 사용하여 ML(기계 학습) 변환을 생성하고 관리하는 작업을 안내합니다. 이 자습서를 사용하기 전에, AWS Glue 콘솔을 사용하여 크롤러 및 작업을 추가하고 스크립트를 편집하는 방법을 숙지해야 합니다. 또한 Amazon Simple Storage Service(Amazon S3) 콘솔에서 파일을 찾고 다운로드하는 방법도 잘 알아야 합니다.

이 예제에서는 `FindMatches` 변환을 만들어 일치하는 레코드를 찾고, 일치 레코드 및 불일치 레코드를 식별하는 방법을 변환에 학습시키고, AWS Glue 작업에 이 변환을 사용해 봅니다. AWS Glue 작업은 `match_id`라는 추가 열을 포함하는 새 Amazon S3 파일을 작성합니다.

이 자습서에서 사용하는 원본 데이터는 `dblp_acm_records.csv`라는 파일입니다. 이 파일은 원래의 [DBLP ACM 데이터 세트](https://doi.org/10.3886/E100843V2)에서 사용 가능한 교육용 게시물(DBLP 및 ACM)을 수정한 버전입니다. `dblp_acm_records.csv` 파일은 BOM(바이트 순서 표시) 없는 UTF-8 형식의 CSV(쉼표로 구분된 값) 파일입니다.

두 번째 파일인 `dblp_acm_labels.csv`는 이 자습서에 따라 변환을 학습시키는 데 사용할 일치 레코드와 불일치 레코드가 둘 다 들어 있는 레이블 지정 예제 파일입니다.

**Topics**
+ [1단계: 소스 데이터 크롤링](#ml-transform-tutorial-crawler)
+ [2단계: 기계 학습 변환 추가](#ml-transform-tutorial-create)
+ [3단계: 기계 학습 변환 학습](#ml-transform-tutorial-teach)
+ [4단계: 기계 학습 변환의 품질 예측](#ml-transform-tutorial-estimate-quality)
+ [5단계: 기계 학습 변환으로 작업 추가 및 실행](#ml-transform-tutorial-add-job)
+ [6단계: Amazon S3의 출력 데이터 확인](#ml-transform-tutorial-data-output)

## 1단계: 소스 데이터 크롤링
<a name="ml-transform-tutorial-crawler"></a>

우선, 원본 Amazon S3 CSV 파일을 크롤링하여 Data Catalog에 그와 상응하는 메타데이터 테이블을 생성합니다.

**중요**  
크롤러가 이 CSV 파일 전용의 테이블을 만들게 하기 위해 CSV 원본 데이터를 나머지 파일과 다른 Amazon S3 폴더에 저장합니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 **크롤러**, **크롤러 추가**를 선택합니다.

1. 마법사를 따라 `demo-db-dblp-acm` 데이터베이스로 출력되는 `demo-crawl-dblp-acm`이라는 크롤러를 만들고 실행합니다. `demo-db-dblp-acm` 데이터베이스가 아직 없으면 이 마법사를 실행하는 동안 만듭니다. 현재 AWS 리전에 있는 샘플 데이터로 이동하는 Amazon S3 포함 경로를 선택합니다. 예를 들어 `us-east-1`의 경우, Amazon S3에서 소스 파일로 이동하는 포함 경로는 `s3://ml-transforms-public-datasets-us-east-1/dblp-acm/records/dblp_acm_records.csv`입니다.

   작업이 성공하면 크롤러가 id, title, authors, venue, year 및 source 열이 있는 `dblp_acm_records_csv` 테이블을 만듭니다.

## 2단계: 기계 학습 변환 추가
<a name="ml-transform-tutorial-create"></a>

다음으로, `demo-crawl-dblp-acm`이라는 크롤러에서 만든 데이터 원본 테이블의 스키마를 토대로 한 기계 학습 변환을 추가합니다.

1. AWS Glue Console의 탐색 창의 **데이터 통합 및 ETL** 아래에서 **데이터 분류 도구 > 레코드 일치**를 선택한 다음 **변환 추가**를 선택합니다. 마법사를 따라 다음 속성으로 `Find matches` 변환을 생성합니다.

   1. **변환 이름**으로 **demo-xform-dblp-acm**을 입력합니다. 이것은 원본 데이터에서 일치 항목을 찾을 때 사용하는 변환의 이름입니다.

   1. **IAM 역할(IAM role)**로는 Amazon S3 원본 데이터, 레이블 지정 파일 및 AWS Glue API 작업에 대한 권한이 있는 IAM 역할을 선택합니다. 자세한 내용은 *AWS Glue Developer Guide*의 [Create an IAM Role for AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)를 참조하세요.

   1. [**데이터 원본(Data source)**]의 경우, 데이터베이스 [**demo-db-dblp-acm**]의 [**dblp\$1acm\$1records\$1csv**]라는 이름의 테이블을 선택합니다.

   1. **기본 키**로는 테이블의 기본 키 열(**id**)을 선택합니다.

1. 마법사에서 **완료**를 선택하고 **ML transforms(ML 변환)** 목록으로 돌아갑니다.

## 3단계: 기계 학습 변환 학습
<a name="ml-transform-tutorial-teach"></a>

이제 자습서의 레이블 지정 샘플 파일을 사용하여 기계 학습 변환을 학습시켜야 합니다.

**Ready for use(사용 준비 완료)** 상태가 되기 전에는 기계어 변환을 ETL(추출, 변환, 로드) 작업에 사용할 수 없습니다. 변환을 준비시키려면 일치 레코드와 불일치 레코드의 예제를 제공하여 일치 및 불일치 레코드를 식별하는 방법을 가르쳐야 합니다. 변환을 학습시키기 위해 **레이블 파일을 생성**하고, 레이블을 추가하고, 그 **레이블 파일을 업로드**할 수 있습니다. 이 자습서에서는 `dblp_acm_labels.csv`라는 레이블 지정 예제 파일을 사용합니다. 레이블 지정 프로세스에 대한 자세한 내용은 [레이블링](machine-learning.md#machine-learning-labeling) 단원을 참조하십시오.

1. AWS Glue Console의 탐색 창에서 **레코드 일치**를 선택합니다.

1. `demo-xform-dblp-acm` 변환을 선택한 다음 **Action(작업)**과 **Teach(학습)**를 선택합니다. 마법사를 따라 `Find matches` 변환을 학습시킵니다.

1. 변환 속성 페이지에서 **I have labels(레이블 있음)**를 선택합니다. 현재 AWS 리전에 있는 샘플 레이블 지정 파일로 이동하는 Amazon S3 경로를 선택합니다. 예를 들어 `us-east-1`의 경우, Amazon S3 경로 `s3://ml-transforms-public-datasets-us-east-1/dblp-acm/labels/dblp_acm_labels.csv`에서 제공한 레이블 지정 파일을 업로드하되 기존 레이블 [**덮어쓰기(overwrite)**] 옵션을 포함합니다. 레이블 지정 파일이 AWS Glue 콘솔과 같은 리전의 Amazon S3에 있어야 합니다.

   레이블 지정 파일을 업로드하면 해당 변환에 데이터 원본 처리 방법을 학습시키는 데 사용할 레이블을 추가하거나 덮어쓰는 작업이 AWS Glue에서 시작됩니다.

1. 마법사의 마지막 페이지에서 **완료**를 선택하고 **ML transforms(ML 변환)** 목록으로 돌아옵니다.

## 4단계: 기계 학습 변환의 품질 예측
<a name="ml-transform-tutorial-estimate-quality"></a>

이제 기계 학습 변환의 품질을 예측할 수 있습니다. 품질은 레이블 지정 작업을 얼마나 많이 했는지에 따라 달라집니다. 품질 예측에 대한 자세한 내용은 [품질 예측](console-machine-learning-transforms.md#console-machine-learning-transforms-metrics) 단원을 참조하십시오.

1. AWS Glue Console의 탐색 창의 **데이터 통합 및 ETL**에서 **데이터 분류 도구 > 레코드 일치**를 선택합니다.

1. `demo-xform-dblp-acm` 변환을 선택하고 **Estimate quality(품질 예측)** 탭을 선택합니다. 해당 변환의 현재 품질이 예측되어 있으면 이 탭에 표시됩니다.

1. **Estimate quality(품질 예측)**를 선택하여 변환의 품질 예측 작업을 시작합니다. 품질 예측의 정확성은 원본 데이터의 레이블 지정에 달려 있습니다.

1. **History(기록)** 탭으로 이동합니다. 이 창에는 **Estimating quality(품질 예측)** 작업을 비롯하여 해당 변환에 실행한 작업이 나열되어 있습니다. 작업 실행에 대한 자세한 내용은 **로그**를 참조하십시오. 완료된 작업의 실행 상태가 **성공**인지 확인합니다.

## 5단계: 기계 학습 변환으로 작업 추가 및 실행
<a name="ml-transform-tutorial-add-job"></a>

이 단계에서는 기계 학습 변환을 사용하여 AWS Glue에서 작업을 추가하고 실행해 봅니다. `demo-xform-dblp-acm` 변환이 **Ready for use(사용 준비 완료)** 상태이면 ETL 작업에 사용할 수 있습니다.

1. AWS Glue 콘솔의 탐색 창에서 **작업**을 선택합니다.

1. **작업 추가**를 선택하고, 마법사의 단계에 따라 생성된 스크립트로 ETL Spark 작업을 만듭니다. 변환에 대해 다음 속성 값을 선택하십시오.

   1. **이름**으로 이 자습서의 예제 작업인 **demo-etl-dblp-acm**을 선택합니다.

   1. [**IAM 역할(IAM role)**]로는 Amazon S3 원본 데이터, 레이블 지정 파일 및 AWS Glue API 작업에 대한 권한이 있는 IAM 역할을 선택합니다. 자세한 내용은 *AWS Glue Developer Guide*의 [Create an IAM Role for AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)를 참조하세요.

   1. **ETL 언어**로 **Scala**를 선택합니다. 이것은 ETL 스크립트의 프로그래밍 언어입니다.

   1. **스크립트 파일 이름**으로 **demo-etl-dblp-acm**을 선택합니다. 이것은 Scala 스크립트의 파일 이름입니다(작업 이름과 동일).

   1. **데이터 원본**으로 **dblp\$1acm\$1records\$1csv**를 선택합니다. 선택한 데이터 원본이 기계 학습 변환의 데이터 원본 스키마와 일치해야 합니다.

   1. **Transform type(변환 유형)**으로 **Find matching records(일치 레코드 찾기)**를 선택하여 기계 학습 변환을 사용하는 작업을 만듭니다.

   1. **Remove duplicate records(중복 레코드 제거)**를 선택 취소합니다. 작성되는 출력 레코드에 `match_id` 필드가 하나 더 추가되므로 중복 레코드를 제거하지 않아도 됩니다.

   1. **변환**으로 이 작업에 사용할 기계 학습 변환인 **demo-xform-dblp-acm**을 선택합니다.

   1. **데이터 대상에서 테이블 생성**에서 다음 속성의 테이블을 만들도록 선택합니다.
      + [**데이터 스토어 유형(Data store type)**] - **Amazon S3**
      + [**포맷(Format)**] - **CSV**
      + [**압축 유형(Compression type)** - **None**
      + [**대상 경로(Target path)**] - 작업의 출력이 쓰이는 Amazon S3 경로(현재 콘솔 AWS 리전에서)

1. **작업 저장 및 스크립트 편집**을 선택하여 스크립트 편집기 페이지를 표시합니다.

1. **대상 경로**에 대한 작업 출력을 파티션 파일 하나에 쓰도록 하는 문을 추가하여 스크립트를 편집합니다. `FindMatches` 변환을 실행하는 문 바로 뒤에 이 문을 추가합니다. 이 문은 다음과 비슷합니다.

   ```
   val single_partition = findmatches1.repartition(1) 
   ```

   출력을 `.writeDynamicFrame(single_partion)`으로 쓰도록 `.writeDynamicFrame(findmatches1)` 문을 수정해야 합니다.

1. 스크립트를 편집한 다음 **저장**을 선택합니다. 수정된 스크립트는 다음 코드와 비슷한 모양이지만 사용자 환경에 맞게 조정되어 있습니다.

   ```
   import com.amazonaws.services.glue.GlueContext
   import com.amazonaws.services.glue.errors.CallSite
   import com.amazonaws.services.glue.ml.FindMatches
   import com.amazonaws.services.glue.util.GlueArgParser
   import com.amazonaws.services.glue.util.Job
   import com.amazonaws.services.glue.util.JsonOptions
   import org.apache.spark.SparkContext
   import scala.collection.JavaConverters._
   
   object GlueApp {
     def main(sysArgs: Array[String]) {
       val spark: SparkContext = new SparkContext()
       val glueContext: GlueContext = new GlueContext(spark)
       // @params: [JOB_NAME]
       val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
       Job.init(args("JOB_NAME"), glueContext, args.asJava)
       // @type: DataSource
       // @args: [database = "demo-db-dblp-acm", table_name = "dblp_acm_records_csv", transformation_ctx = "datasource0"]
       // @return: datasource0
       // @inputs: []
       val datasource0 = glueContext.getCatalogSource(database = "demo-db-dblp-acm", tableName = "dblp_acm_records_csv", redshiftTmpDir = "", transformationContext = "datasource0").getDynamicFrame()
       // @type: FindMatches
       // @args: [transformId = "tfm-123456789012", emitFusion = false, survivorComparisonField = "<primary_id>", transformation_ctx = "findmatches1"]
       // @return: findmatches1
       // @inputs: [frame = datasource0]
       val findmatches1 = FindMatches.apply(frame = datasource0, transformId = "tfm-123456789012", transformationContext = "findmatches1", computeMatchConfidenceScores = true)
     
     
       // Repartition the previous DynamicFrame into a single partition. 
       val single_partition = findmatches1.repartition(1)    
    
       
       // @type: DataSink
       // @args: [connection_type = "s3", connection_options = {"path": "s3://aws-glue-ml-transforms-data/sal"}, format = "csv", transformation_ctx = "datasink2"]
       // @return: datasink2
       // @inputs: [frame = findmatches1]
       val datasink2 = glueContext.getSinkWithFormat(connectionType = "s3", options = JsonOptions("""{"path": "s3://aws-glue-ml-transforms-data/sal"}"""), transformationContext = "datasink2", format = "csv").writeDynamicFrame(single_partition)
       Job.commit()
     }
   }
   ```

1. **작업 실행**을 선택하여 작업을 실행하기 시작합니다. 작업 목록에서 작업의 상태를 확인합니다. 작업이 완료되면 **ML transform(ML 변환)**의 **History(기록)** 탭에 새로운 **실행 ID** 행이 **ETL 작업** 유형으로 추가됩니다.

1. **작업**, **History(기록)** 탭으로 이동합니다. 이 창에는 작업 실행이 나열되어 있습니다. 작업 실행에 대한 자세한 내용은 **로그**를 참조하십시오. 완료된 작업의 실행 상태가 **성공**인지 확인합니다.

## 6단계: Amazon S3의 출력 데이터 확인
<a name="ml-transform-tutorial-data-output"></a>

이 단계에서는 작업을 추가할 때 선택한 Amazon S3 버킷에서 작업 실행의 출력을 확인합니다. 출력 파일을 로컬 시스템에 다운로드하고, 일치하는 레코드가 식별되었는지 확인할 수 있습니다.

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. `demo-etl-dblp-acm` 작업의 대상 출력 파일을 다운로드합니다. 해당 파일을 스프레드시트 애플리케이션에서 엽니다. (파일을 제대로 열려면 파일 확장명 `.csv`를 추가해야 할 수 있음)

   아래 그림은 Microsoft Excel의 출력을 발췌한 것입니다.  
![\[변환의 출력이 표시된 Excel 스프레드시트\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/demo_output_dblp_acm.png)

   데이터 원본과 대상 파일 모두 레코드가 4,911개 있습니다. 그러나 `Find matches` 변환은 출력에서 일치하는 레코드를 식별하기 위해 `match_id`라는 열을 하나 더 추가합니다. `match_id`가 동일한 행은 일치하는 레코드로 간주됩니다. `match_confidence_score`는 `Find matches`에서 찾은 일치 항목의 품질을 추정하는, 0에서 1 사이의 숫자입니다.

1. 일치하는 레코드를 보기 쉽도록 출력 파일을 `match_id`로 정렬합니다. 나머지 열의 값을 비교하여 `Find matches` 변환의 결과에 동의할 만한지 알아봅니다. 동의할 수 없으면 계속해서 레이블을 더 추가하여 변환을 학습시킬 수 있습니다.

   또한 `title` 등 다른 필드를 기준으로 파일을 정렬하여 제목이 비슷한 레코드의 `match_id`가 동일한지 확인할 수도 있습니다.

# 증분 일치 항목 찾기
<a name="machine-learning-incremental-matches"></a>

일치 항목 찾기 기능을 사용하면 레코드에 공통된 고유 식별자가 없고 정확히 일치하는 필드가 없는 경우에도 데이터 집합에서 중복 레코드나 일치 레코드를 식별할 수 있습니다. 일치 항목 찾기 변환의 초기 릴리스에서는 단일 데이터 집합 내의 일치 레코드를 식별했습니다. 데이터 집합에 새 데이터를 추가하는 경우 정리된 기존 데이터 집합과 병합하고 병합된 전체 데이터 집합에 대해 일치를 다시 실행해야 했습니다.

증분 일치 기능을 사용하면 기존 일치 데이터 집합과 증분 레코드를 더 간단하게 일치시킬 수 있습니다. 기존 고객 데이터 집합과 잠재 고객 데이터를 일치시키려는 경우를 가정합니다. 증분 일치 기능을 사용하면 결과를 단일 데이터베이스나 테이블에 병합하여 잠재 고객 및 고객의 기존 데이터베이스와 수십만 명의 신규 잠재 고객을 유연성 있게 일치시킬 수 있습니다. 증분 일치 항목 찾기 최적화는 새 데이터 집합과 기존 데이터 집합 간에만 일치시켜 계산 시간을 단축하므로 비용도 절감됩니다.

증분 일치 사용법은 [자습서: AWS Glue로 기계 학습 변환 생성](machine-learning-transform-tutorial.md)에 설명된 일치 항목 찾기와 유사합니다. 이 주제에서는 증분 일치와의 차이점만 설명합니다.

자세한 내용은 [증분 데이터 일치](https://aws.amazon.com/blogs/big-data/incremental-data-matching-using-aws-lake-formation/)에 대한 블로그 게시물을 참조하세요.

## 증분 일치 작업 실행
<a name="machine-learning-incremental-matches-add"></a>

다음 절차에서는 다음과 같이 가정합니다.
+ 기존 데이터 세트를 *first\$1records* 테이블로 크롤링했습니다. *first\$1records* 데이터 세트는 일치하는 데이터 세트이거나 일치하는 작업의 출력이어야 합니다.
+ AWS Glue 버전 2.0을 사용하여 일치 항목 찾기 변환을 생성하고 훈련시켰습니다. 증분 일치는 이 버전의 AWS Glue에서만 지원됩니다.
+ ETL 언어는 Scala입니다. Python도 지원됩니다.
+ `demo-xform`이라는 모델이 이미 생성되어 있습니다.

1. 증분 데이터 집합을 *second\$1records* 테이블로 크롤링합니다.

1. AWS Glue 콘솔의 탐색 창에서 **작업**을 선택합니다.

1. **작업 추가**를 선택하고, 마법사의 단계에 따라 생성된 스크립트로 ETL Spark 작업을 만듭니다. 변환에 대해 다음 속성 값을 선택하십시오.

   1. **이름(Name)**에서 **demo-etl**을 선택합니다.

   1. **IAM 역할(IAM role)**에서 Amazon S3 소스 데이터, 레이블 지정 파일, [AWS Glue API 작업](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)에 대한 권한이 있는 IAM 역할을 선택합니다.

   1. **ETL 언어**로 **Scala**를 선택합니다.

   1. **스크립트 파일 이름(Script file name)**에서 **demo-etl**을 선택합니다. Scala 스크립트의 파일 이름입니다.

   1. **데이터 원본(Data source)**에서 **first\$1records**를 선택합니다. 선택한 데이터 원본이 기계 학습 변환의 데이터 원본 스키마와 일치해야 합니다.

   1. **Transform type(변환 유형)**으로 **Find matching records(일치 레코드 찾기)**를 선택하여 기계 학습 변환을 사용하는 작업을 만듭니다.

   1. 증분 일치 옵션을 선택하고 **데이터 원본(Data Source)**에서 **second\$1records**라는 테이블을 선택합니다.

   1. **변환(Transform)**에서 이 작업에 사용할 기계 학습 변환인 **demo-xform**을 선택합니다.

   1. **데이터 대상에 테이블 생성(Create tables in your data target)** 또는 **데이터 카탈로그 내 테이블 사용 및 데이터 대상 업데이트(Use tables in the data catalog and update your data target)**를 선택합니다.

1. **작업 저장 및 스크립트 편집**을 선택하여 스크립트 편집기 페이지를 표시합니다.

1. **작업 실행**을 선택하여 작업을 실행하기 시작합니다.

# 시각적 작업에서 FindMatches 사용
<a name="find-matches-visual-job"></a>

 AWS Glue Studio에서 **FindMatches** 변환을 사용하려면 FindMatches API를 간접 호출하는 **사용자 지정 변환** 노드를 사용하면 됩니다. 사용자 지정 변환을 사용하는 방법에 대한 자세한 내용은 [사용자 지정 변환 생성](https://docs.aws.amazon.com/glue/latest/ug/transforms-custom.html)을 참조하세요.

**참고**  
 현재 FindMatches API는 `Glue 2.0`에서만 작동합니다. FindMatches API를 간접 호출하는 사용자 지정 변환을 포함하는 작업을 실행하려면 AWS Glue 버전이 **작업 세부 정보** 탭에서 `Glue 2.0`인지 확인합니다. AWS Glue의 버전이 `Glue 2.0`이 아닌 경우 작업이 런타임에 실패하고 'cannot import name 'FindMatches' from 'awsglueml.transforms' 오류 메시지가 표시됩니다.

## 사전 조건
<a name="adding-find-matches-to-a-visual-job-prerequisites"></a>
+  **일치 항목 찾기** 변환을 사용하려면 [https://console.aws.amazon.com/gluestudio/](https://console.aws.amazon.com/gluestudio/)에서 AWS Glue Studio 콘솔을 엽니다.
+  기계 학습 변환을 생성합니다. 생성되면 transformId가 생성됩니다. 아래 단계를 수행하려면 이 ID가 필요합니다. 기계 학습 변환을 생성하는 방법에 대한 자세한 내용은 [기계 학습 변환 추가 및 편집](https://docs.aws.amazon.com/glue/latest/dg/console-machine-learning-transforms.html#console-machine-learning-transforms-actions)을 참조하세요.

## FindMatches 변환 추가
<a name="adding-find-matches-to-a-visual-job"></a>

**FindMatches 변환을 추가하려면:**

1.  AWS Glue Studio 작업 편집기에서 시각적 작업 그래프의 왼쪽 상단에 있는 십자 기호를 클릭하여 리소스 패널을 열고 **데이터 탭**을 선택하여 데이터 소스를 선택합니다. 이는 일치하는지 확인하려는 데이터 소스입니다.  
![\[스크린샷은 원 안의 십자 기호를 보여줍니다. 시각적 작업 편집기에서 이 아이콘을 클릭하면 리소스 패널이 열립니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/resource-panel-blank-canvas.png)

1.  데이터 소스 노드를 선택한 다음 시각적 작업 그래프의 왼쪽 상단에 있는 십자 기호를 클릭하여 리소스 패널을 열고 '사용자 지정 변환'을 검색합니다. **사용자 지정 변환** 노드를 선택하여 그래프에 추가합니다. **사용자 지정 변환**이 데이터 소스 노드에 링크됩니다. 링크되지 않은 경우 **사용자 지정 변환** 노드를 클릭하고 **노드 속성** 탭을 선택한 다음 **노드 상위** 아래에서 데이터 소스를 선택할 수 있습니다.

1.  시각적 그래프에서 **사용자 지정 변환** 노드를 클릭한 다음 **노드 속성** 탭을 선택하고 사용자 지정 변환의 이름을 지정합니다. 시각적 그래프에서 변환 이름을 쉽게 식별할 수 있도록 변환의 이름을 바꾸는 것이 좋습니다.

1.  **변환** 탭을 선택합니다. 여기에서 코드 블록을 편집할 수 있습니다. 여기에서 FindMatches API를 간접 호출하는 코드를 추가할 수 있습니다.  
![\[스크린샷은 사용자 지정 변환 노드를 선택할 때 변환 탭에 있는 코드 블록을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/custom-transform-code-block.png)

    코드 블록에는 미리 채워진 코드가 포함되어 있어 시작하는 데 도움이 됩니다. 미리 채워진 코드를 아래 템플릿으로 덮어씁니다. 템플릿에는 사용자가 제공할 수 있는 **transformId**의 자리 표시자가 있습니다.

   ```
   def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
       dynf = dfc.select(list(dfc.keys())[0])
       from awsglueml.transforms import FindMatches
       findmatches = FindMatches.apply(frame = dynf, transformId = "<your id>")
       return(DynamicFrameCollection({"FindMatches": findmatches}, glueContext))
   ```

1.  시각적 그래프에서 **사용자 지정 변환** 노드를 클릭하고 시각적 작업 그래프의 왼쪽 상단에 있는 십자 기호를 클릭하여 리소스 패널을 연 후 '컬렉션에서 선택'을 검색합니다. 컬렉션에는 DynamicFrame 하나만 있으므로 기본 선택을 변경할 필요가 없습니다.

1.  계속해서 변환을 추가하거나 결과를 저장할 수 있습니다. 이제 일치 항목 찾기와 같은 추가된 열로 보강되었습니다. 다운스트림 변환에서 이러한 새 열을 참조하려면 변환 출력 스키마에 해당 열을 추가해야 합니다. 가장 쉬운 방법은 **데이터 미리 보기** 탭을 선택한 다음 스키마 탭에서 '데이터 미리보기 스키마 사용'을 선택하는 것입니다.

1.  FindMatches를 사용자 지정하려면 'apply' 메서드에 전달할 추가 파라미터를 추가할 수 있습니다. [FindMatches 클래스](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-findmatches.html)를 참조하세요.

## FindMatches 증분 변환 추가
<a name="find-matches-incrementally-visual-job"></a>

 증분 일치의 경우 프로세스는 다음 차이점을 제외하고 **FindMatches 변환 추가**와 동일합니다.
+  사용자 지정 변환의 상위 노드 대신, 두 개의 상위 노드가 필요합니다.
+  첫 번째 상위 노드는 데이터 세트여야 합니다.
+  두 번째 상위 노드는 증분 데이터 세트여야 합니다.

   템플릿 코드 블록에서 `transformId`를 사용자의 `transformId`로 바꿉니다.

  ```
  def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
      dfs = list(dfc.values())
      dynf = dfs[0]
      inc_dynf = dfs[1]
      from awsglueml.transforms import FindIncrementalMatches
      findmatches = FindIncrementalMatches.apply(existingFrame = dynf, incrementalFrame = inc_dynf,
                                      transformId = "<your id>")
      return(DynamicFrameCollection({"FindMatches": findmatches}, glueContext))
  ```
+  선택적 파라미터는 [FindIncrementalMatches 클래스](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-findincrementalmatches.html)를 참조하세요.

# Apache Spark 프로그램을 AWS Glue로 마이그레이션
<a name="glue-author-migrate-apache-spark"></a>

Apache Spark는 대규모 데이터 세트에서 수행되는 분산 컴퓨팅 워크로드를 위한 오픈 소스 플랫폼입니다. AWS Glue에서는 Spark의 기능을 활용하여 ETL에 최적화된 환경을 제공합니다. Spark 프로그램을 AWS Glue로 마이그레이션하여 기능을 활용할 수 있습니다. AWS Glue에서는 Amazon EMR의 Apache Spark에서 기대하는 것과 동일한 성능 향상을 제공합니다.

## Spark 코드 실행
<a name="glue-author-migrate-apache-spark-run"></a>

기본 Spark 코드는 기본 제공 AWS Glue 환경에서 실행될 수 있습니다. 스크립트는 대화형 세션에 적합한 워크플로우인 코드를 반복적으로 변경하여 개발되는 경우가 많습니다. 그러나 기존 코드는 AWS Glue 작업에서 실행되기에 더 적합하며 이를 통해 각 스크립트 실행에 대한 로그와 지표를 예약하고 일관되게 가져올 수 있습니다. 콘솔을 통해 기존 스크립트를 업로드하고 편집할 수 있습니다.

1. 스크립트의 소스를 확보합니다. 이 예에서는 Apache Spark 리포지토리의 스크립트 예를 사용합니다. [이진화 메서드 예](https://github.com/apache/spark/blob/master/examples/src/main/python/ml/binarizer_example.py) 

1. AWS Glue 콘솔에서 왼쪽 탐색 창을 확장하고 **ETL** > **작업(Jobs)**을 선택합니다.

   **작업 생성(Create job)** 패널에서 **Spark 스크립트 편집기(Spark script editor)**를 선택합니다. **옵션(Options)** 섹션이 나타납니다. **옵션(Options)**에서 **기존 스크립트 업로드 및 편집(Upload and edit an existing script)**을 선택합니다.

   **파일 업로드(File upload)** 섹션이 나타납니다. **파일 업로드(File upload)**에서 **파일 선택(Choose file)**을 클릭합니다. 시스템 파일 선택기가 나타납니다. `binarizer_example.py`를 저장한 위치로 이동하여 선택하고 선택을 확인합니다.

   **생성(Create)** 버튼이 **작업 생성(Create job)** 패널의 머리글에 나타납니다. 이 버튼을 클릭합니다.  
![\[Spark 스크립트 편집기 창이 선택된 AWS Glue Studio 작업 페이지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/migrate-apache-spark-01-upload-job.png)

1. 브라우저가 스크립트 편집기로 이동합니다. 머리글에서 **Job 세부 정보(Job details)** 탭을 클릭합니다. **이름** 및 **IAM 역할**을 설정합니다. AWS Glue IAM 역할에 대한 지침은 [AWS Glue에 대한 IAM 권한 설정](set-up-iam.md) 섹션을 참조하세요.

   옵션 사항 - **요청된 작업자 수(Requested number of workers)**를 `2`로, **재시도 횟수(Number of retries)**를 `1`로 설정합니다. 이러한 옵션은 프로덕션 작업을 실행할 때 유용하지만 이 옵션을 끄면 기능을 테스트하는 동안 사용 환경이 간소화됩니다.

   제목 표시줄에서 **저장(Save)**을 클릭한 다음 **실행(Run)**을 클릭합니다.  
![\[지침에 따라 옵션이 설정된 작업 세부 정보 페이지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/migrate-apache-spark-02-job-details.png)

1. **실행(Runs)** 탭으로 이동합니다. 작업 실행에 해당하는 패널이 표시됩니다. 몇 분간 기다리면 페이지가 자동으로 새로 고침되어 **실행 상태(Run status)** 아래에 **성공(Succeeded)**이라고 표시됩니다.  
![\[성공적인 작업 실행이 포함된 작업 실행 페이지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/migrate-apache-spark-03-job-runs.png)

1. 출력을 검사하여 Spark 스크립트가 의도한 대로 실행되었는지 확인하려고 합니다. 이 Apache Spark 샘플 스크립트는 출력 스트림에 문자열을 기록해야 합니다. 성공적인 작업 실행에 대한 패널의 **Cloudwatch 로그(Cloudwatch logs)**에서 **출력 로그(Output logs)**로 이동하면 해당 문자열이 표시됩니다. `jr_`로 시작하는 **ID** 레이블에서 생성된 ID인 작업 실행 ID를 기록해 둡니다.

   그러면 CloudWatch 콘솔이 열리고 작업 실행 ID에 대한 로그 스트림의 내용으로 필터링된 기본 AWS Glue 로그 그룹 `/aws-glue/jobs/output`의 내용을 시각화하도록 설정됩니다. 각 작업자는 **로그 스트림(Log streams)** 아래 행으로 표시된 로그 스트림을 생성하게 됩니다. 한 작업자가 요청된 코드를 실행했어야 합니다. 올바른 작업자를 식별하려면 모든 로그 스트림을 열어야 합니다. 적합한 작업자를 찾으면 다음 이미지에 표시된 것과 같이 스크립트의 출력이 표시되어야 합니다.  
![\[Spark 프로그램 출력이 있는 CloudWatch 콘솔 페이지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/migrate-apache-spark-04-log-output.png)

## Spark 프로그램을 마이그레이션하는 데 필요한 일반적인 절차
<a name="glue-author-migrate-apache-spark-migrate"></a>

### Spark 버전 지원 평가
<a name="glue-author-migrate-apache-spark-migrate-versions"></a>

 AWS Glue 릴리즈 버전에 따라 AWS Glue 작업에 사용할 수 있는 Apache Spark와 Python의 버전이 정해집니다. AWS Glue 버전 및 [AWS Glue 버전](release-notes.md#release-notes-versions)의 지원 대상을 찾을 수 있습니다. 특정 AWS Glue 기능에 액세스하려면 최신 버전의 Spark와 호환되도록 Spark 프로그램을 업데이트해야 할 수 있습니다.

### 타사 라이브러리 포함
<a name="glue-author-migrate-apache-spark-third-party-libraries"></a>

기존의 많은 Spark 프로그램에는 프라이빗 및 퍼블릭 아티팩트 모두에 대한 종속성이 있습니다. AWS Glue에서는 Scala 작업에 대한 JAR 스타일 종속성뿐만 아니라 Python 작업에 대한 휠 및 소스 퓨어-Python 종속성을 지원합니다.

**Python** - Python 종속성에 대한 자세한 정보는 [AWS Glue와 함께 Python 라이브러리 사용](aws-glue-programming-python-libraries.md) 섹션을 참조하세요.

공통 Python 종속성은 일반적으로 요청되는 [Pandas](https://pandas.pydata.org/) 라이브러리를 포함한 AWS Glue 환경에서 제공됩니다. 종속성은 AWS Glue 버전 2.0\$1에 포함되어 있습니다. 제공된 모듈에 대한 자세한 내용을 알아보려면 [AWS Glue에서 이미 제공되는 Python 모듈](aws-glue-programming-python-libraries.md#glue-modules-provided) 섹션을 참조하세요. 기본적으로 포함된 다른 버전의 종속성을 가진 작업을 제공해야 하는 경우 `--additional-python-modules`를 사용할 수 있습니다. 작업 인수에 대한 자세한 정보는 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 섹션을 참조하세요.

`--extra-py-files` 작업 인수를 추가 Python 종속성에 제공할 수 있습니다. Spark 프로그램에서 작업을 마이그레이션하는 경우 이 파라미터는 PySpark의 `--py-files` 플래그와 기능적으로 동일하고 동일한 제한이 적용되므로 좋은 옵션입니다. `--extra-py-files` 파라미터에 대한 자세한 내용을 알아보려면 [PySpark 네이티브 기능으로 Python 파일 포함](aws-glue-programming-python-libraries.md#extra-py-files-support) 섹션을 참조하세요.

새 작업의 경우 `--additional-python-modules` 작업 인수를 사용하여 Python 종속성을 관리할 수 있습니다. 이 인수를 사용하면 종속성 관리를 보다 철저하게 수행할 수 있습니다. 이 파라미터는 Amazon Linux 2와 호환되는 기본 코드 바인딩이 있는 종속성을 포함하여 Wheel 스타일 종속성을 지원합니다.

**Scala**

`--extra-jars` 작업 인수를 추가 Scala 종속성에 제공할 수 있습니다. 종속성은 Amazon S3에서 호스팅되어야 하며, 인수 값은 공백 없이 쉼표로 구분된 Amazon S3 경로 목록이어야 합니다. 종속성을 호스팅하고 구성하기 전에 다시 번들링하여 구성을 관리하는 것이 더 쉬울 수 있습니다. AWS Glue JAR 종속성에는 모든 JVM 언어에서 생성될 수 있는 Java 바이트 코드가 포함됩니다. Java와 같은 다른 JVM 언어를 사용하여 사용자 정의 종속성을 작성할 수 있습니다.

### 데이터 소스 자격 증명 관리
<a name="glue-author-migrate-apache-spark-credential-management"></a>

기존 Spark 프로그램에는 데이터 소스에서 데이터를 가져오기 위한 복잡한 구성 또는 사용자 정의 구성이 제공될 수 있습니다. 일반적인 데이터 소스 인증 흐름은 AWS Glue 연결에서 지원됩니다. AWS Glue 연결에 대한 자세한 정보는 [데이터에 연결](glue-connections.md) 섹션을 참조하세요.

AWS Glue 연결은 라이브러리에 대한 메서드 호출 및 AWS 콘솔에서 **추가 네트워크 연결(Additional network connection)** 설정과 같은 두 가지 기본 방법으로 작업을 다양한 유형의 데이터 저장소에 쉽게 연결할 수 있도록 합니다. 작업 내에서 AWS SDK를 호출하여 연결에서 정보를 검색할 수도 있습니다.

 **메서드 호출(Method calls)** – AWS Glue 연결은 데이터 세트 에 대한 정보를 큐레이팅할 수 있는 서비스인 AWS Glue Data Catalog와 밀접히 통합되며, AWS Glue 연결과 상호 작용할 수 있는 메서드가 그것을 반영합니다. 재사용하려는 기존 인증 구성이 있으면 JDBC 연결의 경우 `GlueContext`의 `extract_jdbc_conf` 메서드를 통해 AWS Glue 연결 구성에 액세스할 수 있습니다. 자세한 정보는 [extract\$1jdbc\$1conf](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-extract_jdbc_conf) 섹션을 참조하세요.

**콘솔 구성(Console configuration)** – AWS Glue 작업은 관련된 AWS Glue 연결을 사용하여 Amazon VPC 서브넷에 대한 연결을 구성할 수 있습니다. 보안 자료를 직접 관리하는 경우 라우팅을 구성하는 AWS 콘솔에서 `NETWORK` 유형의 **추가 네트워크 연결(Additional network connection)**을 제공해야 할 수 있습니다. AWS Glue 연결에 대한 자세한 정보는 [연결 API](aws-glue-api-catalog-connections.md) 섹션을 참조하세요.

Spark 프로그램에 사용자 지정 또는 일반적이지 않은 인증 흐름이 있는 경우 보안 자료를 직접 관리해야 할 수 있습니다. AWS Glue 연결이 적합하지 않은 것 같은 경우 Secrets Manager에서 보안 자료를 안전하게 호스팅하고 작업에서 제공되는 boto3 또는 AWS SDK를 통해 해당 자료에 액세스 할 수 있습니다.

### Apache Spark 구성
<a name="glue-author-migrate-apache-spark-spark-configuration"></a>

복잡한 마이그레이션은 Spark 구성을 변경하여 워크로드를 수용하는 경우가 많습니다. 최신 버전의 Apache Spark를 사용하면 런타임 구성을 `SparkSession`으로 설정할 수 있습니다. AWS Glue 3.0\$1 작업에 런타임 구성을 설정하기 위해 수정할 수 있는 `SparkSession`이 제공됩니다. [Apache Spark 구성](https://spark.apache.org/docs/latest/configuration.html). Spark 튜닝은 복잡하고, AWS Glue에서 모든 Spark 구성 설정에 대한 지원을 보장하지는 않습니다. 마이그레이션에 상당한 Spark 수준의 구성이 필요한 경우 지원 팀에 문의하세요.

### 사용자 지정 구성 설정
<a name="glue-author-migrate-apache-spark-custom-configuration"></a>

마이그레이션된 Spark 프로그램은 사용자 지정 구성을 사용하도록 설계될 수 있습니다. AWS Glue에서는 작업 인수를 통해 작업 및 작업 실행 수준에서 구성을 설정할 수 있습니다. 작업 인수에 대한 자세한 정보는 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 섹션을 참조하세요. 라이브러리를 통해 작업 컨텍스트 내에서 작업 인수에 액세스할 수 있습니다. AWS Glue에서는 유틸리티 함수를 제공하여 작업에 설정된 인수와 작업 실행 시 설정된 인수 간에 일관된 보기를 유지합니다. Python의 [`getResolvedOptions`를 사용한 파라미터 액세스](aws-glue-api-crawler-pyspark-extensions-get-resolved-options.md) 섹션 및 Scala의 [AWS Glue Scala GlueArgParser API](glue-etl-scala-apis-glue-util-glueargparser.md) 섹션을 참조하세요.

### Java 코드 마이그레이션
<a name="glue-author-migrate-apache-spark-java-code"></a>

[타사 라이브러리 포함](#glue-author-migrate-apache-spark-third-party-libraries)에서 설명한 대로 종속성에는 Java 또는 Scala와 같은 JVM 언어로 생성된 클래스가 포함될 수 있습니다. 종속성에는 `main` 메서드가 포함될 수 있습니다. 종속성의 `main` 메소드를 AWS Glue Scala 작업에 대한 진입점으로 사용할 수 있습니다. 이를 통해 Java의 `main` 메서드를 작성하거나 자체 라이브러리 표준에 맞게 패키징된 `main` 메서드를 재사용할 수 있습니다.

종속성에서 `main` 메서드를 사용하려면 다음을 수행합니다. 기본 `GlueApp` 객체를 제공하는 편집 창의 내용을 삭제합니다. 종속성에 있는 클래스의 정규화된 이름을 키 `--class`를 통해 작업 인수로 제공합니다. 그러면 작업 실행을 트리거할 수 있습니다.

인수 AWS Glue의 순서나 구조가 `main` 메서드에 전달되도록 구성할 수 없습니다. 기존 코드에서 AWS Glue에 설정된 구성을 읽어야 하는 경우 이전 코드와 호환되지 않을 수 있습니다. `getResolvedOptions`를 사용하는 경우 이 메소드를 호출하기에 적합한 장소도 없을 것입니다. AWS Glue에 의해 생성된 기본 메서드에서 직접 종속성을 호출하는 것이 좋습니다. 이에 대한 예는 다음 AWS Glue ETL 스트립트에 표시됩니다.

```
import com.amazonaws.services.glue.util.GlueArgParser

object GlueApp {
  def main(sysArgs: Array[String]) {
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    
    // Invoke static method from JAR. Pass some sample arguments as a String[], one defined inline and one taken from the job arguments, using getResolvedOptions
    com.mycompany.myproject.MyClass.myStaticPublicMethod(Array("string parameter1", args("JOB_NAME")))
    
    // Alternatively, invoke a non-static public method.
    (new com.mycompany.myproject.MyClass).someMethod()
  }
}
```

# AWS Glue에서 Ray 작업 사용
<a name="ray-jobs-section"></a>

**중요**  
AWS Glue for Ray는 2026년 4월 30일부터 신규 고객에게 더 이상 공개되지 않습니다. AWS Glue for Ray를 사용하려면 해당 날짜 이전에 가입하세요. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. AWS Glue for Ray와 유사한 기능의 경우 Amazon EKS를 살펴보세요. 자세한 내용은 [AWS Glue for Ray 지원 종료](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)를 참조하세요.

이 섹션에서는 AWS Glue for Ray 작업 사용에 대한 정보를 제공합니다. AWS Glue for Ray 스크립트 작성에 대한 자세한 내용은 [Ray 스크립트 프로그래밍](aws-glue-programming-ray.md) 섹션을 참조하세요.

**Topics**
+ [AWS Glue for Ray 시작하기](#author-job-ray-using)
+ [지원되는 Ray 런타임 환경](#author-job-ray-runtimes)
+ [Ray 작업에서 작업자 고려](#author-job-ray-worker-accounting)
+ [Ray 작업에서 작업 파라미터 사용](author-job-ray-job-parameters.md)
+ [지표를 통한 Ray 작업 모니터링](author-job-ray-monitor.md)

## AWS Glue for Ray 시작하기
<a name="author-job-ray-using"></a>

AWS Glue for Ray를 사용하려면 AWS Glue for Spark를 사용할 때와 동일한 AWS Glue 작업 및 대화형 세션을 사용합니다. AWS Glue 작업은 동일한 스크립트를 반복적으로 실행하도록 설계된 반면, 대화형 세션은 프로비저닝된 동일한 리소스에 대해 순차적으로 코드 조각을 실행할 수 있도록 설계되었습니다.

AWS Glue ETL과 Ray는 기본적으로 다르므로 스크립트에서 다른 도구, 기능 및 구성에 액세스할 수 있습니다. AWS Glue에서 관리하는 새로운 계산 프레임워크인 Ray는 아키텍처가 다르며 해당 기능을 설명하기 위해 다양한 어휘를 사용합니다. 자세한 내용은 Ray 설명서의 [아키텍처 백서](https://docs.ray.io/en/latest/ray-contribute/whitepaper.html)를 참조하세요.

**참고**  
AWS Glue for Ray는 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오레곤), 아시아 태평양(도쿄), 유럽(아일랜드)에서 사용 가능합니다.

### AWS Glue Studio 콘솔에서 Ray 작업
<a name="author-job-ray-using-console"></a>

AWS Glue Studio에서 작업을 생성할 때 AWS Glue Studio 콘솔의 **작업** 페이지에서 새 옵션(**Ray 스크립트 편집기**)을 선택할 수 있습니다. 콘솔에서 Ray 작업을 생성하려면 이 옵션을 선택합니다. 작업에 대한 자세한 내용과 사용 방법은 [Visual ETL 작업 구축](author-job-glue.md) 섹션을 참조하세요.

![\[Ray 스크립트 편집기 옵션이 선택된 AWS Glue Studio의 작업 페이지입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/ray_job_setup.png)


### AWS CLI 및 SDK에서 Ray 작업
<a name="author-job-ray-using-cli"></a>

AWS CLI에서 Ray 작업은 다른 작업과 동일한 SDK 작업 및 파라미터를 사용합니다. AWS Glue for Ray에는 특정 파라미터에 대한 새로운 값이 도입되었습니다. 작업 API에 대한 자세한 내용은 [작업](aws-glue-api-jobs-job.md) 섹션을 참조하세요.

## 지원되는 Ray 런타임 환경
<a name="author-job-ray-runtimes"></a>

Spark 작업에서는 `GlueVersion`에서 AWS Glue for Spark 작업에 대해 사용할 수 있는 Apache Spark 및 Python 버전을 결정합니다. Python의 버전으로 Spark 유형의 작업에 대해 지원되는 버전을 확인할 수 있습니다. Ray 런타임 환경은 이렇게 구성되지 않습니다.

Ray 작업의 경우 `GlueVersion`을 `4.0` 이상으로 설정해야 합니다. 하지만 Ray 작업에서 사용할 수 있는 Ray, Python 및 추가 라이브러리 버전은 작업 정의의 `Runtime` 필드에 의해 결정됩니다.

`Ray2.4` 런타임 환경은 출시 후 최소 6개월 동안 사용할 수 있습니다. Ray가 빠르게 진화함에 따라 향후 런타임 환경 릴리스를 통해 Ray 업데이트 및 개선 사항을 통합할 수 있습니다.

유효한 값: `Ray2.4`


| 런타임 값 | Ray 및 Python 버전 | 
| --- | --- | 
| Ray2.4(AWS Glue 4.0 이상) |  Ray 2.4.0 Python 3.9  | 

**추가 정보**
+ Ray 릴리스에서 AWS Glue를 함께 제공하는 릴리스 정보는 [AWS Glue 버전](release-notes.md#release-notes-versions) 섹션을 참조하세요.
+ 런타임 환경에서 제공되는 Python 라이브러리는 [Ray 작업과 함께 제공되는 모듈](edit-script-ray-env-dependencies.md#edit-script-ray-modules-provided) 섹션을 참조하세요.

## Ray 작업에서 작업자 고려
<a name="author-job-ray-worker-accounting"></a>

AWS Glue에서는 새로운 Graviton 기반 EC2 작업자 유형(Ray 작업에만 사용 가능)에서 Ray 작업을 실행합니다. Ray의 설계 목표였던 워크로드에 맞게 이러한 작업자를 적절하게 프로비저닝하기 위해 대부분의 작업자와는 다른 비율로, 메모리 리소스에 대한 컴퓨팅 리소스를 제공합니다. 이러한 리소스를 고려하기 위해 표준 데이터 처리 장치(DPU) 대신, 메모리에 최적화된 데이터 처리 장치(M-DPU)를 사용합니다.
+ 1개의 M-DPU는 vCPU 4개와 32GB의 메모리에 해당합니다.
+ 1개의 DPU가 vCPU 4개와 16GB 메모리에 해당합니다. AWS Glue에서 Spark 작업 및 해당 작업자로 리소스를 처리하려는 경우 DPU가 사용됩니다.

Ray 작업은 현재 하나의 작업자 유형(`Z.2X`)에 액세스할 수 있습니다. `Z.2X` 작업자는 2개의 M-DPU(vCPU 8개, 메모리 64GB)에 매핑되며 128GB의 디스크 공간을 보유합니다. `Z.2X` 시스템은 8개의 Ray 작업자(vCPU당 한 개)를 제공합니다.

계정에서 동시에 사용할 수 있는 M-DPU 수에는 서비스 할당량이 적용됩니다. AWS Glue 계정 제한에 대한 자세한 내용은 [AWS Glue 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/glue.html)을 참조하세요.

작업 정의에서 `--number-of-workers (NumberOfWorkers)`를 사용하여 Ray 작업에 사용할 수 있는 워커 노드 수를 지정합니다. 작업 API에서 Ray 값에 대한 자세한 내용은 [작업](aws-glue-api-jobs-job.md) 섹션을 참조하세요.

`--min-workers` 작업 파라미터를 사용하여 Ray 작업에서 할당해야 하는 최소 작업자 수를 추가로 지정할 수 있습니다. 작업 파라미터에 대한 자세한 내용을 알아보려면 [레퍼런스](author-job-ray-job-parameters.md#author-job-ray-parameters-reference) 섹션을 참조하세요.

# Ray 작업에서 작업 파라미터 사용
<a name="author-job-ray-job-parameters"></a>

**중요**  
AWS Glue for Ray는 2026년 4월 30일부터 신규 고객에게 더 이상 공개되지 않습니다. AWS Glue for Ray를 사용하려면 해당 날짜 이전에 가입하세요. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. AWS Glue for Ray와 유사한 기능의 경우 Amazon EKS를 살펴보세요. 자세한 내용은 [AWS Glue for Ray 지원 종료](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)를 참조하세요.

AWS Glue for Spark 작업과 동일한 방식으로 AWS Glue Ray 작업에 대한 인수를 설정합니다. AWS Glue API에 대한 자세한 내용은 [작업](aws-glue-api-jobs-job.md)을 참조하십시오. 이 참조에 나열된 다양한 인수로 AWS Glue Ray 작업을 구성할 수 있습니다. 내 인수를 제공할 수도 있습니다.

**Job Parameters**(작업 파라미터) 제목 아래의 **Job details**(작업 세부 정보) 탭에서 콘솔을 통해 작업을 구성할 수 있습니다. 작업에서 `DefaultArguments`를 설정하거나 작업 실행에서 `Arguments`를 설정하여 AWS CLI를 통해 작업을 구성할 수도 있습니다. 기본 인수 및 작업 파라미터는 여러 번 실행해도 작업과 함께 유지됩니다.

예를 들어 다음은 특수 파라미터를 설정하기 위해 `--arguments`를 사용하여 작업을 실행하는 구문입니다.

```
$ aws glue start-job-run --job-name "CSV to CSV" --arguments='--scriptLocation="s3://my_glue/libraries/test_lib.py",--test-environment="true"'
```

인수를 설정한 후에는 환경 변수를 통해 Ray 작업 내에서 작업 파라미터에 액세스할 수 있습니다. 그러면 각 실행에 대한 작업을 구성할 수 있습니다. 환경 변수의 이름은 `--` 접두사가 없는 작업 인수 이름입니다.

예를 들어 이전 예제에서 변수 이름은 `scriptLocation` 및 `test-environment`입니다. 그런 다음 표준 라이브러리(`test_environment = os.environ.get('test-environment')`)에서 사용할 수 있는 메서드를 통해 인수를 검색합니다. Python으로 환경 변수에 액세스하는 방법에 대한 자세한 내용은 Python 설명서의 [os 모듈](https://docs.python.org/3/library/os.html)을 참조하세요.

## Ray 작업이 로그를 생성하는 방법 구성
<a name="author-job-ray-logging-configuration"></a>

기본적으로 Ray 작업은 CloudWatch와 Amazon S3로 전송되는 로그와 지표를 생성합니다. `--logging_configuration` 파라미터를 사용하여 로그 생성 방식을 변경할 수 있으며, 현재 이를 사용하여 Ray 작업에서 다양한 유형의 로그를 생성하지 못하게 할 수 있습니다. 이 파라미터는 변경하려는 로그/동작에 해당하는 키를 갖는 JSON 객체를 사용하며, 다음 키를 지원합니다.
+ `CLOUDWATCH_METRICS` - 작업 상태를 시각화하는 데 사용할 수 있는 CloudWatch 지표 시리즈를 구성합니다. 지표에 대한 자세한 정보는 [지표를 통한 Ray 작업 모니터링](author-job-ray-monitor.md) 섹션을 참조하세요.
+ `CLOUDWATCH_LOGS` - 작업 실행 상태에 대한 Ray 애플리케이션 수준 세부 정보를 제공하는 CloudWatch 로그를 구성합니다. 로그에 대한 자세한 내용은 [로그에서 AWS Glue for Ray 오류 해결](troubleshooting-ray.md) 섹션을 참조하세요.
+ `S3` - AWS Glue가 Amazon S3에 작성하는 내용을 구성합니다. 주로 CloudWatch 로그와 유사한 정보이지만 로그 스트림이 아닌 파일로 작성합니다.

Ray 로깅 동작을 비활성화하려면 `{\"IS_ENABLED\": \"False\"}` 값을 제공합니다. 예를 들어, CloudWatch 지표와 CloudWatch 로그를 비활성화하려면 다음 구성을 제공합니다.

```
"--logging_configuration": "{\"CLOUDWATCH_METRICS\": {\"IS_ENABLED\": \"False\"}, \"CLOUDWATCH_LOGS\": {\"IS_ENABLED\": \"False\"}}"
```

## 레퍼런스
<a name="author-job-ray-parameters-reference"></a>

 Ray 작업은 Ray 작업 및 작업 실행에 대한 스크립트 환경을 설정하는 데 사용할 수 있는 다음과 같은 인수 이름을 인식합니다.
+ `--logging_configuration` - Ray 작업에서 생성되는 다양한 로그의 생성을 중지하는 데 사용됩니다. 이러한 로그는 모든 Ray 작업에서 기본적으로 생성됩니다. 형식은 문자열 이스케이프 JSON 객체입니다. 자세한 내용은 [Ray 작업이 로그를 생성하는 방법 구성](#author-job-ray-logging-configuration) 섹션을 참조하세요.
+ `--min-workers` - Ray 작업에 할당되는 작업자 노드의 최소 수입니다. 작업자 노드는 가상 CPU당 하나씩 여러 복제본을 실행할 수 있습니다. 형식: 정수 최소값: 0 최대값: 작업 정의의 `--number-of-workers (NumberOfWorkers)`에 지정된 값입니다. 워커 노드 고려 사항에 대한 자세한 내용은 [Ray 작업에서 작업자 고려](ray-jobs-section.md#author-job-ray-worker-accounting) 섹션을 참조하세요.
+ `--object_spilling_config` - AWS Glue for Ray는 Ray의 객체 스토어로 사용 가능한 공간을 확장하는 방법으로 Amazon S3를 사용할 수 있도록 지원합니다. 이 동작을 활성화하려면 이 파라미터와 함께 *객체 유출* JSON 구성 객체를 Ray에 제공할 수 있습니다. Ray 객체 유출 구성에 대한 자세한 내용은 Ray 설명서의 [Object Spilling](https://docs.ray.io/en/latest/ray-core/objects/object-spilling.html)을 참조하세요. 형식: JSON 객체.

  AWS Glue for Ray는 디스크로 유출 또는 Amazon S3로 한 번에 유출하는 것만 지원합니다. 이러한 제한을 준수하는 유출에 대해 여러 위치를 제공할 수 있습니다. Amazon S3로 유출하는 경우 이 버킷의 작업에 IAM 권한도 추가해야 합니다.

  CLI에서 JSON 객체를 구성으로 제공할 때는 JSON 객체를 문자열로 이스케이프 처리하여 문자열로 제공해야 합니다. 예를 들어 하나의 Amazon S3 경로로 유출하기 위한 문자열 값은 `"{\"type\": \"smart_open\", \"params\": {\"uri\":\"s3path\"}}"`과 같습니다. AWS Glue Studio에서는 이 파라미터를 추가 형식 지정 없이 JSON 객체로 제공합니다.
+ `--object_store_memory_head` - Ray 헤드 노드의 Plasma 객체 스토어에 할당된 메모리입니다. 이 인스턴스는 작업자 복제본뿐만 아니라 클러스터 관리 서비스를 실행합니다. 값은 부팅 후 인스턴스에서 사용 가능한 메모리의 백분율을 나타냅니다. 메모리를 많이 사용하는 워크로드를 조정하는 데 이 파라미터를 사용합니다. 기본값은 대부분의 사용 사례에 적합합니다. 형식: 양의 정수 최소값: 1 최대값: 100

  Plasma에 대한 자세한 내용은 Ray 설명서의 [Plasma 메모리 내 객체 스토어](https://ray-project.github.io/2017/08/08/plasma-in-memory-object-store.html)를 참조하세요.
+ `--object_store_memory_worker` - Ray 작업자 노드의 Plasma 객체 스토어에 할당된 메모리입니다. 이러한 인스턴스는 작업자 복제본만 실행합니다. 값은 부팅 후 인스턴스에서 사용 가능한 메모리의 백분율을 나타냅니다. 이 파라미터는 메모리를 많이 사용하는 워크로드를 조정하는 데 사용됩니다. 기본값은 대부분의 사용 사례에 허용됩니다. 형식: 양의 정수 최소값: 1 최대값: 100

  Plasma에 대한 자세한 내용은 Ray 설명서의 [Plasma 메모리 내 객체 스토어](https://ray-project.github.io/2017/08/08/plasma-in-memory-object-store.html)를 참조하세요.
+ `--pip-install` - 설치할 Python 패키지 세트입니다. 이 인수를 사용하여 PyPI에서 패키지를 설치할 수 있습니다. 형식: 쉼표로 구분된 목록.

  PyPI 패키지 항목은 `package==version` 형식(대상 패키지의 PyPI 이름 및 버전)입니다. 항목은 단일 등호 `=`가 아닌 `==`와 같은 Python 버전 매칭을 사용하여 패키지와 버전을 매칭합니다. 다른 버전 일치 연산자도 있습니다. 자세한 내용은 Python 웹사이트의 [PEP 440](https://peps.python.org/pep-0440/#version-matching)을 참조하세요. `--s3-py-modules`에서 사용자 지정 모듈을 제공할 수도 있습니다.
+ `--s3-py-modules` - Python 모듈 배포를 호스팅하는 Amazon S3 경로 세트입니다. 형식: 쉼표로 구분된 목록.

  이를 사용하여 Ray 작업에 자체 모듈을 배포할 수 있습니다. `--pip-install`에서 PyPI의 모듈을 제공할 수도 있습니다. AWS Glue ETL과 달리, 사용자 지정 배포는 pip를 통해 설정되지 않고 배포를 위해 Ray로 전달됩니다. 자세한 내용은 [Ray 작업을 위한 추가 Python 모듈](edit-script-ray-env-dependencies.md#edit-script-ray-python-libraries-additional) 섹션을 참조하세요.
+ `--working-dir` - Amazon S3에 호스팅된.zip 파일의 경로로, Ray 작업을 실행하는 모든 노드에 배포할 파일을 포함합니다. 형식: 문자열. 자세한 내용은 [Ray 작업에 파일 제공](edit-script-ray-env-dependencies.md#edit-script-ray-working-directory) 섹션을 참조하세요.

# 지표를 통한 Ray 작업 모니터링
<a name="author-job-ray-monitor"></a>

**중요**  
AWS Glue for Ray는 2026년 4월 30일부터 신규 고객에게 더 이상 공개되지 않습니다. AWS Glue for Ray를 사용하려면 해당 날짜 이전에 가입하세요. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. AWS Glue for Ray와 유사한 기능의 경우 Amazon EKS를 살펴보세요. 자세한 내용은 [AWS Glue for Ray 지원 종료](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)를 참조하세요.

AWS Glue Studio 및 Amazon CloudWatch를 사용하여 Ray 작업을 모니터링할 수 있습니다. CloudWatch는 Ray를 통해 AWS Glue에서 원시 데이터를 수집하고 처리합니다. 이러한 데이터는 분석에 사용할 수 있습니다. 이러한 지표는 AWS Glue Studio 콘솔에서 시각화되므로 작업을 실행하면서 모니터링할 수 있습니다.

AWS Glue 모니터링 방법에 대한 일반적인 개요는 [Amazon CloudWatch 지표를 사용하여 AWS Glue 모니터링](monitoring-awsglue-with-cloudwatch-metrics.md) 섹션을 참조하세요. AWS Glue에서 게시한 CloudWatch 지표를 사용하는 방법에 대한 일반적인 개요는 [Amazon CloudWatch를 사용한 모니터링](monitor-cloudwatch.md) 섹션을 참조하세요.

## AWS Glue 콘솔에서 Ray 작업 모니터링
<a name="author-job-ray-monitor-console"></a>

작업 실행에 대한 세부 정보 페이지의 **실행 세부 정보** 섹션 아래에서 사용 가능한 작업 지표를 시각화하는 사전 구축된 집계된 그래프를 볼 수 있습니다. AWS Glue Studio에서는 모든 작업 실행 시 작업 지표를 Cloud Watch에 전송합니다. 이를 통해 클러스터 및 작업의 프로파일을 구축하고 각 노드에 대한 세부 정보에 액세스할 수 있습니다.

사용 가능한 지표에 대한 자세한 내용은 [Ray 작업 실행에 대한 Amazon CloudWatch 지표 보기](view-job-runs.md#monitoring-job-run-metrics-ray) 섹션을 참조하십시오.

## CloudWatch의 Ray 작업 지표 개요
<a name="author-job-ray-monitor-cw"></a>

CloudWatch에서 세부 모니터링이 활성화되면 Ray 지표를 게시합니다. 지표는 `Glue/Ray` CloudWatch 네임스페이스에 게시됩니다.
+ **인스턴스 지표**

  작업에 할당된 인스턴스의 CPU, 메모리 및 디스크 사용률에 대한 지표를 게시합니다. 이러한 지표는 `ExecutorId`, `ExecutorType`, `host`와 같은 기능으로 식별됩니다. 이러한 지표는 표준 Linux CloudWatch 에이전트 지표의 하위 세트입니다. CloudWatch 설명서에서 지표 이름 및 기능에 대한 정보를 확인할 수 있습니다. 자세한 내용은 [CloudWatch 에이전트가 수집하는 지표](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html)를 참조하세요.
+ **Ray 클러스터 지표**

  스크립트를 실행하는 Ray 프로세스에서 이 네임스페이스로 지표를 전달한 후 사용자에게 가장 중요한 지표를 제공합니다. 사용 가능한 지표는 Ray 버전에 따라 다를 수 있습니다. 작업이 실행 중인 Ray 버전에 대한 자세한 내용은 [AWS Glue 버전](release-notes.md) 섹션을 참조하세요.

  Ray는 인스턴스 수준에서 지표를 수집합니다. 또한 작업 및 클러스터에 대한 지표도 제공합니다. Ray의 기본 지표 전략에 대한 자세한 내용은 Ray 설명서의 [Metrics](https://docs.ray.io/en/latest/ray-observability/ray-metrics.html#system-metrics)를 참조하세요.

**참고**  
 AWS Glue ETL 작업에만 사용되는 `Glue/Job Metrics/` 네임스페이스에는 Ray 지표를 게시하지 않습니다.

# AWS Glue에서 Python 쉘 작업에 대한 작업 속성 구성
<a name="add-job-python"></a>

 AWS Glue에서 Python 셸 작업을 사용하여 Python 스크립트를 셸로 실행할 수 있습니다. Python 쉘 작업을 사용하면 Python 3.6 또는 Python 3.9와 호환되는 스크립트를 실행할 수 있습니다.

**참고**  
 Pyshell v3.6에 대한 지원은 2026년 3월 1일에 종료됩니다. 워크로드를 마이그레이션하려면 [AWS Glue Python 쉘 작업에서 마이그레이션](https://docs.aws.amazon.com/glue/latest/dg/pyshell-migration.html)을 참조하세요. Python 쉘 v3.9를 계속 사용하려면 [Python 쉘 3.6에서 Python 쉘 3.9로 마이그레이션](#migrating-version-pyshell36-to-pyshell39) 섹션을 참조하세요.

**Topics**
+ [제한 사항](#python-shell-limitations)
+ [실행 환경](#python-shell-execution-environment)
+ [Python 셸 작업에 대한 작업 속성 정의](#create-job-python-properties)
+ [Python 셸 작업에 지원되는 라이브러리](#python-shell-supported-library)
+ [자체 Python 라이브러리 제공](#create-python-extra-library)
+ [AWS Glue에서 Python 쉘 작업과 함께 AWS CloudFormation 사용](#python-shell-jobs-cloudformation)
+ [Python 쉘 3.6에서 Python 쉘 3.9로 마이그레이션](#migrating-version-pyshell36-to-pyshell39)
+ [AWS Glue Python 쉘 작업에서 마이그레이션](pyshell-migration.md)

## 제한 사항
<a name="python-shell-limitations"></a>

Python 셸 작업의 다음 제한 사항에 유의합니다.
+  Python 셸 작업에는 작업 북마크를 사용할 수 없습니다.
+ Python 3.9 이상에서는 어떤 Python 라이브러리도 `.egg` 파일로 패키징할 수 없습니다. 대신 `.whl`를 사용합니다.
+ S3 데이터의 임시 복사본에 대한 제한 사항 때문에 이 `--extra-files` 옵션을 사용할 수 없습니다.

## 실행 환경
<a name="python-shell-execution-environment"></a>

Python 쉘 작업은 임시 데이터 처리를 위해 로컬 스토리지에 대한 액세스를 제공하는 관리형 실행 환경에서 실행됩니다.

**로컬 임시 스토리지**  
`/tmp` 디렉터리는 작업 실행 도중 임시 스토리지로 사용할 수 있습니다. 이 디렉터리는 다음에 사용할 수 있는 약 14GiB의 여유 공간을 제공합니다.  
+ 임시 파일 처리
+ 중간 데이터 스토리지
+ 소규모 데이터 세트 캐싱
`/tmp` 디렉터리는 임시 디렉터리로 작업 완료 후 정리됩니다. 중요 데이터를 영구적으로 저장하는 데 사용하면 안 됩니다.

## Python 셸 작업에 대한 작업 속성 정의
<a name="create-job-python-properties"></a>

이 섹션에서는 AWS Glue Studio에서 또는 AWS CLI를 사용하여 작업 속성을 정의하는 것을 설명합니다.

### AWS Glue Studio
<a name="create-job-python-properties-studio"></a>

AWS Glue Studio에서 Python 셸 작업을 정의할 때 다음 속성 중 일부를 입력합니다.

**IAM 역할**  
사용된 리소스에 대한 권한 부여에 사용되는 AWS Identity and Access Management(IAM) 역할을 지정하여 작업을 실행하고 데이터 스토어에 액세스합니다. AWS Glue 작업을 실행하는 권한에 대한 자세한 내용은 [AWS Glue의 Identity and Access Management](security-iam.md) 단원을 참조하세요.

**Type**  
**Python shell(Python 셸)**을 선택하여 `pythonshell` 작업 명령으로 Python 스크립트를 실행합니다.

**Python 버전**  
Python 버전을 선택합니다. 기본값은 Python 3.9입니다. 유효한 버전은 Python 3.6과 Python 3.9입니다.

**공통 분석 라이브러리 로드(권장)**  
Python 셸에 Python 3.9용 공통 라이브러리를 포함하려면 이 옵션을 선택합니다.  
라이브러리가 사용자 지정 라이브러리이거나 사전 설치된 라이브러리와 충돌하는 경우 공통 라이브러리를 설치하지 않을 수 있습니다. 하지만 공통 라이브러리 외에 추가 라이브러리를 설치할 수 있습니다.  
이 옵션을 선택하는 경우 `library-set` 옵션이 `analytics`로 설정됩니다. 이 옵션을 선택 취소하는 경우 `library-set` 옵션이 `none`으로 설정됩니다.

**스크립트 파일 이름 및 스크립트 경로**  
스크립트의 코드는 작업 절차 논리를 정의합니다. Amazon Simple Storage Service(Amazon S3)에서 스크립트 이름과 위치를 제공합니다. 경로의 스크립트 디렉터리와 동일한 이름의 파일이 없다는 것을 확인합니다. 스크립트 사용에 대한 자세한 내용은 [AWS Glue 프로그래밍 안내서](edit-script.md) 단원을 참조하십시오.

**Script**  
스크립트의 코드는 작업 절차 논리를 정의합니다. Python 3.6 또는 Python 3.9에서 스크립트를 코딩할 수 있습니다. AWS Glue Studio에서 스크립트를 편집할 수 있습니다.

**데이터 처리 단위**  
이 작업이 실행될 때 할당할 수 있는 AWS Glue 데이터 처리 단위(DPU)의 최대 수입니다. DPU는 4 vCPU의 컴퓨팅 파워와 16GB 메모리로 구성된 프로세싱 파워의 상대적 측정값입니다. 자세한 내용은 [AWS Glue 요금](https://aws.amazon.com/glue/pricing/)을 참조하십시오.  
값을 0.0625 또는 1로 설정할 수 있습니다. 기본값은 0.0625입니다. 어느 경우든 인스턴스의 로컬 디스크는 20GB가 됩니다.

### CLI
<a name="create-job-python-properties-cli"></a>

 다음 예와 같이 AWS CLI를 사용하여 [**Python 셸(Python shell)**] 작업을 생성할 수도 있습니다.

```
 aws glue create-job --name python-job-cli --role Glue_DefaultRole 
     --command '{"Name" :  "pythonshell", "PythonVersion": "3.9", "ScriptLocation" : "s3://amzn-s3-demo-bucket/scriptname.py"}'  
     --max-capacity 0.0625
```

**참고**  
 `--glue-version` 파라미터는 AWS Glue 쉘 작업에 적용되지 않으므로 AWS Glue 버전을 지정할 필요가 없습니다. 지정된 버전은 모두 무시됩니다.

 AWS CLI를 사용하여 생성된 작업은 Python 3으로 기본 설정됩니다. 유효한 Python 버전은 3(3.6에 해당)과 3.9입니다. Python 3.6을 지정하려면 이 튜플을 `--command` 파라미터 `"PythonVersion":"3"`에 추가합니다.

 Python 3.9를 지정하려면 이 튜플을 `--command` 파라미터 `"PythonVersion":"3.9"`에 추가합니다.

 Python 셸 작업에서 사용하는 최대 용량을 설정하려면 `--max-capacity` 파라미터를 제공합니다. Python 셸 작업에서 `--allocated-capacity` 파라미터는 사용할 수 없습니다.

## Python 셸 작업에 지원되는 라이브러리
<a name="python-shell-supported-library"></a>

 Python 3.9를 사용하는 Python 셸에서 필요에 따라 사전 패키징된 라이브러리 세트를 사용하도록 라이브러리 세트를 선택할 수 있습니다. `library-set` 옵션을 사용하여 라이브러리 세트를 선택할 수 있습니다. 유효한 값은 `analytics` 및 `none`입니다.

Python 셸 작업의 실행 환경은 다음 라이브러리를 지원합니다.


| Python 버전 | Python 3.6 | Python 3.9 | 
| --- | --- | --- | 
| 라이브러리 세트 | 해당 사항 없음 | 분석 | none | 
| avro |  | 1.11.0 |  | 
| awscli | 116.242 | 1.23.5 | 1.23.5 | 
| awswrangler |  | 2.15.1 |  | 
| botocore | 1.12.232 | 1.24.21 | 1.23.5 | 
| boto3 | 1.9.203 | 1.21.21 |  | 
| elasticsearch |  | 8.2.0 |  | 
| numpy | 1.16.2 | 1.22.3 |  | 
| pandas | 0.24.2 | 1.4.2 |  | 
| psycopg2 |  | 2.9.3 |  | 
| pyathena |  | 2.5.3 |  | 
| PyGreSQL | 5.0.6 |  |  | 
| PyMySQL |  | 1.0.2 |  | 
| pyodbc |  | 4.0.32 |  | 
| pyorc |  | 0.6.0 |  | 
| redshift-connector |  | 2.0.907 |  | 
| requests | 2.22.0 | 2.27.1 |  | 
| scikit-learn | 0.20.3 | 1.0.2 |  | 
| scipy | 1.2.1 | 1.8.0 |  | 
| SQLAlchemy |  | 1.4.36 |  | 
| s3fs |  | 2022.3.0 |  | 

`NumPy` 라이브러리는 공학용 컴퓨팅의 Python 셸 작업에서 사용할 수 있습니다. 자세한 내용은 [NumPy](http://www.numpy.org)를 참조하십시오. 다음 예제는 Python 셸 작업에 사용할 수 있는 NumPy 스크립트를 보여줍니다. 이 스크립트는 "Hello world" 및 몇 가지 수학적 계산 결과를 프린트합니다.

```
import numpy as np
print("Hello world")

a = np.array([20,30,40,50])
print(a)

b = np.arange( 4 )

print(b)

c = a-b

print(c)

d = b**2

print(d)
```

## 자체 Python 라이브러리 제공
<a name="create-python-extra-library"></a>

### PIP 사용
<a name="create-python-extra-library-pip"></a>

Python 3.9를 사용하는 Python 셸을 사용하면 작업 수준에서 추가 Python 모듈 또는 다른 버전을 제공할 수도 있습니다. `--additional-python-modules` 옵션을 쉼표로 구분된 Python 모듈 목록과 함께 사용하여 새 모듈을 추가하거나 기존 모듈의 버전을 변경할 수 있습니다. Python 쉘 작업을 사용할 때는 이 파라미터로 Amazon S3에 호스팅된 사용자 지정 Python 모듈을 제공할 수 없습니다.

예를 들어 새 `scikit-learn` 모듈을 업데이트하거나 추가하려면 `"--additional-python-modules", "scikit-learn==0.21.3"` 키 및 값을 사용합니다.

AWS Glue는 Python 패키지 설치 프로그램(pip3)을 사용하여 추가 모듈을 설치합니다. `--additional-python-modules` 값 내에 추가 pip3 옵션을 전달할 수 있습니다. 예를 들어 `"scikit-learn==0.21.3 -i https://pypi.python.org/simple/"`입니다. pip3의 비호환성 또는 제한 사항이 적용됩니다.

**참고**  
향후에 비호환성을 방지하려면 Python 3.9용으로 빌드된 라이브러리를 사용하는 것이 좋습니다.

### Egg 또는 Whl 파일 사용
<a name="create-python-extra-library-egg-whl"></a>

이미 하나 이상의 `.egg` 또는 `.whl` 파일로 패키징된 하나 이상의 Python 라이브러리가 있을 수 있습니다. 그렇다면 다음 예와 같이 AWS Command Line Interface(AWS CLI)를 사용하여 "`--extra-py-files`" 플래그 하에서 작업에 이를 지정할 수 있습니다.

```
aws glue create-job --name python-redshift-test-cli --role role --command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://MyBucket/python/library/redshift_test.py"}' 
     --connections Connections=connection-name --default-arguments '{"--extra-py-files" : ["s3://amzn-s3-demo-bucket/EGG-FILE", "s3://amzn-s3-demo-bucket/WHEEL-FILE"]}'
```

Python 라이브러리에서 `.egg` 파일 또는 `.whl` 파일을 생성하는 방법을 모르는 경우 다음 단계를 따르십시오. 이 예제는 macOS, Linux 및 Windows Subsystem for Linux(WSL)에 적용됩니다.

**Python .egg 또는 .whl 파일을 만들려면**

1. Virtual Private Cloud(VPC)에서 Amazon Redshift 클러스터를 생성하고 일부 데이터를 테이블에 추가합니다.

1. 클러스터를 만드는 데 사용한 VPC-SecurityGroup-Subnet 조합에 대해 AWS Glue 연결을 만듭니다. 연결이 성공인지 테스트합니다.

1. `redshift_example`이라는 디렉터리를 생성하고 `setup.py`라는 파일을 생성합니다. `setup.py`에 다음 코드를 붙여넣습니다.

   ```
   from setuptools import setup
   
   setup(
       name="redshift_module",
       version="0.1",
       packages=['redshift_module']
   )
   ```

1. `redshift_example` 디렉터리에 `redshift_module` 디렉터리를 만듭니다. `redshift_module` 디렉터리에서 `__init__.py` 및 `pygresql_redshift_common.py`라는 파일을 만듭니다.

1. `__init__.py` 파일은 비워둡니다. `pygresql_redshift_common.py`에 다음 코드를 붙여넣습니다. *port*, *db\$1name*, *user* 및 *password\$1for\$1user*를 Amazon Redshift 클러스터에 해당하는 세부 정보로 바꿉니다. *table\$1name*을 Amazon Redshift의 테이블 이름으로 바꿉니다.

   ```
   import pg
   
   
   def get_connection(host):
       rs_conn_string = "host=%s port=%s dbname=%s user=%s password=%s" % (
           host, port, db_name, user, password_for_user)
   
       rs_conn = pg.connect(dbname=rs_conn_string)
       rs_conn.query("set statement_timeout = 1200000")
       return rs_conn
   
   
   def query(con):
       statement = "Select * from table_name;"
       res = con.query(statement)
       return res
   ```

1. 아직 이동하지 않은 경우 `redshift_example` 디렉터리로 변경합니다.

1. 다음 중 하나를 수행하세요.
   + `.egg` 파일을 생성하려면 다음 명령을 실행합니다.

     ```
     python setup.py bdist_egg
     ```
   + `.whl` 파일을 생성하려면 다음 명령을 실행합니다.

     ```
     python setup.py bdist_wheel
     ```

1. 이전 명령에 필요한 종속성을 설치합니다.

1. 해당 명령은 `dist` 디렉터리에서 파일을 생성합니다.
   + egg 파일을 만든 경우, 이름은 `redshift_module-0.1-py2.7.egg`입니다.
   + wheel 파일을 만든 경우, 이름은 `redshift_module-0.1-py2.7-none-any.whl`입니다.

   이 파일을 Amazon S3에 업로드합니다.

   이 예제에서 업로드된 파일 경로는 *s3://amzn-s3-demo-bucket/EGG-FILE* 또는 *s3://amzn-s3-demo-bucket/WHEEL-FILE*입니다.

1. AWS Glue 작업의 스크립트로 사용할 Python 파일을 생성하고 다음 코드를 파일에 추가합니다.

   ```
   from redshift_module import pygresql_redshift_common as rs_common
   
   con1 = rs_common.get_connection(redshift_endpoint)
   res = rs_common.query(con1)
   
   print "Rows in the table cities are: "
   
   print res
   ```

1. 이전 파일을 Amazon S3에 업로드합니다. 이 예제에서 업로드된 파일 경로는 *s3://amzn-s3-demo-bucket/scriptname.py*입니다.

1. 이 스크립트를 사용하여 Python 셸 작업을 생성합니다. AWS Glue 콘솔의 [**작업 속성(Job properties)**] 페이지에서 **Python 라이브러리 경로(Python library path)** 상자에 `.egg/.whl` 파일의 경로를 지정합니다. 여러 `.egg/.whl` 파일 및 Python 파일이 있으면 이 상자에 쉼표로 구분된 목록을 제공합니다.

   `.egg` 파일을 수정하거나 이름을 바꿀 때 파일 이름은 “python setup.py bdist\$1egg” 명령으로 생성된 기본 이름을 사용하거나 Python 모듈 명명 규칙을 준수해야 합니다. 자세한 내용은 [Python 코드 스타일 가이드](https://www.python.org/dev/peps/pep-0008/)를 참조하십시오.

   AWS CLI를 사용하여 다음 예와 같이 명령으로 작업을 생성하십시오.

   ```
   aws glue create-job --name python-redshift-test-cli --role Role --command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://amzn-s3-demo-bucket/scriptname.py"}' 
        --connections Connections="connection-name" --default-arguments '{"--extra-py-files" : ["s3://amzn-s3-demo-bucket/EGG-FILE", "s3://amzn-s3-demo-bucket/WHEEL-FILE"]}'
   ```

   작업이 실행되면 스크립트는 Amazon Redshift 클러스터의 *table\$1name* 테이블에 생성된 행을 인쇄합니다.

## AWS Glue에서 Python 쉘 작업과 함께 AWS CloudFormation 사용
<a name="python-shell-jobs-cloudformation"></a>

 AWS Glue에서 Python 쉘 작업과 함께 AWS CloudFormation을 사용할 수 있습니다. 다음은 예제입니다.

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Python39Job:
    Type: 'AWS::Glue::Job'
    Properties:
      Command:
        Name: pythonshell
        PythonVersion: '3.9'
        ScriptLocation: 's3://bucket/location'
      MaxRetries: 0
      Name: python-39-job
      Role: RoleName
```

 Python 셸 작업 출력에 대한 Amazon CloudWatch Logs 그룹은 `/aws-glue/python-jobs/output`입니다. 오류의 경우 로그 그룹 `/aws-glue/python-jobs/error`를 확인합니다.

## Python 쉘 3.6에서 Python 쉘 3.9로 마이그레이션
<a name="migrating-version-pyshell36-to-pyshell39"></a>

 Python 쉘 작업을 최신 AWS Glue 버전으로 마이그레이션: 

1.  AWS Glue 콘솔([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/))에서 기존 Python 쉘 작업을 선택합니다.

1.  **작업** 세부 정보 탭에서 Python 버전을 `Python 3.9`로 설정하고 **저장**을 선택합니다.

1.  작업 스크립트가 Python 3.9와 호환되고 성공적으로 실행되는지 확인합니다.

# AWS Glue Python 쉘 작업에서 마이그레이션
<a name="pyshell-migration"></a>

 AWS는 2018년 고객에게 중소 규모의 ETL 작업에서 손쉽게 Python 스크립트를 실행하고 SQL 쿼리를 트리거할 수 있는 방법을 제공하기 위해 AWS Glue Python 쉘 작업을 출시했습니다. 그러나 이제 PythonShell에서 현재 실행 중인 워크로드를 해결하기 위한 보다 현대적이고 유연한 옵션이 있습니다. 이 항목에서는 사용 가능한 최신 기능을 활용하기 위해 워크로드를 AWS Glue Python 쉘 작업에서 이러한 대체 옵션 중 하나로 마이그레이션하는 방법을 설명합니다.

 이 항목에서는 AWS Glue Python 쉘 작업에서 대체 옵션으로 마이그레이션하는 방법에 관해 설명합니다.

## 워크로드를 AWS Glue Spark 작업으로 마이그레이션
<a name="pyshell-migration-to-glue-spark-jobs"></a>

 [AWS Glue Spark 및 PySpark 작업](https://docs.aws.amazon.com/glue/latest/dg/spark_and_pyspark.html)을 사용하면 분산 방식으로 워크로드를 실행할 수 있습니다. AWS Glue Python 쉘 작업과 AWS Glue Spark 작업은 모두 동일한 플랫폼에서 실행되므로 쉽게 마이그레이션할 수 있으며 AWS Glue 워크플로, AWS Glue 트리거, AWS Glue의 Amazon EventBridge 통합, \$1 PIP 기반 패키지 설치 등 Python Shell 작업과 함께 사용 중인 기존 AWS Glue 기능을 계속 사용할 수 있습니다.

 그러나 AWS Glue Spark 작업은 Spark 워크로드를 실행하도록 설계되었으며 최소 워커 수는 2개입니다. 스크립트를 수정하지 않고 Python 쉘 작업에서 마이그레이션하는 경우 실제로 1개의 워커만 사용되며 다른 워커는 유휴 상태로 유지됩니다. 이로 인해 비용이 증가합니다.

 효율성을 높이려면 Python 작업 스크립트를 다시 작성하여 Spark의 기능을 활용하고 워크로드를 여러 워커에 분산합니다. Python 스크립트가 Pandas 기반인 경우 Spark의 새 Pandas API를 사용하여 쉽게 마이그레이션할 수 있습니다. 이에 대한 자세한 내용은 [AWS 빅 데이터 블로그: Apache Spark용 AWS Glue 4.0 자세히 알아보기](https://aws.amazon.com/blogs/big-data/dive-deep-into-aws-glue-4-0-for-apache-spark/)에서 확인하세요.

## 워크로드를 AWS Lambda로 마이그레이션
<a name="pyshell-migration-to-aws-lambda"></a>

 AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 서버리스 컴퓨팅 서비스입니다. AWS Lambda는 시작 시간이 짧고 컴퓨팅 용량 옵션이 유연하기 때문에 이러한 이점을 활용할 수 있습니다. 추가 Python 라이브러리를 관리하기 위해 AWS Glue Python 쉘 작업은 PIP 기반 설치를 사용합니다. 그러나 AWS Lambda의 경우 zip 아카이브, 컨테이너 이미지 또는 Lambda 계층 옵션 중 하나를 선택해야 합니다.

 반면 AWS Lambda의 최대 제한 시간은 900초(15분)입니다. 기존 AWS Glue Python 쉘 작업 워크로드의 작업 기간이 그보다 크거나 워크로드에 작업 기간이 길어질 수 있는 급증 패턴이 있는 경우 AWS Lambda 대신 다른 옵션을 탐색하는 것이 좋습니다.

## 워크로드를 Amazon ECS/Fargate로 마이그레이션
<a name="pyshell-migration-to-ecs-aws-fargate"></a>

 Amazon Elastic Container Service(Amazon ECS)는 컨테이너화된 애플리케이션의 배포, 관리 및 규모 조정을 간소화하는 완전관리형 서비스입니다. AWS Fargate는 Amazon ECS 및 Amazon Elastic Kubernetes Service(Amazon EKS)에서 실행되는 컨테이너화된 워크로드를 위한 서버리스 컴퓨팅 엔진입니다. Amazon ECS 및 Fargate에는 최대 제한 시간이 없으므로 장기 실행 작업에 적합한 옵션입니다. 컨테이너 이미지를 완전히 제어할 수 있으므로 기존 Python 스크립트와 추가 Python 라이브러리를 컨테이너로 가져와 사용할 수 있습니다. 그러나 이 접근 방식을 사용하려면 Python 스크립트를 컨테이너화해야 합니다.

## 워크로드를 Amazon Managed Workflows for Apache Airflow Python 연산자로 마이그레이션
<a name="pyshell-migration-to-amazon-mwaa-python-operator"></a>

 Amazon Managed Workflows for Apache Airflow(Apache Airflow용 관리형 워크플로)는 Apache Airflow에 대한 관리형 오케스트레이션 서비스로 클라우드에서 종단 간 데이터 파이프라인을 대규모로 쉽게 설정하고 운영할 수 있습니다. 이미 MWAA 환경이 있는 경우 AWS Glue Python 쉘 작업 대신 Python 연산자를 사용하는 것이 간단합니다. Python 연산자는 Airflow 워크플로 내에서 Python 코드를 실행하는 연산자입니다. 그러나 기존 MWAA 환경이 없는 경우 다른 옵션을 탐색하는 것이 좋습니다.

## 워크로드를 Amazon SageMaker AI AI 훈련 작업으로 마이그레이션
<a name="pyshell-migration-to-amazon-sagemaker-ai"></a>

 Amazon SageMaker AI Training은 Amazon SageMaker AI에서 제공하는 완전관리형 기계 학습(ML) 서비스로, 광범위한 ML 모델을 대규모로 효율적으로 훈련하는 데 도움이 됩니다. Amazon SageMaker AI AI 작업의 핵심은 ML 워크로드의 컨테이너화와 AWS 컴퓨팅 리소스 관리 기능입니다. 최대 제한 시간이 없는 서버리스 환경을 선호하는 경우 Amazon SageMaker AI AI 훈련 작업이 적합할 수 있습니다. 그러나 시작 지연 시간은 AWS Glue Python 쉘 작업보다 긴 경향이 있습니다. 지연 시간에 민감한 작업의 경우 다른 옵션을 탐색하는 것이 좋습니다.

# AWS Glue 모니터링
<a name="monitor-glue"></a>

모니터링은 AWS Glue 및 사용자의 다른 AWS 솔루션의 안정성, 가용성 및 성능을 유지하는 데 있어서 중요한 부분입니다. AWS은 AWS Glue를 보면서, 이상이 있을 때 이를 보고하고, 적절할 때 자동으로 조치를 취할 수 있게 해주는 모니터링 도구를 제공합니다.

다음과 같은 자동 모니터링 도구를 사용하여 AWS Glue를 관찰하고 문제 발생 시 보고할 수 있습니다.
+ **Amazon CloudWatch Events**는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다. CloudWatch Events는 자동화된 이벤트 중심 컴퓨팅을 지원합니다. 특정 이벤트를 감시하는 규칙을 작성하고 이러한 이벤트가 발생할 때 다른 AWS 서비스에서 자동화된 작업을 트리거할 수 있습니다. 자세한 내용은 [Amazon CloudWatch Events 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/)를 참조하세요.
+ **Amazon CloudWatch Logs**로 Amazon EC2 인스턴스, AWS CloudTrail, 기타 소스의 로그 파일을 모니터링, 저장 및 액세스할 수 있습니다. CloudWatch Logs는 로그 파일의 정보를 모니터링하고 특정 임곗값에 도달하면 사용자에게 알릴 수 있습니다. 또한 매우 내구력 있는 스토리지에 로그 데이터를 저장할 수 있습니다. 자세한 내용은 [Amazon CloudWatch Logs 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/)를 참조하세요.
+ AWS CloudTrail은 직접 수행하거나 AWS 계정을 대신하여 수행한 API 직접 호출 및 관련 이벤트를 캡처하고 지정한 Amazon S3 버킷에 로그 파일을 전송합니다.**** 어떤 사용자 및 계정이 AWS를 호출하는지, 어떤 소스 IP 주소에 호출이 이루어지는지, 언제 호출이 발생했는지 확인할 수 있습니다. 자세한 내용은 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하세요.

또한 AWS Glue 콘솔에서 다음과 같은 인사이트에 액세스하여 작업을 디버깅하고 프로파일링하는 데 도움을 받을 수 있습니다.
+ Spark 작업 - 선택된 CloudWatch 지표 시리즈의 시각화를 볼 수 있으며, 새로운 작업은 Spark UI에 액세스할 수 있습니다. 자세한 내용은 [AWS Glue Spark 작업 모니터링](monitor-spark.md) 섹션을 참조하세요.
+ Ray 작업 - 선택된 CloudWatch 지표 시리즈의 시각화를 볼 수 있습니다. 자세한 내용은 [지표를 통한 Ray 작업 모니터링](author-job-ray-monitor.md) 섹션을 참조하세요.

**Topics**
+ [AWS Glue의 AWS 태그](monitor-tags.md)
+ [EventBridge를 사용한 AWS Glue 자동화](automating-awsglue-with-cloudwatch-events.md)
+ [AWS Glue 리소스 모니터링](monitor-resource-metrics.md)
+ [AWS CloudTrail을 사용하여 AWS Glue API 호출 로깅](monitor-cloudtrail.md)

# AWS Glue의 AWS 태그
<a name="monitor-tags"></a>

AWS Glue 리소스를 쉽게 관리할 수 있도록 선택에 따라 일부 AWS Glue 리소스 유형에 자체 태그를 할당할 수 있습니다. 태그는 AWS 리소스에 할당하는 레이블입니다. 각 태그는 사용자가 정의하는 키와 선택적 값으로 구성됩니다. AWS Glue의 태그를 사용하여 리소스를 정리하고 식별할 수 있습니다. 태그는 비용 회계 보고서를 생성하고 리소스에 대한 액세스를 제한하는 데 사용할 수 있습니다. AWS Identity and Access Management를 사용하는 경우 AWS 계정에서 태그를 생성, 편집 또는 삭제할 수 있는 권한이 있는 사용자를 제어할 수 있습니다. 태그 관련 API를 직접 호출하는 권한 외에도 연결에서 태그 지정 API를 직접 호출할 수 있는 `glue:GetConnection` 권한과 데이터베이스에서 태그 지정 API를 직접 호출할 수 있는 `glue:GetDatabase` 권한도 필요합니다. 자세한 내용은 [ABAC와 AWS Glue](security_iam_service-with-iam.md#security_iam_service-with-iam-tags) 섹션을 참조하세요.

AWS Glue에서 다음 리소스에 태그를 지정할 수 있습니다.
+ 연결
+ 데이터베이스
+ 크롤러
+ 대화형 세션
+ 개발 엔드포인트
+ 작업
+ 트리거
+ 워크플로
+ 청사진
+ 기계 학습 변환
+ 데이터 품질 규칙 세트
+ 스트림 스키마
+ 스트림 스키마 레지스트리

**참고**  
이러한 AWS Glue 리소스의 태그 지정이 가능하도록 모범 사례로서 정책에 항상 `glue:TagResource` 작업을 포함시킵니다.

AWS Glue에서 태그를 사용할 때 다음을 고려하십시오.
+ 엔터티당 최대 50개의 태그가 지원됩니다.
+ AWS Glue에서 `{"string": "string" ...}` 포맷의 키-값 페어 목록으로 태그를 지정합니다.
+ 객체에서 태그를 생성할 때 태그 키는 필수이고 태그 값은 선택 사항입니다.
+ 태그 키와 태그 값은 대/소문자를 구분합니다.
+ 태그 키와 태그 값은 접두사 *aws*를 포함하지 않아야 합니다. 이러한 태그에서 어떤 작업도 허용되지 않습니다.
+ 태그 키의 최대 길이는 UTF-8 형식의 유니코드 문자 128자입니다. 태그 키는 비어 있거나 null이면 안 됩니다.
+ 태그 값의 최대 길이는 UTF-8 형식의 유니코드 문자 256자입니다. 태그 값은 비어 있거나 null일 수 있습니다.

## AWS Glue 연결에 대한 태깅 지원
<a name="tag-connections"></a>

리소스 태그를 기준으로 `CreateConnection`, `UpdateConnection`, `GetConnection` 및 `DeleteConnection` 작업 권한을 제한할 수 있습니다. 이렇게 하면 Data Catalog에서 JDBC 연결 정보를 가져와야 하는 JDBC 데이터 원본을 사용하는 AWS Glue 작업에 최소 권한 액세스 제어를 구현할 수 있습니다.

**사용 예**  
["connection-category", "dev-test"] 태그를 사용하여 AWS Glue 연결을 생성합니다.

IAM 정책에서 `GetConnection` 작업에 대한 태그 조건을 지정합니다.

```
{
   "Effect": "Allow",
   "Action": [
     "glue:GetConnection"
     ],
   "Resource": "*",
   "Condition": {
     "ForAnyValue:StringEquals": {
       "aws:ResourceTag/tagKey": "dev-test"
     }
   }
 }
```

## 예시
<a name="TagExamples"></a>

다음 예는 태그가 할당된 작업을 생성합니다.

**AWS CLI**

```
aws glue create-job --name job-test-tags --role MyJobRole --command Name=glueetl,ScriptLocation=S3://aws-glue-scripts//prod-job1 
--tags key1=value1,key2=value2
```

**CloudFormation JSON**

```
{
  "Description": "AWS Glue Job Test Tags",
  "Resources": {
    "MyJobRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "glue.amazonaws.com"
                ]
              },
              "Action": [
                "sts:AssumeRole"
              ]
            }
          ]
        },
        "Path": "/",
        "Policies": [
          {
            "PolicyName": "root",
            "PolicyDocument": {
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
                }
              ]
            }
          }
        ]
      }
    },
    "MyJob": {
      "Type": "AWS::Glue::Job",
      "Properties": {
        "Command": {
          "Name": "glueetl",
          "ScriptLocation": "s3://aws-glue-scripts//prod-job1"
        },
        "DefaultArguments": {
          "--job-bookmark-option": "job-bookmark-enable"
        },
        "ExecutionProperty": {
          "MaxConcurrentRuns": 2
        },
        "MaxRetries": 0,
        "Name": "cf-job1",
        "Role": {
           "Ref": "MyJobRole",
           "Tags": {
                "key1": "value1", 
                "key2": "value2"
           } 
        }
      }
    }
  }
}
```

**CloudFormation YAML**

```
Description: AWS Glue Job Test Tags
Resources:
  MyJobRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - glue.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: "*"
                Resource: "*"
  MyJob:
    Type: AWS::Glue::Job
    Properties:
      Command:
        Name: glueetl
        ScriptLocation: s3://aws-glue-scripts//prod-job1
      DefaultArguments:
        "--job-bookmark-option": job-bookmark-enable
      ExecutionProperty:
        MaxConcurrentRuns: 2
      MaxRetries: 0
      Name: cf-job1
      Role:
        Ref: MyJobRole
        Tags:
           key1: value1
           key2: value2
```

자세한 내용은 [AWS 태그 지정 전략](https://aws.amazon.com/answers/account-management/aws-tagging-strategies/)을 참조하세요.

태그를 이용한 액세스 제어 방법에 대한 자세한 내용은 [ABAC와 AWS Glue](security_iam_service-with-iam.md#security_iam_service-with-iam-tags) 단원을 참조하십시오.

# EventBridge를 사용한 AWS Glue 자동화
<a name="automating-awsglue-with-cloudwatch-events"></a>

Amazon EventBridge를 사용하면 AWS 서비스를 자동화하고 애플리케이션 가용성 문제나 리소스 변경 같은 시스템 이벤트에 자동으로 대응할 수 있습니다. AWS 서비스의 이벤트는 거의 실시간으로 EventBridge로 전송됩니다. 원하는 이벤트만 표시하도록 간단한 규칙을 작성한 후 규칙과 일치하는 이벤트 발생 시 실행할 자동화 작업을 지정할 수 있습니다. 자동으로 트리거할 수 있는 작업은 다음과 같습니다.
+ AWS Lambda 함수 호출
+ Amazon EC2 Run Command 호출
+ Amazon Kinesis Data Streams로 이벤트 릴레이
+ AWS Step Functions 상태 머신 활성화
+ Amazon SNS 주제 또는 Amazon SQS 대기열 알림

다음은 EventBridge를 AWS Glue에 사용하는 몇 가지 예시입니다.
+ ETL 작업이 성공하면 Lambda 함수를 활성화합니다.
+ ETL 작업이 실패하면 Amazon SNS 주제를 알립니다.

다음 EventBridge는 AWS Glue에 의해 생성됩니다.
+ `"detail-type":"Glue Job State Change"` 이벤트는 `SUCCEEDED`, `FAILED`, `TIMEOUT` 및 `STOPPED`에 대해 생성됩니다.
+ 작업 지연 알림 임곗값을 초과한다면 `RUNNING`, `STARTING` 및 `STOPPING` 작업 실행에 `"detail-type":"Glue Job Run Status"`용 이벤트가 생성됩니다. 이러한 이벤트를 수신하려면 작업 지연 알림 임계값 속성을 설정해야 합니다.

  작업 지연 알림 임계값을 초과한 경우 작업 실행 상태당 하나의 이벤트만 생성됩니다.
+ `"detail-type":"Glue Crawler State Change"` 이벤트는 `Started`, `Succeeded` 및 `Failed`을 위해 발생합니다.
+ `“detail_type”:“Glue Scheduled Crawler Invocation Failure”`에 대한 이벤트는 예약된 크롤러가 시작되지 않을 때 생성됩니다. 알림 세부 정보:
  + `customerId`에는 고객의 계정 ID가 포함됩니다.
  + `crawlerName`에는 시작하지 못한 크롤러의 이름이 포함됩니다.
  + `errorMessage`에는 간접 호출 실패의 예외 메시지가 포함됩니다.
+ `“detail_type”:“Glue Auto Statistics Invocation Failure“`에 대한 이벤트는 자동 관리형 열 통계 작업 실행이 시작되지 않을 때 생성됩니다. 알림 세부 정보:
  + `catalogId`에는 카탈로그와 연결된 ID가 포함됩니다.
  + `databaseName`에는 영향을 받는 데이터베이스 이름이 포함됩니다.
  + `tableName`에는 영향을 받는 테이블 이름이 포함됩니다.
  + `errorMessage`에는 간접 호출 실패의 예외 메시지가 포함됩니다.
+ `“detail_type”:“Glue Scheduled Statistics Invocation Failure”`에 대한 이벤트는 (cron) 예약 열 통계 작업 실행이 시작되지 않을 때 생성됩니다. 알림 세부 정보:
  + `catalogId`에는 카탈로그와 연결된 ID가 포함됩니다.
  + `databaseName`에는 영향을 받는 데이터베이스 이름이 포함됩니다.
  + `tableName`에는 영향을 받는 테이블 이름이 포함됩니다.
  + `errorMessage`에는 간접 호출 실패의 예외 메시지가 포함됩니다.
+ `“detail_type”:“Glue Statistics Task Started”`에 대한 이벤트는 열 통계 작업 실행이 시작될 때 생성됩니다.
+ `“detail_type”:“Glue Statistics Task Succeeded”`에 대한 이벤트는 열 통계 작업 실행이 성공할 때 생성됩니다.
+ `“detail_type”:“Glue Statistics Task Failed”`에 대한 이벤트는 열 통계 작업 실행이 실패할 때 생성됩니다.
+ `"detail-type":"Glue Data Catalog Database State Change"` 이벤트는 `CreateDatabase`, `DeleteDatabase`, `CreateTable`, `DeleteTable` 및 `BatchDeleteTable`에 대해 생성됩니다. 예를 들어 테이블이 생성되거나 삭제되면 EventBridge에 알림이 전송됩니다. 순서가 잘못되었거나 누락되는 등 알림 이벤트의 순서 또는 존재 여부에 따라 프로그램을 작성할 수 없을 수 있습니다. 이벤트는 최선의 작업을 기반으로 발생됩니다. 알림 세부 정보:
  + `typeOfChange`에는 API 작업의 이름이 포함되어 있습니다.
  + `databaseName`에는 영향을 받는 데이터베이스 이름이 포함되어 있습니다.
  + `changedTables`는 알림당 영향을 받는 테이블의 이름을 최대 100개까지 포함합니다. 테이블 이름이 길면 여러 알림이 생성될 수 있습니다.
+ `"detail-type":"Glue Data Catalog Table State Change"`에 대한 이벤트는 `UpdateTable`, `CreatePartition`, `BatchCreatePartition`, `UpdatePartition`, `DeletePartition`, `BatchUpdatePartition` 및 `BatchDeletePartition`에 대해 생성됩니다. 예를 들어 테이블이 생성되거나 파티션이 업데이트되면 EventBridge에 알림이 전송됩니다. 순서가 잘못되었거나 누락되는 등 알림 이벤트의 순서 또는 존재 여부에 따라 프로그램을 작성할 수 없을 수 있습니다. 이벤트는 최선의 작업을 기반으로 발생됩니다. 알림 세부 정보:
  + `typeOfChange`에는 API 작업의 이름이 포함되어 있습니다.
  + `databaseName`은 영향을 받는 리소스가 포함된 데이터베이스의 이름을 포함합니다.
  + `tableName`에는 영향을 받는 테이블 이름이 포함되어 있습니다.
  + `changedPartitions`는 하나의 알림에서 최대 100개의 영향을 받는 파티션을 지정합니다. 파티션 이름이 길면 여러 알림이 생성될 수 있습니다.

    예를 들어 `Year` 및 `Month`와 같은 두 개의 파티션 키가 있는 경우`"2018,01", "2018,02"`는 `"Year=2018" and "Month=01"` 및 `"Year=2018" and "Month=02"`가 있는 파티션을 수정합니다.

    ```
    {
        "version":"0",
        "id":"abcdef00-1234-5678-9abc-def012345678",
        "detail-type":"Glue Data Catalog Table State Change",
        "source":"aws.glue",
        "account":"123456789012",
        "time":"2017-09-07T18:57:21Z",
        "region":"us-west-2",
        "resources":["arn:aws:glue:us-west-2:123456789012:database/default/foo"],
        "detail":{
            "changedPartitions": [
                "2018,01",
                "2018,02"
            ],
            "databaseName": "default",
            "tableName": "foo",
            "typeOfChange": "BatchCreatePartition"
            }
    }
    ```

자세한 내용은 [Amazon CloudWatch Events 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/)를 참조하세요. AWS Glue에 한정되는 이벤트는 [AWS Glue 이벤트](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types)를 참조하십시오.

# AWS Glue 리소스 모니터링
<a name="monitor-resource-metrics"></a>

AWS Glue에는 예상치 못한 과도한 프로비저닝과 요금 증가를 의도한 악의적인 행동으로부터 고객을 보호하기 위한 서비스 한도가 있습니다. 또한 이러한 한도는 서비스도 보호합니다. AWS Service Quota 콘솔에 로그인하면 고객은 현재 리소스 한도를 확인하고 필요한 경우 리소스 증가를 요청할 수 있습니다.

AWS Glue에서는 Amazon CloudWatch에서 서비스의 리소스 사용량을 백분율로 보고 사용량을 모니터링하도록 CloudWatch 경보를 구성할 수 있습니다. Amazon CloudWatch는 Amazon 인프라에서 실행되는 AWS 리소스 및 고객 애플리케이션에 대한 모니터링을 제공합니다. 지표는 무료로 제공됩니다. 다음과 같은 지표가 지원됩니다.
+ 계정당 워크플로우 수
+ 계정당 트리거 수
+ 계정당 작업 수
+ 계정당 동시 작업 실행 개수
+ 계정당 청사진 수
+ 계정당 대화형 세션 수

## 리소스 지표 구성 및 사용
<a name="monitor-resource-metrics"></a>

이 기능을 사용하려면 Amazon CloudWatch 콘솔로 이동하여 지표를 보고 경보를 구성하면 됩니다. 지표는 AWS/Glue 네임스페이스 아래에 있으며 실제 리소스 사용량 수치를 리소스 할당량으로 나눈 백분율입니다. CloudWatch 지표는 사용자 계정으로 전송되므로 비용이 청구되지 않습니다. 예를 들어, 10개의 워크플로를 생성하고 서비스 할당량으로 최대 200개의 워크플로를 사용할 수 있는 경우 사용량은 10/200 = 5%이고, 그래프에는 5의 데이터 포인트가 백분율로 표시됩니다. 구체적으로 설명하면 다음과 같습니다.

```
Namespace: AWS/Glue
Metric name: ResourceUsage
Type: Resource
Resource: Workflow (or Trigger, Job, JobRun, Blueprint, InteractiveSession)
Service: Glue
Class: None
```

![\[리소스 지표\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/resource_monitoring_1.png)


CloudWatch 콘솔에서 지표에 대한 경보를 생성하려면:

1. 지표를 찾은 후에 **그래프로 표시된 지표**로 이동합니다.

1. **작업**에서 **경보 생성**을 클릭합니다.

1. 필요에 따라 경보를 구성합니다.

리소스 사용량이 변경될 때마다(예: 증가 또는 감소) 지표를 생성합니다. 그러나 리소스 사용량이 변하지 않는 경우에는 매시간 지표를 생성하므로 지속적인 CloudWatch 그래프가 생성됩니다. 데이터 포인트가 누락되는 것을 방지하기 위해 1시간 미만의 기간을 구성하는 것은 권장하지 않습니다.

또한 다음 예제에서처럼 AWS CloudFormation을 사용하여 경보를 구성할 수 있습니다. 이 예제에서 워크플로 리소스 사용량이 80%에 도달하면 기존 SNS 주제에 메시지를 보내는 경보가 트리거되며, 이 주제를 구독하면 알림을 받을 수 있습니다.

```
{
	"Type": "AWS::CloudWatch::Alarm",
	"Properties": {
		"AlarmName": "WorkflowUsageAlarm",
		"ActionsEnabled": true,
		"OKActions": [],
		"AlarmActions": [
			"arn:aws:sns:af-south-1:085425700061:Default_CloudWatch_Alarms_Topic"
		],
		"InsufficientDataActions": [],
		"MetricName": "ResourceUsage",
		"Namespace": "AWS/Glue",
		"Statistic": "Maximum",
		"Dimensions": [{
				"Name": "Type",
				"Value": "Resource"
			},
			{
				"Name": "Resource",
				"Value": "Workflow"
			},
			{
				"Name": "Service",
				"Value": "Glue"
			},
			{
				"Name": "Class",
				"Value": "None"
			}
		],
		"Period": 3600,
		"EvaluationPeriods": 1,
		"DatapointsToAlarm": 1,
		"Threshold": 80,
		"ComparisonOperator": "GreaterThanThreshold",
		"TreatMissingData": "notBreaching"
	}
}
```

# AWS CloudTrail을 사용하여 AWS Glue API 호출 로깅
<a name="monitor-cloudtrail"></a>

AWS Glue는 AWS Glue에서 사용자, 역할, 또는 AWS 서비스가 수행한 작업에 대한 레코드를 제공하는 서비스인 AWS CloudTrail와 통합됩니다. CloudTrail은 AWS Glue에 대한 모든 API 직접 호출을 이벤트로 캡처합니다. 캡처되는 직접 호출에는 AWS Glue 콘솔로부터의 직접 호출과 AWS Glue API 작업에 대한 코드 직접 호출이 포함됩니다. 추적을 생성하면 AWS Glue 이벤트를 포함한 CloudTrail 이벤트를 지속적으로 Amazon S3 버킷에 배포할 수 있습니다. 추적을 구성하지 않은 경우에도 CloudTrail 콘솔의 **이벤트 기록**에서 최신 이벤트를 볼 수 있습니다. CloudTrail에서 수집한 정보를 사용하여 AWS Glue에 수행된 요청, 요청이 수행된 IP 주소, 요청을 수행한 사람, 요청이 수행된 시간 및 추가 세부 정보를 확인할 수 있습니다.

CloudTrail에 대한 자세한 내용은 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하세요.

## CloudTrail의 AWS Glue 정보
<a name="monitor-cloudtrail-info"></a>

CloudTrail은 계정 생성 시 AWS 계정에서 사용되도록 설정됩니다. AWS Glue에서 활동이 발생하면 해당 활동이 **이벤트 기록**의 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. AWS 계정에서 최신 이벤트를 확인, 검색 및 다운로드할 수 있습니다. 자세한 설명은 [CloudTrail 이벤트 이력을 사용하여 이벤트 보기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)를 참조하세요.

AWS Glue에 대한 이벤트를 포함하여 AWS 계정에 이벤트를 지속적으로 기록하려면 추적을 생성합니다. CloudTrail은 *추적*을 사용하여 Amazon S3 버킷으로 로그 파일을 전송할 수 있습니다. 콘솔에서 추적을 생성하면 기본적으로 모든 AWS Region에 추적이 적용됩니다. 추적은 AWS 파티션에 있는 모든 리전의 이벤트를 로깅하고 지정된 Amazon S3 버킷으로 로그 파일을 전송합니다. 추가적으로, CloudTrail 로그에서 수집된 이벤트 데이터를 추가 분석 및 처리하도록 다른 AWS 서비스를 구성할 수 있습니다. 자세한 내용은 다음 자료를 참조하세요.
+ [AWS 계정에 대한 추적 생성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 지원 서비스 및 통합](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [CloudTrail에서 Amazon SNS 알림 구성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [여러 리전으로부터 CloudTrail 로그 파일 받기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html) 및 [여러 계정으로부터 CloudTrail 로그 파일 받기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

모든 AWS Glue 작업이 CloudTrail에서 로깅되고 [AWS Glue API](aws-glue-api.md)에서 문서화됩니다. 예를 들어 `CreateDatabase`, `CreateTable`, `CreateScript` 작업을 직접 호출하면 CloudTrail 로그 파일에 항목이 생성됩니다.

모든 이벤트 또는 로그 항목에는 요청을 생성했던 사용자에 관한 정보가 포함됩니다. ID 정보를 이용하면 다음을 쉽게 판단할 수 있습니다.
+ 요청을 루트로 했는지 아니면 IAM 사용자 자격 증명 정보로 했는지 여부.
+ 역할 또는 페더레이션 사용자의 임시 자격 증명을 사용하여 요청이 생성되었는지 여부.
+ 다른 AWS 서비스에서 요청했는지.

자세한 설명은 [CloudTrail userIdentity 요소](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)를 참조하세요.

그러나 CloudTrail은 호출에 따른 모든 정보를 로그하지 않습니다. 예를 들어, 연결에 사용된 `ConnectionProperties`와 같은 특정 민감한 정보는 로그하지 않고 다음 API에 의해 반환된 응답 대신 `null`을 로그합니다.

```
BatchGetPartition       GetCrawlers          GetJobs          GetTable
CreateScript            GetCrawlerMetrics    GetJobRun        GetTables
GetCatalogImportStatus  GetDatabase          GetJobRuns       GetTableVersions
GetClassifier           GetDatabases         GetMapping       GetTrigger
GetClassifiers          GetDataflowGraph     GetObjects       GetTriggers
GetConnection           GetDevEndpoint       GetPartition     GetUserDefinedFunction
GetConnections          GetDevEndpoints      GetPartitions    GetUserDefinedFunctions
GetCrawler              GetJob               GetPlan
```

## AWS Glue 로그 파일 항목 이해
<a name="monitor-cloudtrail-logs"></a>

추적이란 지정한 Amazon S3 버킷에 이벤트를 로그 파일로 입력할 수 있게 하는 구성입니다. CloudTrail 로그 파일에는 하나 이상의 로그 항목이 포함될 수 있습니다. 이벤트는 모든 소스로부터의 단일 요청을 나타내며 요청 작업, 작업 날짜와 시간, 요청 파라미터 등에 대한 정보가 들어 있습니다. CloudTrail 로그 파일은 퍼블릭 API 직접 호출의 주문 스택 트레이스가 아니므로 특정 순서로 표시되지 않습니다.

다음 예제는 `DeleteCrawler` 작업을 보여주는 CloudTrail 로그 항목이 나타냅니다.

```
{
  "eventVersion": "1.05",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AKIAIOSFODNN7EXAMPLE",
    "arn": "arn:aws:iam::123456789012:user/johndoe",
    "accountId": "123456789012",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "userName": "johndoe"
  },
  "eventTime": "2017-10-11T22:29:49Z",
  "eventSource": "glue.amazonaws.com",
  "eventName": "DeleteCrawler",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "72.21.198.64",
  "userAgent": "aws-cli/1.11.148 Python/3.6.1 Darwin/16.7.0 botocore/1.7.6",
  "requestParameters": {
    "name": "tes-alpha"
  },
  "responseElements": null,
  "requestID": "b16f4050-aed3-11e7-b0b3-75564a46954f",
  "eventID": "e73dd117-cfd1-47d1-9e2f-d1271cad838c",
  "eventType": "AwsApiCall",
  "recipientAccountId": "123456789012"
}
```

다음은 `CreateConnection` 작업을 설명하는 CloudTrail 로그 항목을 보여주는 예제입니다.

```
{
  "eventVersion": "1.05",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AKIAIOSFODNN7EXAMPLE",
    "arn": "arn:aws:iam::123456789012:user/johndoe",
    "accountId": "123456789012",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "userName": "johndoe"
  },
  "eventTime": "2017-10-13T00:19:19Z",
  "eventSource": "glue.amazonaws.com",
  "eventName": "CreateConnection",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "72.21.198.66",
  "userAgent": "aws-cli/1.11.148 Python/3.6.1 Darwin/16.7.0 botocore/1.7.6",
  "requestParameters": {
    "connectionInput": {
      "name": "test-connection-alpha",
      "connectionType": "JDBC",
      "physicalConnectionRequirements": {
        "subnetId": "subnet-323232",
        "availabilityZone": "us-east-1a",
        "securityGroupIdList": [
          "sg-12121212"
        ]
      }
    }
  },
  "responseElements": null,
  "requestID": "27136ebc-afac-11e7-a7d6-ab217e5c3f19",
  "eventID": "e8b3baeb-c511-4597-880f-c16210c60a4a",
  "eventType": "AwsApiCall",
  "recipientAccountId": "123456789012"
}
```