本文系《Flink在美團的應用與實踐》的聽課筆記
原始視訊視訊資源已經在優酷公開:2018.8.11 Flink China Meetup·北京站-Flink在美團的應用與實踐
作者:劉迪珊@美團
1.現狀和背景
實時平台架構

最底層是資料緩存層,可以看到美團測的所有日志類的資料,都是通過統一的日志收集系統收集到Kafka。
Kafka作為最大的資料中轉層,支撐了美團線上的大量業務,包括離線拉取,以及部分實時處理業務等。
在資料緩存層之上,是一個引擎層,這一層的左側是我們目前提供的實時計算引擎,包括Storm和Flink。
Storm在此之前是 standalone 模式的部署方式,Flink由于其現在運作的環境,美團選擇的是On YARN模式,除了計算引擎之外,我們還提供一些實時存儲功能,用于存儲計算的中間狀态、計算的結果、以及次元資料等,目前這一類存儲包含Hbase、Redis以及ES。
在計算引擎之上,是趨于五花八門的一層,這一層主要面向資料開發的同學。實時資料開發面臨諸多問題,例如在程式的調試調優方面就要比普通的程式開發困難很多。在資料平台這一層,美團面向使用者提供的實時計算平台,不僅可以托管作業,還可以實作調優診斷以及監控報警,此外還有實時資料的檢索以及權限管理等功能。
除了提供面向資料開發同學的實時計算平台,美團現在正在做的事情還包括建構中繼資料中心。這也是未來我們想做SQL的一個前提,中繼資料中心是承載實時流系統的一個重要環節,我們可以把它了解為實時系統中的大腦,它可以存儲資料的Schema,Meta。架構的最頂層就是我們現在實時計算平台支撐的業務,不僅包含線上業務日志的實時查詢和檢索,還涵蓋當下十分熱門的實時機器學習。
機器學習經常會涉及到搜尋和推薦場景,這兩個場景最顯著特點:
一、會産生海量實時資料;
二、流量的QPS相當高。此時就需要實時計算平台承載部分實時特征的提取工作,實作應用的搜尋推薦服務。
還有一類是比較常見的場景,包括實時的特征聚合,斑馬Watcher(可以認為是一個監控類的服務),實時數倉等。
實時平台現狀
美團實時計算平台的現狀是作業量現在已經達到了近萬,叢集的節點的規模是千級别的,天級消息量已經達到了萬億級,高峰期的消息量能夠達到千萬條每秒。
痛點和問題
美團在調研使用Flink之前遇到了一些痛點和問題:
實時計算精确性問題:在調研使用Flink之前美團很大規模的作業是基于Storm去開發的,Storm主要的計算語義是At-Least-Once,這種語義在保證正确性上實際上是有一些問題的,在Trident之前Storm是無狀态的處理。雖然Storm Trident提供了一個維護狀态的精确的開發,但是它是基于串行的Batch送出的,那麼遇到問題在處理性能上可能會有一點瓶頸。并且Trident是基于微批的處理,在延遲上沒有達到比較高的要求,是以不能滿足一些對延遲比較高需求的業務。
流進行中的狀态管理問題:基于之前的流處理過程中狀态管理的問題是非常大的一類問題。狀态管理除了會影響到比如說計算狀态的一緻性,還會影響到實時計算處理的性能以及故障恢複時候的能力。而Flink最突出的一個優勢就是狀态管理。
實時計算表義能力的局限性:在實時計算之前很多公司大部分的資料開發還是面向離線的場景,近幾年實時的場景也慢慢火熱起來了。那與離線的處理不同的是,實時的場景下,資料處理的表意能力可能有一定的限制,比如說他要進行精确計算以及時間視窗都是需要在此之上去開發很多功能性的東西。
開發調試成本高:近千結點的叢集上已經跑了近萬的作業,分布式的處理的引擎,手工寫代碼的方式,給資料開發的同學也帶來了很高開發和調試的成本,再去維護的時候,運維成本也比較高。
Flink探索關注點
在上面這些痛點和問題的背景下,美團從去年開始進行Flink的探索,關注點主要有以下4個方面:
1.ExactlyOnce計算能力
2.狀态管理能力
3.視窗/Join/時間處理等等
4.SQL/TableAPI
2.Flink在美團的實踐
穩定性實踐
穩定性實踐-資源隔離
資源隔離的考慮:分場景、按業務
高峰期不同,運維時間不同;
可靠性、延遲需求不同;
應用場景,重要性不同;
資源隔離的政策:
1YARN打标簽,節點實體隔離:
按照場景和業務次元考慮資源配置設定的問題和滴滴類似是yarn打标簽的模式進行獨立的隊列的隔離。
重要業務的運作時的作業會獨立在某一批機器上,避免其他業務的影響。
2離線DataNode與實時計算節點的隔離:
之前都是on yarn為了節約成本計算和存儲節點就混布,發現離線DataNode某一段時間資料量大導緻出現毛刺現象。
這時會對實時計算的穩定性造成影響。
穩定性實踐-智能排程
yarn基于CPU和記憶體去排程
智能排程目的也是為了解決資源不均的問題,現在普通的排程政策就是基于CPU,基于記憶體去排程的。除此之外,在生産過程中也發現了一些其他的問題,比如說Flink是會依賴本地磁盤,進行依賴本地磁盤做本地的狀态的存儲,是以磁盤IO,還有磁盤的容量,也是一類考慮的問題點,除此之外還包括網卡流量,因為每個業務的流量的狀态是不一樣的,配置設定進來會導緻流量的高峰,把某一個網卡打滿,進而影響其他業務,是以期望的話是說做一些智能排程化的事情。目前暫時能做到的是從cpu和記憶體兩方面,未來會從其他方面做一些更優的排程政策。
穩定性實踐-故障容錯
1.節點/網絡故障
JobManagerHA,自動拉起
與Storm不同的是,知道Storm在遇到異常的時候是非常簡單粗暴的,比如說有發生了異常,可能使用者沒有在代碼中進行比較規範的異常處理,但是沒有關系,因為worker會重新開機作業還會繼續執行,并且他保證的是At-Least-Once這樣的語義,比如說一個網絡逾時的異常對他而言影響可能并沒有那麼大,
Flink不同的是他對異常的容忍度是非常的苛刻的,那時候就考慮的是比如說會發生節點或者是網絡的故障,那JobManager單點問題可能就是一個瓶頸,JobManager那個如果挂掉的話,那麼可能對整個作業的影響就是不可回複的,是以考慮了做HA,另外一個就是會去考慮一些由于運維的因素而導緻的,還有除此之外,可能有一些使用者作業是沒有開啟CheckPoint,但如果是因為節點或者是網絡故障導緻挂掉,希望會在平台那一層做一些自動拉起的政策,去保證作業運作的穩定性。
2.上下遊容錯
FlinkKafka 08異常重試
我們的資料源主要是Kafka,讀寫Kafka是一類非常常見的實時流處理避不開的一個内容,而Kafka本身的叢集規模是非常比較大的,是以節點的故障出現是一個常态問題,在此基礎上我們對節點故障進行了一些容錯,比如說節點挂掉或者是資料均衡的時候,Leader會切換,那本身Flink的讀寫對Leader的切換容忍度沒有那麼高,在此基礎上我們對一些特定場景的,以及一些特有的異常做的一些優化,進行了一些重試。這是影響作業穩定性的一個點。
3.容災
多機房,流熱備
Flink平台化-作業管理
容災可能大家對考慮的并不多,比如說有沒有可能一個機房的所有的節點都挂掉了,或者是無法通路了,雖然它是一個小機率的事件,但它也是會發生的。是以現在也會考慮做多機房的一些部署,包括還有Kafka流的一些熱備。
在實踐過程中,為了解決作業管理的一些問題,減少使用者開發的一些成本,我們做了一些平台化的工作,下圖是一個作業送出的界面展示,包括作業的配置,作業生命周期的管理,報警的一些配置,延遲的展示,都是內建在實時計算平台的。
Flink平台化-監控報警
在監控上我們也做了一些事情,對于實時作業來講,對監控的要求會更高,比如說在作業延遲的時候對業務的影響也比較大,是以做了一些延遲的報警,包括作業狀态的報警,比如說作業存活的狀态,以及作業運作的狀态,還有未來會做一些自定義Metrics的報警。自定義Metrics是未來會考慮基于作業處理本身的内容性,做一些可配置化的一些報警。
Flink平台化-調優診斷
實時計算引擎提供統一日志和Metrics方案
為業務提供按條件過濾的日志檢索
為業務提供自定義時間跨度的名額查詢
基于日志和名額,為業務提供可配置的報警
另外就是剛剛提到說在開發實時作業的時候,調優和診斷是一個比較難的痛點,就是使用者不是很難去檢視分布式的日志,是以也提供了一套統一的解決方案。這套解決方案主要是針對日志和Metrics,會在針對引擎那一層做一些日志和Metrics的上報,那麼它會通過統一的日志收集系統,将這些原始的日志,還有Metrics彙集到Kafka那一層。今後Kafka這一層大家可以發現它有兩個下遊,
一方面:是做日志到ES的資料同步,目的的話是說能夠進入日志中心去做一些日志的檢索,
另外一方面:是通過一些聚合處理流轉到寫入到OpenTSDB把資料做依賴,這份聚合後的資料會做一些查詢,一方面是Metrics的查詢展示,另外一方面就是包括實做的一些相關的報警。
下圖是目前某一個作業的一個可支援跨天次元的Metrics的一個查詢的頁面。可以看到說如果是能夠通過縱向的對比,可以發現除了作業在某一個時間點是因為什麼情況導緻的?比如說延遲啊這樣容易幫使用者判斷一些他的做作業的一些問題。除了作業的運作狀态之外,也會先就是采集一些節點的基本資訊作為橫向的對比
下圖是目前的日志的一些查詢,它記錄了,因為作業在挂掉之後,每一個ApplicationID可能會變化,那麼基于作業唯一的唯一的主鍵作業名去搜集了所有的作業,從建立之初到目前運作的日志,那麼可以允許使用者的跨Application的日志查詢。
生态建設
Flink落地做了一些生态的建設,
線上的MQ和面向生産環境的Kafka,雖然他們底層都是依賴kafka但是面向的場景是不同的。
線上MQ的特點是單叢集的規模比較小,但是對延遲的要求合需求比較高。
生産類的kafka的特點是規模比較大,需要承擔離線+實時的生産,要求這個叢集要高吞吐。
為了适配這兩類MQ做了不同的事情:
對于線上的MQ,期望去做一次同步,多次消費,目的是避免對線上的業務造成影響。
對于的生産類的Kafka就是線下的Kafka,做了一些位址的屏蔽,還有基礎的一些配置,包括一些權限的管理,還有名額的采集。
3.Flink在美團的應用
下面會給大家講兩個Flink在美團的真實使用的案例。
第一個是Petra,Petra其實是一個實時名額的一個聚合的系統,它其實是面向公司的一個統一化的解決方案。它主要面向的業務場景就是基于業務的時間去統計,還有計算一些實時的名額,要求的話是低延遲時間,他還有一個就是說,因為它是面向的是通用的業務,由于業務可能是各自會有各自不同的次元,每一個業務可能包含了包括應用,通道,機房,還有其他的各自應用各個業務特有的一些次元,而且這些次元可能涉及到比較多,另外一個就是說它可能是就是業務需要去做一些複合的名額的計算,比如說最常見的交易成功率,他可能需要去計算支付的成功數,還有和下單數的比例。
另外一個就是說統一化的名額聚合可能面向的還是一個系統,比如說是一些B端或者是R段的一些監控類的系統,那麼系統對于名額系統的訴求,就是說我希望名額聚合能夠最實時最精确的能夠産生一些結果,資料保證說它的下遊系統能夠真實的監控到目前的資訊。右邊圖是我當一個Metrics展示的一個事例。可以看到其他其實跟剛剛講也是比較類似的,就是說包含了業務的不同次元的一些名額彙聚的結果。
在用Flink去做實時名額複核的系統的時候,着重從這幾方面去考慮了。
第一個方面是說精确的計算,包括使用了FLink和CheckPoint的機制去保證說我能做到不丢不重的計算,第一個首先是由統一化的Metrics流入到一個預聚合的子產品,預聚合的子產品主要去做一些初始化的一些聚合,其中的為什麼會分預聚合和全量聚合主要的解決一類問題,包括就剛剛那位同學問的一個問題,就是資料傾斜的問題,比如說在熱點K發生的時候,目前的解決方案也是通過預聚合的方式去做一些緩沖,讓盡量把K去打散,再聚合全量聚合子產品去做彙聚。那其實也是隻能解決一部分問題,是以後面也考慮說在性能的優化上包括去探索狀态存儲的性能。
下面的話還是包含晚到資料的容忍能力,因為名額彙聚可能剛剛也提到說要包含一些複合的名額,那麼複合的名額所依賴的資料可能來自于不同的流,即便來自于同一個流,可能每一個資料上報的時候,可能也會有晚到的情況發生,那時候需要去對資料關聯做晚到的容忍,容忍的一方面是說可以設定晚到的Lateness的延遲,另一方面是可以設定視窗的長度,但是其實在現實的應用場景上,其實還有一方面考慮就是說除了去盡量的去拉長時間,還要考慮真正的計算成本,是以在這方面也做了一些權衡,那麼名額基本就是經過全量聚合之後,聚合結果會回寫Kafka,經過資料同步的子產品寫到OpenTSDB去做,最後去grafana那做名額的展示,另一方面可能去應用到通過Facebook包同步的子產品去同步到報警的系統裡面去做一些名額,基于名額的報警。
名額---全量聚合---kafka---OpenTSDB---grafana
下圖是現在提供的産品化的Petra的一個展示的機示意圖,可以看到目前的話就是定義了某一些常用的算子,以及次元的配置,允許使用者進行配置話的處理,直接去能夠擷取到他期望要的名額的一個展示和彙聚的結果。目前還在探索說為Petra基于Sql做一些事情,因為很多使用者也比較就是在就是習慣上也可以傾向于說我要去寫Sql去完成這樣的統計,是以也會基于此說依賴Flink的本身的對SQl還有TableAPI的支援,也會在Sql的場景上進行一些探索。
MLX機器學習平台
第二類應用就是機器學習的一個場景,機器學習的場景可能會有依賴離線的特征資料和實時的特征資料。
一個是基于現有的離線場景下的特征提取,經過批處理,流轉到離線的叢集。
另一個就是近線模式,近線模式出的資料就是現有的從日志收集系統流轉過來的統一的日志,經過Flink的處理,就是包括流的關聯以及特征的提取,再做模型訓練,流轉到最終訓練叢集,訓練叢集會産出P的特征,還有都是Delta的特征,最終将這些特征影響到線上的線上的特征的一個訓練的一個服務上。
本文由來源 21aspnet,由 system_mush 整理編輯,其版權均為 21aspnet 所有,文章内容系作者個人觀點,不代表 Java架構師必看 對觀點贊同或支援。如需轉載,請注明文章來源。