天天看點

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路

整理:張宋慶(Flink 社群志願者)

校對:李慶(Flink 社群志願者)

作者:楊陽(時溪),阿裡巴巴技術專家

摘要:本文由阿裡巴巴進階運維工程師楊陽(時溪)分享,主要介紹阿裡巴巴常見問題診斷子產品與思路,内容涵蓋以下幾個方面:
  • 常見運維問題
  • 問題處理方式
  • 作業生命周期
  • 工具化經驗
Tips:點選「 閱讀原文 」連結可檢視作者原版 PPT 及分享視訊~

1.常見運維問題

1.1 作業運作環境

本文中介紹的作業運作環境主要是在阿裡巴巴集團内,建構在 Hadoop 生态之上的 Flink 叢集,包含 Yarn、HDFS、ZK 等元件;作業送出模式采用 yarn per-job Detached 模式。

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  • 第1步,作業送出是通過 Flink Yarn Client,将使用者所寫的作業代碼以及編譯好的 jar 包上傳到 HDFS 上;
  • 第2步 Flink Client 與 Yarn ResourceManager 進行通信,申請所需要的的 Container 資源;
  • 第3步,ResourceManager 收到請求後會在叢集中的 NodeManager 配置設定啟動 AppMaster 的 Container 程序,AppMaster 中包含 Flink JobManager 子產品和 Yarn 通信的 ResourceManager 子產品;
  • 第4步,在 JobManager 中根據作業的 JobGraph 生成 Execution Graph,ResourceManager 子產品向 Yarn 的 ResourceManager 通信,申請 TaskManager 需要的 container 資源,這些 container 由 Yarn 的 NodeManger 負責拉起。每個 NodeManager 從 HDFS 上下載下傳資源,啟動 Container(TaskManager),并向 JobManager 注冊;JobManger 會部署不同的 task 任務到各個 TaskManager 中執行。

■ 資源申請方式

1. 指定資源大小

送出時,指定每個 TaskManager、JobManager 使用多少記憶體,CPU 資源。

2. 細粒度資源控制

阿裡巴巴集團内主要采用 ResourceSpec 方式指定每個 Operator 所需的資源大小,依據 task 的并發聚合成 container 資源向 Yarn 申請。

■ 環境高可用

  1. JM 高可用,AppMaster(JobManager) 異常後,可以通過 Yarn 的 APP attempt 與 ZooKeeper 機制來保證高可用;
  2. 資料高可用,作業做 checkpoint 時,TaskManager 優先寫本地磁盤,同時異步寫到 HDFS;當作業再次啟動時可以從 HDFS 上恢複到上次 checkpoint 的點位繼續作業流程。

1.2 為什麼我的作業延時了?

■ 時間類型

  • Processing time

    Processing time 是指 task 處理資料時所在機器的系統時間

  • Event time

    Event time 是指資料當中某一資料列的時間

  • Ingestion time

    Ingestion time 是指在 flink source 節點收到這條資料時的系統系統時間

■ 延時定義

自定義 Source 源解析中加入 Gauge 類型名額埋點,彙報如下名額:

  1. 記錄最新的一條資料中的 event time,在彙報名額時使用目前系統時間 - event time。
  2. 記錄讀取到資料的系統時間-資料中的 event time,直接彙報內插補點。

delay = 目前系統時間 – 資料事件時間(event time)

說明:反應處理資料的進度情況。

fetch_delay = 讀取到資料的系統時間- 資料事件時間(event time)

說明:反應實時計算的實際處理能力。

■ 延時分析

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  • 從上遊源頭,檢視每個源頭并發情況
  • 是否上遊資料稀疏導緻
  • 作業性能問題

1.3 為什麼我的作業 failover 了?

■ 作業 failover 主要分為兩大類

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路

Flink Failover 主要有兩類,一類是 Job Manager 的 Failover,還有一類是 Task Manager 的 Failover。

1.4 作業無法送出、異常停止

■ 無法送出

  • Yarn 問題 – 資源限制
  • HDFS 問題 - Jar 包過大,HDFS 異常
  • JobManager 資源不足,無法響應 TM 注冊
  • TaskManager 啟動過程中異常

■ 異常停止-名額監控無法覆寫

  • 重新開機政策配置錯誤
  • 重新開機次數達到上限

2.處理方式

2.1 延時問題處理方式

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  • 通過 delay、fetch_delay 判斷是否上遊稀疏導緻延時或者作業性能不足導緻延時
  • 确定延時後,通過反壓分析,找到反壓節點
  • 分析反壓節點名額參數
  • 通過分析 JVM 程序或者堆棧資訊
  • 通過檢視 TaskManager 等日志

■ 延時與吞吐

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路

觀察延時與 tps 名額之間關聯,是否由于 tps 的異常增高,導緻作業性能不足延時

■ 反壓

  • 找到反壓的源頭。
  • 節點之間的資料傳輸方式 shuffle/rebalance/hash。
  • 節點各并發的吞吐情況,反壓是不是由于資料傾斜導緻。
  • 業務邏輯,是否有正則,外部系統通路等。IO/CPU 瓶頸,導緻節點的性能不足。

■ 名額

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  • GC 耗時多長
  • 短時間内多次 GC
  • state 本地磁盤的 IO 情況
  • 外部系統通路延時等等

■ 堆棧

在 TaskManager 所在節點,檢視線程 TID、CPU 使用情況,确定是 CPU,還是 IO 問題。

ps H -p ${javapid} -o user,pid,ppid,tid,time,%cpu,cmd

#轉換為16進制後檢視tid具體堆棧
jstack ${javapid} > jstack.log           

■ 常見處理方式

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  1. 增加反壓節點的并發數。
  2. 調整節點資源,增加 CPU,記憶體。
  3. 拆分節點,将 chain 起來的消耗資源較多的 operator 拆分。
  4. 作業或叢集優化,通過主鍵打散,資料去重,資料傾斜,GC 參數,Jobmanager 參數等方式調優。

2.2 作業 failover 分析

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  • 檢視作業 failover 時列印的一些日志資訊
  • 檢視 failover 的 Subtask 找到所在 Taskmanager 節點
  • 結合 Job/Taskmanager 等日志資訊
  • 結合 Yarn 和 OS 等相關日志

3.作業生命周期

3.1 作業狀态變化-JobStatus

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路

上圖中可以看到作業的整個狀态轉換。從作業建立、到運作、失敗,重新開機,成功等整個生命周期。

這裡需要注意的是 reconciling 的狀态,這個狀态表示 yarn 中 AppMaster 重新啟動,恢複其中的 JobManager 子產品,這個作業會從 created 進入到 reconciling 的狀态,等待其他 Taskmanager 彙報,恢複 JobManager 的 failover,然後從 reconciling 再到正常 running。

3.2 Task 狀态變化 -ExecutionState

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路

上圖是作業的 Task 狀态轉換,需要注意的是,作業狀态處于 running 狀态時,并不意味着作業一定在運作消費資訊。在流式計算中隻有等所有的 task 都在 running 時,作業才算真正運作。

通過記錄作業各個階段的狀态變化,形成生命周期,我們能很清楚地展示作業是什麼時候開始運作、什麼時候失敗,以及 taskmanager failover 等關鍵事件,進一步能分析出叢集中有多少個作業正在運作,形成 SLA 标準。

4.工具化經驗

4.1 名額

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路

如何去衡量一個作業是否正常?

  • 延時與吞吐

    對于 Flink 作業來說,最關鍵的名額就是延時和吞吐。在多少 TPS 水位的情況下,作業才會開始延時.

  • 外部系統調用

    從名額上還可以建立對外部系統調用的耗時統計,比如說維表 join,sink 寫入到外部系統需要消耗多少時間,有助于我們排除外部的一些系統異常的一些因素。

  • 基線管理

    建立名額基線管理。比如說 state 通路耗時,平時沒有延時的時候,state 通路耗時是多少?每個 checkpoint 的資料量大概是多少?在異常情況下,這些都有助于我們對 Flink 的作業的問題進行排查。

4.2 日志

阿裡巴巴大規模應用 Flink 的實戰經驗:常見問題診斷思路
  • 錯誤日志

    JobManager 或者 TaskManager 的關鍵字及錯誤日志報警。

  • 事件日志

    JobManager 或者 TaskManager 的狀态變化形成關鍵事件記錄。

  • 曆史日志收集

    當作業結束後,想要分析問題,需要從 Yarn 的 History Server 或已經采集的日志系統中找曆史資訊。

  • 日志分析

    有了 JobManager,TaskManager 的日志之後,可以對常見的 failover 類型進行聚類,标注出一些常見的 failover,比如說 OOM 或者一些常見的上下遊通路的錯誤等等。

4.3 關聯分析

  1. 作業名額/事件 - Taskmanager,JobManager
  2. Yarn 事件 - 資源搶占,NodeManager Decommission
  3. 機器異常 - 當機、替換
  4. Failover 日志聚類

在做了這些名額和日志的處理之後,可以對各元件的事件進行關聯,比如說當 TaskManager failover 時,有可能是因為機器的異常。也可以通過 Flink 作業解析 Yarn 的事件,關聯作業與 Container 資源搶占,NodeManager 下線的事件等。

作者簡介:

楊陽(時溪),阿裡巴巴技術專家,目前就職于阿裡巴巴計算平台事業部,負責實時計算中 Flink 運維開發。