Amazon EMR on EKS で Spark 演算子の使用を開始する - Amazon EMR

Amazon EMR on EKS で Spark 演算子の使用を開始する

このトピックは、Spark アプリケーションとスケジュール Spark アプリケーションをデプロイして、Amazon EKS で Spark 演算子の使用を開始するのに役立ちます。

Spark 演算子をインストールする

Apache Spark 用の Kubernetes 演算子をインストールするには、以下のステップを実行します。

  1. Amazon EMR on EKS での Spark 演算子のセットアップ」のステップをまだ完了していない場合は完了します。

  2. Amazon ECR レジストリに対し、Helm クライアントを認証します。以下のコマンドで、region-id 値を任意の AWS リージョンに置き換え、リージョン別の Amazon ECR レジストリアカウント ページに表示されているリージョンに対応する ECR-registry-account 値を置き換えます。

    aws ecr get-login-password \ --region region-id | helm registry login \ --username AWS \ --password-stdin ECR-registry-account.dkr.ecr.region-id.amazonaws.com
  3. 以下のコマンドで Spark 演算子をインストールします。

    Helm チャート --version パラメータには、emr- プレフィックスと日付サフィックスを削除した Amazon EMR リリースラベルを使用してください。例えば、emr-6.12.0-java17-latest リリースでは、6.12.0-java17 を指定します。以下のコマンドの例では emr-7.3.0-latest リリースを使用しているため、Helm チャート --version 用に 7.3.0 を指定しています。

    helm install spark-operator-demo \ oci://895885662937.dkr.ecr.region-id.amazonaws.com/spark-operator \ --set emrContainers.awsRegion=region-id \ --version 7.3.0 \ --namespace spark-operator \ --create-namespace

    デフォルトでは、このコマンドは Spark 演算子のサービスアカウント emr-containers-sa-spark-operator を作成します。別のサービスアカウントを使用するには、引数 serviceAccounts.sparkoperator.name を指定します。例:

    --set serviceAccounts.sparkoperator.name my-service-account-for-spark-operator

    Spark 演算子で垂直的自動スケーリングを使用する場合は、インストールコマンドに以下の行を追加して、演算子にウェブフックを許可します。

    --set webhook.enable=true
  4. helm list コマンドで Helm チャートをインストールしたことを確認します。

    helm list --namespace spark-operator -o yaml

    helm list コマンドは、新しくデプロイした Helm チャートのリリース情報を返します。

    app_version: v1beta2-1.3.8-3.1.1 chart: spark-operator-7.3.0 name: spark-operator-demo namespace: spark-operator revision: "1" status: deployed updated: 2023-03-14 18:20:02.721638196 +0000 UTC
  5. 必要な追加オプションを指定してインストールを完了します。詳しくは、GitHub の「spark-on-k8s-operator」ドキュメントを参照してください。

Spark アプリケーションの実行

Spark 演算子は Amazon EMR 6.10.0 以降でサポートされています。Spark 演算子をインストールすると、Spark アプリケーションを実行するサービスアカウント emr-containers-sa-spark がデフォルトで作成されます。Amazon EMR on EKS 6.10.0 以降で Spark 演算子を使用して Spark アプリケーションを実行するには、以下のステップを実行します。

  1. Spark 演算子を使用して Spark アプリケーションを実行する前に、Amazon EMR on EKS での Spark 演算子のセットアップ および Spark 演算子をインストールする のステップを完了してください。

  2. 以下の例の内容で 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-6.10.0:latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar" sparkVersion: "3.3.1" restartPolicy: type: Never volumes: - name: "test-volume" hostPath: path: "/tmp" type: Directory driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.3.1 serviceAccount: emr-containers-sa-spark volumeMounts: - name: "test-volume" mountPath: "/tmp" executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.3.1 volumeMounts: - name: "test-volume" mountPath: "/tmp"
  3. 次に、以下のコマンドを使用して、Spark アプリケーションを送信します。これにより、spark-pi という名前の SparkApplication オブジェクトも作成されます。

    kubectl apply -f spark-pi.yaml
  4. 次のコマンドで SparkApplication オブジェクトのイベントがないか確認します。

    kubectl describe sparkapplication spark-pi --namespace spark-operator

Spark 演算子を使用して Spark にアプリケーションを送信する方法の詳細については、GitHub の spark-on-k8s-operator ドキュメントの「Using a SparkApplication」を参照してください。

Amazon S3 for storage を使用する

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

Amazon EMR リリース 7.2.0 以降を使用している場合、この設定はデフォルトで含まれています。この場合、Spark アプリケーション YAML ファイルの local://<file_path> ではなく、s3://<bucket_name>/<file_path> にファイルパスを設定できます。

次に、Spark アプリケーションを通常どおり送信します。