

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 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`。如果检查点早于配置的值，则对于运行正常的作业，系统将获取其保存点。在会话模式下，不支持此功能。

**保存点**  
使用 savepoint 进行升级，提供最大的安全性和充当积分的可能性。 backup/fork 升级过程中，系统将创建保存点。请注意，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 运算符进行故障排除](troubleshooting-sparkop.md)

## Amazon EMR on EKS 上的 Apache Flink 问题排查
<a name="jobruns-flink-troubleshooting-apache-flink"></a>

### 安装 Helm 图表时未找到资源映射
<a name="w2aac21c21b7b7b3"></a>

安装 Helm 图表时可能会遇到以下错误消息。

```
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 组件。您必须在您使用的每个 Amazon EKS 集群中分别安装 cert-manager。

```
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 图表文件 `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 AWSBad RequestException 问题 AWS 区域
<a name="jobruns-flink-troubleshooting-optin-region"></a>

如果您以可[选方式运行 Flink 应用程序 AWS 区域，](https://docs.aws.amazon.com/controltower/latest/userguide/opt-in-region-considerations.html)则可能会看到以下错误：

```
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 会话作业 AWSBadRequestException 时为 S3A
<a name="jobruns-flink-troubleshooting-optin-region"></a>

对于 Amazon EMR 发行版 6.15.0-7.2.0 版本，在中国区域运行 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 Operator。但在我们完成补丁之前，要修复这个错误，需要下载 Flink Operator Helm 图表，将其解压（提取压缩文件），然后在 Helm 图表中更改配置。

具体步骤如下：

1. 更改为（特别是将目录更改为）Helm 图表的本地文件夹，然后运行以下命令行，拉取 Helm 图表并将其解压。

   ```
   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 图表文件夹，找到 `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 图表 并运行作业。