

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon EMR on EKS에 대한 Spark 운영자를 사용하여 수직 자동 조정 사용
<a name="spark-operator-vas"></a>

Amazon EMR 7.0부터 Amazon EMR on EKS 수직 자동 조정을 사용하여 리소스 관리를 간소화할 수 있습니다. 이 기능은 Amazon EMR Spark 애플리케이션에 제공하는 워크로드 요구 사항에 맞게 메모리와 CPU 리소스를 자동으로 튜닝합니다. 자세한 내용은 [Amazon EMR Spark 작업에 수직 자동 조정 사용](jobruns-vas.md) 단원을 참조하십시오.

이 섹션에서는 수직 자동 조정을 사용하도록 Spark 운영자를 구성하는 방법을 설명합니다.

## 사전 조건
<a name="spark-operator-vas-prereqs"></a>

모니터링을 구성하기 전에 다음 설정 작업을 완료하세요.
+ [Amazon EMR on EKS에 대한 Spark 운영자 구성](spark-operator-setup.md)의 단계를 수행하세요.
+ (선택 사항) 이미 이전 버전의 Spark 운영자를 설치한 경우 SparkApplication/ScheduledSparkApplication CRD를 삭제합니다.

  ```
  kubectl delete crd sparkApplication
  kubectl delete crd scheduledSparkApplication
  ```
+ [Spark 운영자 설치](spark-operator-gs.md#spark-operator-install)의 단계를 수행하세요. 3단계에서 운영자에서 웹후크를 허용하도록 설치 명령에 다음 줄을 추가합니다.

  ```
  --set webhook.enable=true
  ```
+ [Amazon EMR on EKS에서 수직 자동 조정 설정](jobruns-vas-setup.md)의 단계를 수행하세요.
+ Amazon S3 위치의 파일에 대한 액세스 권한을 부여합니다.

  1. S3 권한이 있는 `JobExecutionRole`로 드라이버 및 연산자 서비스 계정에 주석을 지정합니다.

     ```
     kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark eks.amazonaws.com/role-arn=JobExecutionRole
     kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark-operator eks.amazonaws.com/role-arn=JobExecutionRole
     ```

  1. 해당 네임스페이스에서 작업 실행 역할의 신뢰 정책을 업데이트합니다.

     ```
     aws emr-containers update-role-trust-policy \
     --cluster-name cluster \
     --namespace ${Namespace}\
     --role-name iam_role_name_for_job_execution
     ```

  1. 작업 실행 역할의 IAM 역할 신뢰 정책을 편집하고 `serviceaccount`를 `emr-containers-sa-spark-*-*-xxxx`에서 `emr-containers-sa-*`로 업데이트합니다.

     ```
     {
         "Effect": "Allow",
         "Principal": {
             "Federated": "OIDC-provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
             "StringLike": {
                 "OIDC": "system:serviceaccount:${Namespace}:emr-containers-sa-*"
             }
         }
     }
     ```

  1. Amazon S3를 파일 스토리지로 사용하는 경우 yaml 파일에 다음 기본값을 추가합니다.

     ```
     hadoopConf:
     # EMRFS filesystem
       fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider
       fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem
       fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate
       fs.s3.buffer.dir: /mnt/s3
       fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000"
       mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2"
       mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true"
     sparkConf:
      # Required for EMR Runtime
      spark.driver.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*
      spark.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native
      spark.executor.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*
      spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native
     ```

## Spark 운영자에서 수직 자동 조정 기능을 사용하여 작업을 실행합니다.
<a name="spark-operator-vas-run"></a>

Spark 운영자와 함께 Spark 애플리케이션을 실행하려면 먼저 [사전 조건](#spark-operator-vas-prereqs)의 단계를 완료해야 합니다.

Spark 운영자와 함께 수직 자동 조정을 사용하려면 Spark 애플리케이션 사양의 드라이버에 다음 구성을 추가하여 수직 자동 조정을 켭니다.

```
dynamicSizing:
  mode: Off
  signature: "my-signature"
```

이 구성은 수직 자동 크기 조정을 활성화하며, 작업에 대한 서명을 선택할 수 있는 필수 서명 구성입니다.

구성 및 파라미터 값에 대한 자세한 내용은 [Amazon EMR on EKS에 대한 수직 자동 조정 구성](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/jobruns-vas-configure.html)을 참조하세요. 기본적으로 작업은 수직 자동 조정의 모니터링 전용 **꺼짐** 모드로 제출됩니다. 이 모니터링 상태를 사용하면 자동 조정을 수행하지 않고도 리소스 권장 사항을 계산하고 볼 수 있습니다. 자세한 내용은 [수직 오토 스케일링 모드](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/jobruns-vas-configure.html#jobruns-vas-parameters-opt-mode)를 참조하세요.

다음 예제에서는 수직 자동 조정을 사용하는 데 필요한 구성이 포함된 `SparkApplication` 정의 파일 `spark-pi.yaml`을 보여줍니다.

```
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: spark-operator
spec:
  type: Scala
  mode: cluster
  image: "895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-7.12.0:latest"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar"
  sparkVersion: "3.4.1"
  dynamicSizing:
    mode: Off
    signature: "my-signature"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1200m"
    memory: "512m"
    labels:
      version: 3.4.1
    serviceAccount: emr-containers-sa-spark
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 3.4.1
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
```

이제, 다음 명령을 사용하여 Spark 애플리케이션을 제출합니다. 이렇게 하면 이름이 `spark-pi`인 `SparkApplication` 객체도 생성됩니다.

```
kubectl apply -f spark-pi.yaml
```

Spark 운영자를 통해 Spark에 애플리케이션을 제출하는 방법에 대한 자세한 내용은 GitHub의 `spark-on-k8s-operator` 설명서에서 [Using a `SparkApplication`](https://www.kubeflow.org/docs/components/spark-operator/user-guide/using-sparkapplication/)를 참조하세요.

## 수직 자동 조정 기능 확인
<a name="spark-operator-vas-verify"></a>

제출된 작업에 대해 수직 자동 조정이 올바르게 작동하는지 확인하려면 kubectl을 사용하여 `verticalpodautoscaler` 사용자 지정 리소스를 가져오고 조정 권장 사항을 확인합니다.

```
kubectl get verticalpodautoscalers --all-namespaces \ 
-l=emr-containers.amazonaws.com/dynamic.sizing.signature=my-signature
```

이 쿼리에 대한 출력은 다음과 비슷합니다.

```
NAMESPACE        NAME                                                          MODE   CPU   MEM         PROVIDED   AGE
spark-operator   ds-p73j6mkosvc4xeb3gr7x4xol2bfcw5evqimzqojrlysvj3giozuq-vpa   Off          580026651   True       15m
```

출력이 비슷하지 않거나 오류 코드를 포함하는 경우 문제 해결을 위한 단계는 [Amazon EMR on EKS 수직 자동 조정 문제 해결](troubleshooting-vas.md) 섹션을 참조하세요.

포드 및 애플리케이션을 제거하려면 다음 명령을 실행합니다.

```
kubectl delete sparkapplication spark-pi
```