

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

# spark-submit を使用して Spark ジョブを実行する
<a name="spark-submit"></a>

Amazon EMR リリース 6.10.0 以降では、Spark アプリケーションを Amazon EMR on EKS クラスターに送信して実行するために使用できるコマンドラインツールとして `spark-submit` がサポートされています。

**注記**  
Amazon EMR は、vCPU とメモリ消費量に基づいて Amazon EKS の料金を算出します。この計算は、ドライバーポッドとエグゼキュターポッドに適用されます。この計算は、Amazon EMR アプリケーションイメージをダウンロードしてから Amazon EKS ポッドが終了するまでに開始され、秒単位で四捨五入されます。

**Topics**
+ [

# Amazon EMR on EKS での spark-submit のセットアップ
](spark-submit-setup.md)
+ [

# Amazon EMR on EKS で spark-submit の使用を開始する
](spark-submit-gs.md)
+ [

# spark-submit の Spark ドライバーサービスアカウントセキュリティ要件を確認する
](spark-submit-security.md)

# Amazon EMR on EKS での spark-submit のセットアップ
<a name="spark-submit-setup"></a>

Amazon EMR on EKS で spark-submit を使用してアプリケーションを実行する前に、以下のタスクを完了してセットアップを行います。Amazon Web Services (AWS) に既にサインアップしていて、Amazon EKS を既に使用している場合、Amazon EMR on EKS を使用する準備はほぼ整っています。前提条件のいずれかを既に完了している場合は、その前提条件をスキップして、次の前提条件に進むことができます。
+ **[の最新バージョンをインストールまたは更新する AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) ** – をすでにインストールしている場合は AWS CLI、最新バージョンがあることを確認します。
+ **[kubectl と eksctl の設定](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)** — eksctl は、Amazon EKS との通信に使用するコマンドラインツールです。
+ **[Amazon EKS – eksctl の使用開始](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)** – Amazon EKS にノードを持つ新しい Kubernetes クラスターを作成する手順に従います。
+ **[Amazon EMR ベースイメージ URI (リリース 6.10.0 以上) を選択する](docker-custom-images-tag.md)** – `spark-submit` コマンドは Amazon EMR リリース 6.10.0 以降でサポートされています。
+ ドライバーサービスアカウントにエグゼキューターポッドを作成および監視するための適切な権限があることを確認します。詳細については、「[spark-submit の Spark ドライバーサービスアカウントセキュリティ要件を確認する](spark-submit-security.md)」を参照してください。
+ ローカルの [AWS 認証情報プロファイル](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)をセットアップします。
+ Amazon EKS コンソールから EKS クラスターを選択し、**[概要]** **[詳細]**、**[API サーバーエンドポイント]** にある EKS クラスターエンドポイントを見つけます。

# Amazon EMR on EKS で spark-submit の使用を開始する
<a name="spark-submit-gs"></a>

Amazon EMR 6.10.0 以降では、Amazon EKS クラスターで Spark アプリケーションを実行するための spark-submit がサポートされています。次のセクションでは、Spark アプリケーションのコマンドを送信する方法を示します。

## Spark アプリケーションの実行
<a name="spark-submit-run"></a>

Spark アプリケーションを実行するには、以下の手順に従います。

1. `spark-submit` コマンドで Spark アプリケーションを実行する前に、「[Amazon EMR on EKS での spark-submit のセットアップ](spark-submit-setup.md)」のステップを完了してください。

1. Amazon EMR on EKS ベースイメージを使用してコンテナを実行します。詳細については、「[ベースイメージ URI を選択する方法](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html)」を参照してください。

   ```
   kubectl run -it containerName --image=EMRonEKSImage --command -n namespace /bin/bash
   ```

1. 次の環境変数の値を設定します。

   ```
   export SPARK_HOME=spark-home
   export MASTER_URL=k8s://Amazon EKS-cluster-endpoint
   ```

1. 次に、以下のコマンドを使用して、Spark アプリケーションを送信します。

   ```
   $SPARK_HOME/bin/spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master $MASTER_URL \
    --conf spark.kubernetes.container.image=895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.10.0:latest \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
    --deploy-mode cluster \
    --conf spark.kubernetes.namespace=spark-operator \
    local:///usr/lib/spark/examples/jars/spark-examples.jar 20
   ```

Spark へのアプリケーションの送信の詳細については、Apache Spark ドキュメントの「[Submitting applications](https://spark.apache.org/docs/latest/submitting-applications.html)」を参照してください。

**重要**  
`spark-submit` は送信メカニズムとしてクラスターモードのみをサポートします。

# spark-submit の Spark ドライバーサービスアカウントセキュリティ要件を確認する
<a name="spark-submit-security"></a>

Spark ドライバーポッドは Kubernetes サービスアカウントを使用して Kubernetes API サーバーにアクセスし、エグゼキューターポッドを作成および監視します。ドライバーサービスアカウントには、クラスター内のポッドの一覧表示、作成、編集、パッチ適用、削除を行うために適切な権限が必要です。以下のコマンドを実行して、リソースを一覧表示できることを確認できます。

```
kubectl auth can-i list|create|edit|delete|patch pods
```

各コマンドを実行して必要な権限があることを確認します。

```
kubectl auth can-i list pods
kubectl auth can-i create pods
kubectl auth can-i edit pods
kubectl auth can-i delete pods
kubectl auth can-i patch pods
```

このサービスロールには、以下の規則が適用されます。

```
 rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - "*"
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - "*"
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - "*"
- apiGroups:
  - ""
  resources:
  - persistentvolumeclaims
  verbs:
  - "*"
```

# spark-submit のサービスアカウント (IRSA) に IAM ロールを設定する
<a name="spark-submit-security-irsa"></a>

以下のセクションでは、Amazon S3 に保存されている Spark アプリケーションを実行できるように、サービスアカウント (IRSA) の IAM ロールを設定して Kubernetes サービスアカウントを認証および承認する方法について説明します。

## 前提条件
<a name="spark-submit-security-irsa-prereqs"></a>

このドキュメントの例を試す前に、次の前提条件を満たしていることを確認してください。
+ [spark-submit の設定が完了している](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/spark-submit-setup.html)
+ [S3 バケットを作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)し、Spark アプリケーション jar を[アップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/uploading-an-object-bucket.html)している

## IAM ロールを引き受けるための Kubernetes サービスアカウントの設定
<a name="spark-submit-security-irsa-configure-kubernetes"></a>

次の手順では、 AWS Identity and Access Management (IAM) ロールを引き受けるように Kubernetes サービスアカウントを設定する方法について説明します。サービスアカウントを使用するようにポッドを設定したら、ロール AWS のサービス がアクセス許可を持つ任意の にアクセスできます。

1. [アップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/uploading-an-object-bucket.html)した Amazon S3 オブジェクトへの読み取り専用アクセスを許可するポリシーファイルを作成します。

   ```
   cat >my-policy.json <<EOF
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::<my-spark-jar-bucket>",
                   "arn:aws:s3:::<my-spark-jar-bucket>/*"
               ]
           }
       ]
   }
   EOF
   ```

1. IAM ポリシーを作成します。

   ```
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

1. IAM ロールを作成し、それを Spark ドライバーの Kubernetes サービスアカウントに関連付けます。

   ```
   eksctl create iamserviceaccount --name my-spark-driver-sa --namespace spark-operator \
   --cluster my-cluster --role-name "my-role" \
   --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
   ```

1. Spark ドライバーのサービスアカウントに必要な[アクセス権限](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/spark-submit-security.html)を持つ YAML ファイルを作成します。

   ```
   cat >spark-rbac.yaml <<EOF
   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     namespace: default
     name: emr-containers-role-spark
   rules:
   - apiGroups:
     - ""
     resources:
     - pods
     verbs:
     - "*"
   - apiGroups:
     - ""
     resources:
     - services
     verbs:
     - "*"
   - apiGroups:
     - ""
     resources:
     - configmaps
     verbs:
     - "*"
   - apiGroups:
     - ""
     resources:
     - persistentvolumeclaims
     verbs:
     - "*"
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: spark-role-binding
     namespace: default
   roleRef:
     apiGroup: rbac.authorization.k8s.io
     kind: Role
     name: emr-containers-role-spark
   subjects:
   - kind: ServiceAccount
     name: emr-containers-sa-spark
     namespace: default
   EOF
   ```

1. クラスターロールバインディング設定を適用します。

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

1. `kubectl` コマンドは、作成されたアカウントの確認を返します。

   ```
   serviceaccount/emr-containers-sa-spark created
   clusterrolebinding.rbac.authorization.k8s.io/emr-containers-role-spark configured
   ```

## Spark アプリケーションの実行
<a name="spark-submit-security-irsa-app-run"></a>

Amazon EMR 6.10.0 以降では、Amazon EKS クラスターで Spark アプリケーションを実行するための spark-submit がサポートされています。Spark アプリケーションを実行するには、以下の手順に従います。

1. [Amazon EMR on EKS の spark-submit 設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/spark-submit-setup.html)の手順が完了していることを確認してください。

1. 次の環境変数の値を設定します。

   ```
   export SPARK_HOME=spark-home
   export MASTER_URL=k8s://Amazon EKS-cluster-endpoint
   ```

1. 次に、以下のコマンドを使用して、Spark アプリケーションを送信します。

   ```
   $SPARK_HOME/bin/spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master $MASTER_URL \
    --conf spark.kubernetes.container.image=895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.15.0:latest \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=emr-containers-sa-spark \
    --deploy-mode cluster \
    --conf spark.kubernetes.namespace=default \
    --conf "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/*" \
    --conf "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" \
    --conf "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/*" \
    --conf "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" \
    --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.auth.WebIdentityTokenCredentialsProvider \
    --conf spark.hadoop.fs.s3.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem \
    --conf spark.hadoop.fs.AbstractFileSystem.s3.impl=org.apache.hadoop.fs.s3.EMRFSDelegate \
    --conf spark.hadoop.fs.s3.buffer.dir=/mnt/s3 \
    --conf spark.hadoop.fs.s3.getObject.initialSocketTimeoutMilliseconds="2000" \
    --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem="2" \
    --conf spark.hadoop.mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem="true" \
    s3://my-pod-bucket/spark-examples.jar 20
   ```

1. スパークドライバーが Spark ジョブを完了すると、Spark ジョブが完了したことを示すログラインが送信の最後に表示されます。

   ```
   23/11/24 17:02:14 INFO LoggingPodStatusWatcherImpl: Application org.apache.spark.examples.SparkPi with submission ID default:org-apache-spark-examples-sparkpi-4980808c03ff3115-driver finished
   23/11/24 17:02:14 INFO ShutdownHookManager: Shutdown hook called
   ```

## クリーンアップ
<a name="spark-submit-security-irsa-cleanup"></a>

アプリケーションの実行が完了したら、次のコマンドを使用してクリーンアップを実行できます。

```
kubectl delete -f spark-rbac.yaml
```