整理:張宋慶(Flink 社群志願者)
校對:李慶(Flink 社群志願者)
作者:楊陽(時溪),阿裡巴巴技術專家
摘要:本文由阿裡巴巴進階運維工程師楊陽(時溪)分享,主要介紹阿裡巴巴常見問題診斷子產品與思路,内容涵蓋以下幾個方面:Tips:點選「 閱讀原文 」連結可檢視作者原版 PPT 及分享視訊~
- 常見運維問題
- 問題處理方式
- 作業生命周期
- 工具化經驗
1.常見運維問題
1.1 作業運作環境
本文中介紹的作業運作環境主要是在阿裡巴巴集團内,建構在 Hadoop 生态之上的 Flink 叢集,包含 Yarn、HDFS、ZK 等元件;作業送出模式采用 yarn per-job Detached 模式。

- 第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 申請。
■ 環境高可用
- JM 高可用,AppMaster(JobManager) 異常後,可以通過 Yarn 的 APP attempt 與 ZooKeeper 機制來保證高可用;
- 資料高可用,作業做 checkpoint 時,TaskManager 優先寫本地磁盤,同時異步寫到 HDFS;當作業再次啟動時可以從 HDFS 上恢複到上次 checkpoint 的點位繼續作業流程。
1.2 為什麼我的作業延時了?
■ 時間類型
-
Processing time
Processing time 是指 task 處理資料時所在機器的系統時間
-
Event time
Event time 是指資料當中某一資料列的時間
-
Ingestion time
Ingestion time 是指在 flink source 節點收到這條資料時的系統系統時間
■ 延時定義
自定義 Source 源解析中加入 Gauge 類型名額埋點,彙報如下名額:
- 記錄最新的一條資料中的 event time,在彙報名額時使用目前系統時間 - event time。
- 記錄讀取到資料的系統時間-資料中的 event time,直接彙報內插補點。
delay = 目前系統時間 – 資料事件時間(event time)
說明:反應處理資料的進度情況。
fetch_delay = 讀取到資料的系統時間- 資料事件時間(event time)
說明:反應實時計算的實際處理能力。
■ 延時分析
- 從上遊源頭,檢視每個源頭并發情況
- 是否上遊資料稀疏導緻
- 作業性能問題
1.3 為什麼我的作業 failover 了?
■ 作業 failover 主要分為兩大類
Flink Failover 主要有兩類,一類是 Job Manager 的 Failover,還有一類是 Task Manager 的 Failover。
1.4 作業無法送出、異常停止
■ 無法送出
- Yarn 問題 – 資源限制
- HDFS 問題 - Jar 包過大,HDFS 異常
- JobManager 資源不足,無法響應 TM 注冊
- TaskManager 啟動過程中異常
■ 異常停止-名額監控無法覆寫
- 重新開機政策配置錯誤
- 重新開機次數達到上限
2.處理方式
2.1 延時問題處理方式
- 通過 delay、fetch_delay 判斷是否上遊稀疏導緻延時或者作業性能不足導緻延時
- 确定延時後,通過反壓分析,找到反壓節點
- 分析反壓節點名額參數
- 通過分析 JVM 程序或者堆棧資訊
- 通過檢視 TaskManager 等日志
■ 延時與吞吐
觀察延時與 tps 名額之間關聯,是否由于 tps 的異常增高,導緻作業性能不足延時
■ 反壓
- 找到反壓的源頭。
- 節點之間的資料傳輸方式 shuffle/rebalance/hash。
- 節點各并發的吞吐情況,反壓是不是由于資料傾斜導緻。
- 業務邏輯,是否有正則,外部系統通路等。IO/CPU 瓶頸,導緻節點的性能不足。
■ 名額
- 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
■ 常見處理方式
- 增加反壓節點的并發數。
- 調整節點資源,增加 CPU,記憶體。
- 拆分節點,将 chain 起來的消耗資源較多的 operator 拆分。
- 作業或叢集優化,通過主鍵打散,資料去重,資料傾斜,GC 參數,Jobmanager 參數等方式調優。
2.2 作業 failover 分析
- 檢視作業 failover 時列印的一些日志資訊
- 檢視 failover 的 Subtask 找到所在 Taskmanager 節點
- 結合 Job/Taskmanager 等日志資訊
- 結合 Yarn 和 OS 等相關日志
3.作業生命周期
3.1 作業狀态變化-JobStatus
上圖中可以看到作業的整個狀态轉換。從作業建立、到運作、失敗,重新開機,成功等整個生命周期。
這裡需要注意的是 reconciling 的狀态,這個狀态表示 yarn 中 AppMaster 重新啟動,恢複其中的 JobManager 子產品,這個作業會從 created 進入到 reconciling 的狀态,等待其他 Taskmanager 彙報,恢複 JobManager 的 failover,然後從 reconciling 再到正常 running。
3.2 Task 狀态變化 -ExecutionState
上圖是作業的 Task 狀态轉換,需要注意的是,作業狀态處于 running 狀态時,并不意味着作業一定在運作消費資訊。在流式計算中隻有等所有的 task 都在 running 時,作業才算真正運作。
通過記錄作業各個階段的狀态變化,形成生命周期,我們能很清楚地展示作業是什麼時候開始運作、什麼時候失敗,以及 taskmanager failover 等關鍵事件,進一步能分析出叢集中有多少個作業正在運作,形成 SLA 标準。
4.工具化經驗
4.1 名額
如何去衡量一個作業是否正常?
-
延時與吞吐
對于 Flink 作業來說,最關鍵的名額就是延時和吞吐。在多少 TPS 水位的情況下,作業才會開始延時.
-
外部系統調用
從名額上還可以建立對外部系統調用的耗時統計,比如說維表 join,sink 寫入到外部系統需要消耗多少時間,有助于我們排除外部的一些系統異常的一些因素。
-
基線管理
建立名額基線管理。比如說 state 通路耗時,平時沒有延時的時候,state 通路耗時是多少?每個 checkpoint 的資料量大概是多少?在異常情況下,這些都有助于我們對 Flink 的作業的問題進行排查。
4.2 日志
-
錯誤日志
JobManager 或者 TaskManager 的關鍵字及錯誤日志報警。
-
事件日志
JobManager 或者 TaskManager 的狀态變化形成關鍵事件記錄。
-
曆史日志收集
當作業結束後,想要分析問題,需要從 Yarn 的 History Server 或已經采集的日志系統中找曆史資訊。
-
日志分析
有了 JobManager,TaskManager 的日志之後,可以對常見的 failover 類型進行聚類,标注出一些常見的 failover,比如說 OOM 或者一些常見的上下遊通路的錯誤等等。
4.3 關聯分析
- 作業名額/事件 - Taskmanager,JobManager
- Yarn 事件 - 資源搶占,NodeManager Decommission
- 機器異常 - 當機、替換
- Failover 日志聚類
在做了這些名額和日志的處理之後,可以對各元件的事件進行關聯,比如說當 TaskManager failover 時,有可能是因為機器的異常。也可以通過 Flink 作業解析 Yarn 的事件,關聯作業與 Container 資源搶占,NodeManager 下線的事件等。
作者簡介:
楊陽(時溪),阿裡巴巴技術專家,目前就職于阿裡巴巴計算平台事業部,負責實時計算中 Flink 運維開發。