

# 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()와 같은 비결정적 함수는 구체화된 뷰 정의에서 지원되지 않습니다.