

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

# モニタリング設定を使用した、Spark Kubernetes オペレータと Spark ジョブのモニタリング
<a name="spark-operator-monitoring-configuration"></a>

モニタリング設定を使用することにより、Spark アプリケーションとオペレータログのログアーカイブを Amazon S3 または Amazon CloudWatchに簡単に設定できます。1 つまたは両方を選択することができます。これにより、Spark オペレータポッド、ドライバー、エグゼキュターポッドにログエージェントのサイドカーが追加され、その後、これらのコンポーネントのログが設定されたシンクに転送されます。

## 前提条件
<a name="spark-operator-monitoring-configuration-prereqs"></a>

モニタリングを続行する前に、以下の設定タスクを完了していることを確認してください:

1. (オプション) Spark 演算子の古いバージョンを以前にインストールしている場合は、*SparkApplication/ScheduledSparkApplication* CRD を削除します。

   ```
   kubectl delete crd scheduledsparkapplications.sparkoperator.k8s.io
   kubectl delete crd sparkapplications.sparkoperator.k8s.io
   ```

1. まだ持っていない場合は、IAM でオペレータ/ジョブ実行ロールを作成します。

1. 次のコマンドを実行して、先ほど作成したオペレータ/ジョブ実行ロールの信頼ポリシーを更新します:

   ```
   aws emr-containers update-role-trust-policy \ 
   --cluster-name cluster \
   --namespace namespace \
   --role-name iam_role_name_for_operator/job_execution_role
   ```

1. IAM ロール信頼ポリシーを編集し、 オペレータ/ジョブ実行ロールを以下に更新します:

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

1. 次のアクセス許可を使用して、IAM で *monitoringConfiguration* ポリシーを作成します:

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "logs:DescribeLogStreams",
           "logs:CreateLogStream",
           "logs:CreateLogGroup",
           "logs:PutLogEvents"
         ],
         "Resource": [
           "arn:aws:logs:*:*:log-group:log_group_name",
           "arn:aws:logs:*:*:log-group:log_group_name:*"
         ],
         "Sid": "AllowLOGSDescribelogstreams"
       },
       {
         "Effect": "Allow",
         "Action": [
           "logs:DescribeLogGroups"
         ],
         "Resource": [
           "*"
         ],
         "Sid": "AllowLOGSDescribeloggroups"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:GetObject",
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::bucket_name",
           "arn:aws:s3:::bucket_name/*"
         ],
         "Sid": "AllowS3Putobject"
       }
     ]
   }
   ```

------

1. オペレータ/ジョブ実行ロールにポリシーを添付します。

# Spark オペレータログ
<a name="spark-operator-monitoring-configuration-logs"></a>

モニタリング設定は、`helm install` を実行するときに以下の方法で定義できます:

```
helm install spark-operator spark-operator \
--namespace namespace \
--set emrContainers.awsRegion=aws_region \
--set emrContainers.monitoringConfiguration.image=log_agent_image_url \
--set emrContainers.monitoringConfiguration.s3MonitoringConfiguration.logUri=S3_bucket_uri \
--set emrContainers.monitoringConfiguration.cloudWatchMonitoringConfiguration.logGroupName=log_group_name \
--set emrContainers.monitoringConfiguration.cloudWatchMonitoringConfiguration.logStreamNamePrefix=log_stream_prefix \
--set emrContainers.monitoringConfiguration.sideCarResources.limits.cpuLimit=500m \
--set emrContainers.monitoringConfiguration.sideCarResources.limits.memoryLimit=512Mi \
--set emrContainers.monitoringConfiguration.containerLogRotationConfiguration.rotationSize=2GB \
--set emrContainers.monitoringConfiguration.containerLogRotationConfiguration.maxFilesToKeep=10 \
--set webhook.enable=true \
--set emrContainers.operatorExecutionRoleArn=operator_execution_role_arn
```

**モニタリング設定**

次に、**monitoringConfiguration** で使用できる設定オプションを示します。
+ **イメージ** (オプション) – エージェントイメージ URL を記録します。指定しない場合、emrReleaseLabel で取得されます。
+ **s3MonitoringConfiguration** – このオプションを設定して Amazon S3 にアーカイブします。
  + **logUri** – (必須) – ログの保存先への Amazon S3 バケットパス。
  + 以下は、ログのアップロード後の Amazon S3 バケットパスのサンプル形式です。最初の例は、ログローテーションが有効になっていないことを示しています。

    ```
    s3://${logUri}/${POD NAME}/operator/stdout.gz
    s3://${logUri}/${POD NAME}/operator/stderr.gz
    ```

    ログローテーションはデフォルトで有効になっています。増分インデックスを含むローテーションされたファイルと、前のサンプルと同じ現在のファイルの両方を表示できます。

    ```
    s3://${logUri}/${POD NAME}/operator/stdout_YYYYMMDD_index.gz
    s3://${logUri}/${POD NAME}/operator/stderr_YYYYMMDD_index.gz
    ```
+ **cloudWatchMonitoringConfiguration** – Amazon CloudWatchへの転送をセットアップするための設定キー。
  + **logGroupName** (必須) – Amazon CloudWatch ログを送信するロググループの名前。このグループが存在しない場合は自動的に作成されます。
  + **logStreamNamePrefix** (オプション) – ログの送信先となるログストリームの名前。デフォルト値は空の文字列です。の形式 Amazon CloudWatch は次のとおりです。

    ```
    ${logStreamNamePrefix}/${POD NAME}/STDOUT or STDERR
    ```
+ **sideCarResources** (オプション) – 起動した Fluentd サイドカーコンテナにリソース制限を設定するための設定キー。
  + **memoryLimit** (オプション) – メモリ制限。必要に応じて調整してください。デフォルトは 512Mi です。
  + **cpuLimit** (オプション) – CPU 制限。必要に応じて調整してください。デフォルトは 500m です。
+ **containerLogRotationConfiguration** (オプション) – コンテナログローテーションの動作を制御します。このエージェントは、デフォルトでは有効になっています。
  + **rotationSize** (必須) - ログローテーションのファイルサイズを指定します。指定できる値の範囲は 2 KB～2 GB です。rotationSize パラメータの数値単位部分は整数として渡されます。小数値はサポートされていないため、値 1500 MB などに 1.5 GB のローテーションサイズを指定できます。デフォルトは 2 GB です。
  + **maxFilesToKeep** (必須) — ローテーションが行われた後にコンテナに保持するファイルの最大数を指定します。最小値は 1 で、最大値は 50 です。デフォルトは 10 です。

*monitoringConfiguration* を設定したら、Amazon S3 バケット Amazon CloudWatch または両方で spark 演算子ポッドログを確認できます。Amazon S3 バケットの場合、最初のログファイルがフラッシュされるまで 2 分待つ必要があります。

ログインを確認するには Amazon CloudWatch、**CloudWatch** > **Log groups** > ***Log group name*** > *Pod name***/operator/stderr** に移動します。

または、**[CloudWatch]** > **[ロググループ]** > ***[ロググループ名]*** > *[ポッド名***/演算子/stdout]** に移動できます。

# Spark アプリケーションログ
<a name="spark-operator-monitoring-application-logs"></a>

この設定は、次の方法で定義できます。

```
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: namespace
spec:
  type: Scala
  mode: cluster
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar"
  sparkVersion: "3.3.1"
  emrReleaseLabel: emr_release_label
  executionRoleArn: job_execution_role_arn
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1200m"
    memory: "512m"
    labels:
      version: 3.3.1
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 3.3.1
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  monitoringConfiguration:
    image: "log_agent_image"
    s3MonitoringConfiguration:
      logUri: "S3_bucket_uri"
    cloudWatchMonitoringConfiguration:
      logGroupName: "log_group_name"
      logStreamNamePrefix: "log_stream_prefix"
    sideCarResources:
      limits:
        cpuLimit: "500m"
        memoryLimit: "250Mi"
    containerLogRotationConfiguration:
      rotationSize: "2GB"
      maxFilesToKeep: "10"
```

次に、**monitoringConfiguration** で使用できる設定オプションを示します。
+ **イメージ** (オプション) – エージェントイメージ URL を記録します。指定しない場合、emrReleaseLabel で取得されます。
+ **s3MonitoringConfiguration** – このオプションを設定して Amazon S3 にアーカイブします。
  + **logUri** (必須) – ログの保存先への Amazon S3 バケットパス。最初の例は、ログローテーションが有効になっていないことを示しています。

    ```
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout.gz
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr.gz
    ```

    デフォルトで、ログローテーションが有効になっています。ローテーションするファイル (インデックスを復活させて) と現在のファイル (日付スタンプがないファイル) の両方を使用できます。

    ```
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout_YYYYMMDD_index.gz
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr_YYYYMMDD_index.gz
    ```
+ **cloudWatchMonitoringConfiguration** - Amazon CloudWatchへの転送をセットアップするための設定キー。
  + **logGroupName** (必須) - ログの送信となる CloudWatch ロググループの名前。このグループが存在しない場合は自動的にこのグループが作成されます。
  + **logStreamNamePrefix** (オプション) – ログの送信先となるログストリームの名前。デフォルト値は空の文字列です。CloudWatch の形式は次のとおりです。

    ```
    ${logStreamNamePrefix}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout
    ${logStreamNamePrefix}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr
    ```
+ **sideCarResources** (オプション) – 起動した Fluentd サイドカーコンテナにリソース制限を設定するための設定キー。
  + **memoryLimit** (オプション) – メモリ制限。必要に応じて調整してください。デフォルトは 250Mi です。
  + **cpuLimit** – CPU 制限。必要に応じて調整してください。デフォルトは 500m です。
+ **containerLogRotationConfiguration** (オプション) – コンテナログローテーションの動作を制御します。このエージェントは、デフォルトでは有効になっています。
  + **rotationSize** (必須) - ログローテーションのファイルサイズを指定します。指定できる値の範囲は 2 KB～2 GB です。rotationSize パラメータの数値単位部分は整数として渡されます。小数値はサポートされていないため、値 1500 MB などに 1.5 GB のローテーションサイズを指定できます。デフォルトは 2 GB です。
  + **maxFilesToKeep** (必須) — ローテーションが行われた後にコンテナに保持するファイルの最大数を指定します。最小値は 1 です。最大値は 50 です。デフォルトは 10 です。

monitoringConfiguration を設定したら、Amazon S3 バケット、CloudWatch、またはその両方で Spark アプリケーションドライバーとエグゼキュターのログを確認できます。Amazon S3 バケットの場合、最初のログファイルがフラッシュされるまで 2 分待つ必要があります。例えば、Amazon S3 では、バケットパスは以下のようになります:

**[Amazon S3]** > **[バケット]** > ***[バケット名]*** > *[Spark アプリケーション名 - UUID]* > *[ポッド名*] > **[stderr.gz]**

または:

**[Amazon S3]** > **[バケット]** > ***[バケット名]*** > *[Spark アプリケーション名 - UUID]* > *[ポッド名*] > **[stdout.gz]**

CloudWatch では、パスは以下のようになります:

**[loudWatch]** > **[ロググループ]** > ***[ロググループ名]*** > *[Spark アプリケーション名 - UUID]*/*[ポッド名]*/**[stdout.gz]**

または:

**[loudWatch]** > **[ロググループ]** > ***[ロググループ名]*** > *[Spark アプリケーション名 - UUID]*/*[ポッド名]*/**[stdout]**