Flink在美团的应用与实践听课笔记
本文系《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的特征,最終將這些特征影響到線上的線上的特征的一個訓練的一個服務上。
總結
以上是生活随笔為你收集整理的Flink在美团的应用与实践听课笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原神画给谁的作品?
- 下一篇: 你需要知道的高性能并发框架Disrupt