

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon EMR on EKS 上 Flink 任務的維護和疑難排解
<a name="jobruns-flink-troubleshooting"></a>

下列各節概述如何維護長時間執行的 Flink 任務，並提供有關如何對 Flink 任務的一些常見問題進行故障診斷的指引。

# 維護 Flink 應用程式
<a name="jobruns-flink-maintain"></a>

**Topics**
+ [升級模式](#jobruns-flink-upgrademode)

Flink 應用程式通常設計為執行很長時間，例如數週、數月甚至數年。與所有長時間執行的服務一樣，Flink 串流應用程式需要進行維護。這包括錯誤修正、改善項目以及遷移至更高版本的 Flink 叢集。

當 `FlinkDeployment` 和 `FlinkSessionJob` 資源的規格發生變化時，您需要升級正在執行的應用程式。為此，操作員會停止正在執行的作業 (除非已暫停)，並使用最新規格重新部署，對於有狀態的應用程式，則使用上次執行的狀態。

使用者可透過 `JobSpec` 的 `upgradeMode` 設定來控制有狀態的應用程式停止和還原時如何管理狀態。

## 升級模式
<a name="jobruns-flink-upgrademode"></a>

選用介紹

**無狀態**  
無狀態應用程式從空狀態升級。

**最後狀態**  
在任何應用程式狀態下快速升級 (即使是失敗的作業) 時不需要運作正常的作業，因為一律會使用最新的成功檢查點。如果遺失 HA 中繼資料，可能需要手動復原。若要限制作業在擷取最新檢查點時回退的時間，您可以設定 `kubernetes.operator.job.upgrade.last-state.max.allowed.checkpoint.age`。如果檢查點早於設定的值，則會改為針對運作正常的作業採用儲存點。工作階段模式不支援此功能。

**儲存點**  
使用儲存點進行升級，可提供最大的安全性和作為備份/分叉點的可能性。儲存點將在升級過程中建立。請注意，需執行 Flink 作業才能建立儲存點。如果作業處於運作狀態不佳的狀態，則會使用最後一個檢查點 (除非 kubernetes.operator.job.upgrade.last-state-fallback.enabled 設定為 false)。如果最後一個檢查點無法使用，作業升級將會失敗。

# 疑難排解
<a name="jobruns-flink-troubleshoot"></a>

本章節描述了如何疑難排解 Amazon EMR on EKS 的問題。如需有關如何疑難排解 Amazon EMR 一般問題的資訊，請參閱《Amazon EMR 管理指南》**中的[對叢集進行疑難排解](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-troubleshoot.html)。
+ [使用 PersistentVolumeClaims (PVC) 對作業進行疑難排解](permissions-for-pvc.md)
+ [對 Amazon EMR on EKS 垂直自動擴展進行疑難排解](troubleshooting-vas.md)
+ [對 Amazon EMR on EKS Spark Operator 進行疑難排解](troubleshooting-sparkop.md)

## 對 Amazon EMR on EKS 中的 Apache Flink 進行疑難排解
<a name="jobruns-flink-troubleshooting-apache-flink"></a>

### 安裝 Helm Chart 時找不到資源映射
<a name="w2aac21c21b7b7b3"></a>

安裝 Helm Chart 時，可能會遇到下列錯誤訊息。

```
Error: INSTALLATION FAILED: pulling from host 1234567890.dkr.ecr.us-west-2.amazonaws.com failed with status code [manifests 6.13.0]: 403 Forbidden Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: [resource mapping not found for name: "flink-operator-serving-cert" namespace: "<the namespace to install your operator>" from "": no matches for kind "Certificate" in version "cert-manager.io/v1"

ensure CRDs are installed first, resource mapping not found for name: "flink-operator-selfsigned-issuer" namespace: "<the namespace to install your operator>" " from "": no matches for kind "Issuer" in version "cert-manager.io/v1"

ensure CRDs are installed first].
```

若要解決此錯誤，請安裝 cert-manager 以啟用新增 Webhook 元件。必須將 cert-manager 安裝到您使用的每個 Amazon EKS 叢集。

```
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0
```

### AWS 服務 存取遭拒錯誤
<a name="jobruns-flink-troubleshooting-access-denied"></a>

如果看到 *access denied* 錯誤，請確認 Helm Chart `values.yaml` 檔案中 `operatorExecutionRoleArn` 的 IAM 角色具有正確許可。此外，請確保 `FlinkDeployment` 規格中 `executionRoleArn` 下的 IAM 角色具有正確許可。

### `FlinkDeployment` 出現問題
<a name="jobruns-flink-troubleshooting-stuck"></a>

如果您的 `FlinkDeployment` 處於停止狀態，請使用下列步驟強制刪除部署：

1. 編輯部署執行。

   ```
   kubectl edit -n Flink Namespace flinkdeployments/App Name
   ```

1. 刪除此完成項。

   ```
   finalizers:
     - flinkdeployments.flink.apache.org/finalizer
   ```

1. 刪除部署。

   ```
   kubectl delete -n Flink Namespace flinkdeployments/App Name
   ```

### 在選擇加入中執行 Flink 應用程式時出現 s3a AWSBadRequestException 問題 AWS 區域
<a name="jobruns-flink-troubleshooting-optin-region"></a>

如果您在[選擇加入 AWS 區域](https://docs.aws.amazon.com/controltower/latest/userguide/opt-in-region-considerations.html)中執行 Flink 應用程式，您可能會看到下列錯誤：

```
Caused by: org.apache.hadoop.fs.s3a.AWSBadRequestException: getFileStatus on 
s3://flink.txt: com.amazonaws.services.s3.model.AmazonS3Exception: Bad Request 
(Service: Amazon S3; Status Code: 400; Error Code: 400 Bad Request; Request ID: ABCDEFGHIJKL; S3 Extended Request ID:
ABCDEFGHIJKLMNOP=; Proxy: null), S3 Extended Request ID: ABCDEFGHIJKLMNOP=:400 Bad Request: Bad Request 
(Service: Amazon S3; Status Code: 400; Error Code: 400 Bad Request; Request ID: ABCDEFGHIJKL; S3 Extended Request ID: ABCDEFGHIJKLMNOP=; Proxy: null)
```

```
Caused by: org.apache.hadoop.fs.s3a.AWSBadRequestException: getS3Region on flink-application: software.amazon.awssdk.services.s3.model.S3Exception: null 
(Service: S3, Status Code: 400, Request ID: ABCDEFGHIJKLMNOP, Extended Request ID: ABCDEFGHIJKLMNOPQRST==):null: null 
(Service: S3, Status Code: 400, Request ID: ABCDEFGHIJKLMNOP, Extended Request ID: AHl42uDNaTUFOus/5IIVNvSakBcMjMCH7dd37ky0vE6jhABCDEFGHIJKLMNOPQRST==)
```

若要修正這些錯誤，請在您的`FlinkDeployment`定義檔案中使用以下組態。

```
spec:
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "2"
    fs.s3a.endpoint.region: OPT_IN_AWS_REGION_NAME
```

我們也建議您使用 SDKv2 登入資料提供者：

```
fs.s3a.aws.credentials.provider: software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider
```

如果您想要使用 SDKv1 登入資料提供者，請確定您的 SDK 支援您的選擇加入區域。如需詳細資訊，請參閱 [aws-sdk-java GitHub 儲存庫](https://github.com/aws/aws-sdk-java)。

如果您在選擇加入區域中執行 Flink SQL 陳述式`S3 AWSBadRequestException`時收到 ，請確定您在 flink 組態規格`fs.s3a.endpoint.region: OPT_IN_AWS_REGION_NAME`中設定組態。

### 在 CN 區域中執行 Flink 工作階段任務時的 S3A AWSBadRequestException
<a name="jobruns-flink-troubleshooting-optin-region"></a>

對於 Amazon EMR 6.15.0 - 7.2.0 版，當您在 CN 區域執行 Flink 工作階段任務時，可能會遇到下列錯誤訊息。這些包括中國 （北京） 和中國 （寧夏）：

```
Error:  {"type":"org.apache.flink.kubernetes.operator.exception.ReconciliationException","message":"org.apache.hadoop.fs.s3a.AWSBadRequestException: 
                    getFileStatus on s3://ABCDPath: software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 400, Request ID: ABCDEFGH, Extended Request ID: 
                    ABCDEFGH:null: null (Service: S3, Status Code: 400, Request ID: ABCDEFGH, Extended Request ID: ABCDEFGH","additionalMetadata":{},"throwableList":
                    [{"type":"org.apache.hadoop.fs.s3a.AWSBadRequestException","message":"getFileStatus on s3://ABCDPath: software.amazon.awssdk.services.s3.model.S3Exception: 
                    null (Service: S3, Status Code: 400, Request ID: ABCDEFGH, Extended Request ID: ABCDEFGH:null: null (Service: S3, Status Code: 400, Request ID: ABCDEFGH, 
                    Extended Request ID: ABCDEFGH","additionalMetadata":{}},{"type":"software.amazon.awssdk.services.s3.model.S3Exception","message":"null (Service: S3, Status Code: 400, 
                    Request ID: ABCDEFGH, Extended Request ID: ABCDEFGH","additionalMetadata":{}}]}
```

知道此問題。團隊正在努力修補所有這些發行版本的 flink 運算子。不過，在我們完成修補程式之前，若要修正此錯誤，您需要下載 flink Operator helm Chart、將其解壓縮 （擷取壓縮檔案），並在 helm Chart 中進行組態變更。

特定步驟如下：

1. 將目錄變更為 Helm Chart 的本機資料夾，並執行下列命令列以提取 Helm Chart 並解壓縮 （擷取）。

   ```
   helm pull oci://public.ecr.aws/emr-on-eks/flink-kubernetes-operator \
   --version $VERSION \
   --namespace $NAMESPACE
   ```

   ```
   tar -zxvf flink-kubernetes-operator-$VERSION.tgz
   ```

1. 前往 helm Chart 資料夾並尋找 `templates/flink-operator.yaml` 檔案。

1. 尋找 `flink-operator-config` ConfigMap，並在 中新增下列`fs.s3a.endpoint.region`組態`flink-conf.yaml`。例如：

   ```
   {{- if .Values.defaultConfiguration.create }}
   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: flink-operator-config
     namespace: {{ .Release.Namespace }}
     labels:
       {{- include "flink-operator.labels" . | nindent 4 }}
   data:
     flink-conf.yaml: |+
   fs.s3a.endpoint.region: {{ .Values.emrContainers.awsRegion }}
   ```

1. 安裝本機 Helm Chart 並執行您的任務。