

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

# 升級到 Flink 2.2：完成指南
<a name="flink-2-2-upgrade-guide"></a>

本指南提供step-by-step說明。這是主要版本升級，其中包含需要仔細規劃和測試的重大變更。

**主要版本升級是單向**  
升級操作可以使用狀態保留將您的應用程式從 Flink 1.x 移至 2.2，但您無法從 2.2 移至具有 2.2 狀態的 1.x。如果您的應用程式在升級後變得運作狀態不佳，請使用轉返 API，從最新的快照返回具有原始 1.x 狀態的 1.x 版本。

## 先決條件
<a name="upgrade-guide-prerequisites"></a>

開始升級之前：
+ 檢閱 [中斷變更和棄用](flink-2-2.md#flink-2-2-breaking-changes)
+ 檢閱 [Flink 2.2 升級的狀態相容性指南](state-compatibility.md)
+ 確保您擁有用於測試的非生產環境
+ 記錄您目前的應用程式組態和相依性

## 了解遷移路徑
<a name="upgrade-guide-migration-paths"></a>

您的升級體驗取決於應用程式與 Flink 2.2 的相容性。了解這些路徑可協助您適當地準備並設定逼真的期望。

**路徑 1：相容的二進位和應用程式狀態**

**預期事項：**
+ 叫用升級操作
+ 使用應用程式狀態轉換完成遷移至 2.2：`RUNNING`→ `UPDATING` → `RUNNING`
+ 保留所有應用程式狀態，而不會遺失資料或進行重新處理
+ 與次要版本遷移相同的體驗

最適合：無狀態應用程式或使用相容序列化的應用程式 (Avro、相容的 Protobuf 結構描述、不含集合POJOs)

**路徑 2：二進位不相容**

**預期事項：**
+ 叫用升級操作
+ 操作失敗，並透過操作 API 和日誌顯示二進位不相容
+ 啟用自動轉返：應用程式會在幾分鐘內自動轉返，無需您的介入
+ 停用自動轉返：應用程式在未處理資料的情況下仍處於執行中狀態；您可以手動轉返至較舊的版本
+ 修正二進位檔案後，請使用 [UpdateApplication API](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 來獲得類似路徑 1 的體驗

最適合：使用 Flink 任務啟動期間偵測到之已移除 APIs 的應用程式

**路徑 3：不相容的應用程式狀態**

**預期事項：**
+ 叫用升級操作
+ 遷移一開始似乎成功
+ 當狀態還原失敗時，應用程式會在幾秒鐘內進入重新啟動迴圈
+ 透過顯示持續重新啟動的 CloudWatch 指標偵測失敗
+ 手動叫用轉返操作
+ 啟動復原後幾分鐘內返回生產環境
+ [狀態遷移](state-compatibility.md#state-compat-migration) 檢閱您的應用程式

最適合：狀態序列化不相容的應用程式 （具有集合、特定 Kryo 序列化狀態的 POJOs)

**注意**  
強烈建議您建立生產應用程式的複本，並在複本上測試下列每個升級階段，然後再遵循生產應用程式的相同步驟。

## 階段 1：準備
<a name="upgrade-guide-phase-1"></a>

**更新應用程式程式碼**

更新您的應用程式程式碼，使其與 Flink 2.2 相容：
+ **在 或 中將 Flink 相依性**更新至 2.2.0 版 `pom.xml` `build.gradle`
+ 將**連接器相依性更新**至 Flink 2.2 相容版本 （請參閱 [連接器可用性](flink-2-2.md#flink-2-2-connectors))
+ **移除已棄用的 API 用量**：
  + 以 DataStream API 或資料表 API/SQL 取代 DataSet API DataStream 
  + 使用 FLIP-27 來源和 FLIP-143 接收器 APIs 取代舊版 `SourceFunction`/`SinkFunction` 
  + 以 Java API 取代 Scala API 用量
+ **更新至 Java 17**

**上傳更新的應用程式程式碼**
+ 使用 Flink 2.2 相依性建置您的應用程式 JAR
+ 使用與目前 JAR **不同的檔案名稱**上傳到 Amazon S3 （例如 `my-app-flink-2.2.jar`)
+ 請注意要在升級步驟中使用的 S3 儲存貯體和金鑰

## 階段 2：啟用自動轉返
<a name="upgrade-guide-phase-2"></a>

自動轉返可讓 Amazon Managed Service for Apache Flink 在升級失敗時自動還原至先前的版本。

**檢查自動轉返狀態**

*AWS 管理主控台:*

1. 導覽至您的應用程式

1. 選擇 **Configuration** (組態)。

1. 在**應用程式設定**下，確認**系統復原**已啟用

*AWS CLI:*

```
aws kinesisanalyticsv2 describe-application \
    --application-name MyApplication \
    --query 'ApplicationDetail.ApplicationConfigurationDescription.ApplicationSystemRollbackConfigurationDescription.RollbackEnabled'
```

**啟用自動轉返 （如果未啟用）**

```
aws kinesisanalyticsv2 update-application \
    --application-name MyApplication \
    --current-application-version-id <version-id> \
    --application-configuration-update '{
        "ApplicationSystemRollbackConfigurationUpdate": {
            "RollbackEnabledUpdate": true
        }
    }'
```

## 階段 3：拍攝快照 （選用）
<a name="upgrade-guide-phase-3"></a>

如果您的應用程式已啟用自動快照，您可以略過此步驟，否則請在升級之前擷取應用程式的快照以儲存應用程式的狀態。

**從執行中的應用程式擷取快照**

*AWS 管理主控台:*

1. 導覽至您的應用程式

1. 選擇**快照**

1. 選擇**建立快照**

1. 輸入快照名稱 （例如 `pre-flink-2.2-upgrade`)

1. 選擇 **Create** (建立)

*AWS CLI:*

```
aws kinesisanalyticsv2 create-application-snapshot \
    --application-name MyApplication \
    --snapshot-name pre-flink-2.2-upgrade
```

**驗證快照建立**

```
aws kinesisanalyticsv2 describe-application-snapshot \
    --application-name MyApplication \
    --snapshot-name pre-flink-2.2-upgrade
```

等到 `SnapshotStatus` 變成 `READY`再繼續。

## 階段 4：升級應用程式
<a name="upgrade-guide-phase-4"></a>

您可以使用 [https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)動作升級 Flink 應用程式。

您可以透過多種方式呼叫 `UpdateApplication` API：
+ **使用 AWS 管理主控台。**
  + 前往 上的應用程式頁面 AWS 管理主控台。
  + 選擇**設定**。
  + 選取您要從中開始的新執行期和快照，也稱為還原組態。使用最新的設定作為還原組態，從最新的快照啟動應用程式。指向 Amazon S3 上新升級的應用程式 JAR/zip。
+ **使用 AWS CLI**[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kinesisanalyticsv2/update-application.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kinesisanalyticsv2/update-application.html)動作。
+ **使用 CloudFormation。**
  + 更新 `RuntimeEnvironment` 欄位。先前， CloudFormation 已刪除應用程式並建立新的應用程式，導致您的快照和其他應用程式歷史記錄遺失。現在會 CloudFormation 更新您的`RuntimeEnvironment`就地，不會刪除您的應用程式。
+ **使用 AWS SDK。**
  + 如需您選擇的程式設計語言，請參閱 SDK 文件。請參閱 [https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)。

您可以在應用程式處於 `RUNNING` 狀態或應用程式處於停止`READY`狀態時執行升級。Amazon Managed Service for Apache Flink 會驗證原始執行時間版本與目標執行時間版本之間的相容性。此相容性檢查會在處於 `UpdateApplication` `RUNNING` 狀態時執行，或在`READY`處於 狀態時升級`StartApplication`時於下一個執行。

**從 RUNNING 狀態升級**

```
aws kinesisanalyticsv2 update-application \
    --application-name MyApplication \
    --current-application-version-id <version-id> \
    --runtime-environment-update FLINK-2_2 \
    --application-configuration-update '{
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "FileKeyUpdate": "my-app-flink-2.2.jar"
                }
            }
        }
    }'
```

**從 READY 狀態升級**

```
aws kinesisanalyticsv2 update-application \
    --application-name MyApplication \
    --current-application-version-id <version-id> \
    --runtime-environment-update FLINK-2_2 \
    --application-configuration-update '{
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "FileKeyUpdate": "my-app-flink-2.2.jar"
                }
            }
        }
    }'
```

## 階段 5：監控升級
<a name="upgrade-guide-phase-5"></a>

**相容性檢查**
+ 使用 操作 API 檢查升級的狀態。如果任務啟動有二進位不相容或問題，升級操作將使用 日誌失敗。
+ 如果升級操作成功，但應用程式卡在重新啟動迴圈中，這表示狀態與新的 Flink 版本不相容，或更新的程式碼發生問題。[Flink 2.2 升級的狀態相容性指南](state-compatibility.md) 檢閱如何識別狀態不相容問題。

**監控應用程式運作狀態**

*應用程式狀態：*
+ 應用程式狀態應轉換：`RUNNING`→ `UPDATING` → `RUNNING`
+ 檢查應用程式的執行時間。如果是 2.2，表示升級操作成功。
+ 如果您的應用程式在 中，`RUNNING`但仍處於較舊的執行時間，則自動轉返會開始。操作 API 會將操作顯示為 `FAILED`。檢查日誌以尋找失敗的例外狀況。

此外，請在 CloudWatch 中監控這些指標：

*重新啟動指標：*
+ `numRestarts`：監控意外重新啟動 — 如果 `numRestarts`為零且 `uptime`或 `runningTime` 正在增加，則升級成功。

*檢查點指標：*
+ `lastCheckpointDuration`：應該類似於預先升級的值
+ `numberOfFailedCheckpoints`：應保持在 0

## 階段 6：驗證應用程式行為
<a name="upgrade-guide-phase-6"></a>

在 Flink 2.2 上執行應用程式之後：

**功能驗證**
+ 確認正在從來源讀取資料
+ 確認資料正在寫入目的地
+ 驗證業務邏輯產生預期結果
+ 比較輸出與升級前基準

**效能驗證**
+ 監控延遲指標 end-to-end處理時間）
+ 監控輸送量指標 （每秒記錄數）
+ 監控檢查點持續時間和大小
+ 監控記憶體和 CPU 使用率

**執行 24 小時以上**

允許應用程式在生產環境中執行至少 24 小時，以確保：
+ 沒有記憶體洩漏
+ 穩定檢查點行為
+ 沒有意外重新啟動
+ 一致的輸送量

## 階段 7：轉返程序
<a name="upgrade-guide-phase-7"></a>

如果升級失敗或應用程式正在執行但運作狀態不佳，請復原至先前的版本。

**自動轉返**

如果啟用自動轉返，且在啟動期間升級失敗，Amazon Managed Service for Apache Flink 會自動還原至先前的版本。

**手動轉返**

如果應用程式正在執行但運作狀態不佳，請使用 `RollbackApplication` API：

*AWS 管理主控台:*

1. 導覽至您的應用程式

1. 選擇**動作** → **復原**

1. 確認轉返

*AWS CLI:*

```
aws kinesisanalyticsv2 rollback-application \
    --application-name MyApplication \
    --current-application-version-id <version-id>
```

**復原期間會發生的情況：**
+ 應用程式停止
+ 執行時間會還原至先前的 Flink 版本
+ 應用程式程式碼會還原至先前的 JAR
+ 應用程式會從升級**前**取得的最後一個成功快照重新啟動

**重要**  
您無法還原 Flink 1.x 上的 Flink 2.2 快照
轉返使用升級之前拍攝的快照
升級之前一律拍攝快照 （階段 3)

## 後續步驟
<a name="upgrade-guide-next-steps"></a>

有關升級期間的問題，請參閱 [Managed Service for Apache Flink 故障診斷](troubleshooting.md)或聯絡 AWS Support。