

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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)」を参照してください。

以下の例は、垂直的自動スケーリングを使用するために必要な設定を含む `spark-pi.yaml` という名前の `SparkApplication` 定義ファイルです。

```
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.13.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
```