Oceanus:基於Apache Flink的一站式實時計算平臺

Flink Forward是由Apache官方授權,用於介紹Flink社區的最新動態、發展計劃以及Flink相關的生產實踐經驗的會議。2018年12月20日,Flink Forward首次來到中國舉辦。騰訊TEG數據平臺部參加了會議並在會上介紹了騰訊內部基於Flink打造的一站式實時計算平臺Oceanus。

一、背景介紹

TEG實時計算團隊作為騰訊內部最大的實時數據服務部門,為業務部門提供高效、穩定和易用的實時數據服務。其每秒接入的數據峰值達到了2.1億條,每天接入的數據量達到了17萬億條,每天的數據增長量達到了3PB,每天需要進行的實時計算量達到了20萬億次。

Oceanus:基於Apache Flink的一站式實時計算平臺

近年來大數據技術的發展,特別是HDFS和HBase這些大數據存儲系統以及Hadoop和Spark這些大數據計算系統,已經使人們能較好地處理數據規模的問題。但是人們對於數據內在價值的追求是無止境的。一方面,人們開發了越來越多複雜的數據挖掘算法來發現數據更深層次的關係信息;而另一方面,由於數據價值往往隨著時間的流逝而消失,人們對數據分析時效性的要求也越來越高。越來越多的業務開始使用實時計算來及時獲取數據反饋。

之前實時計算團隊基於Apache Storm構建了早期的實時計算平臺。但在長期的維護過程中,Apache Storm一些設計和實現上的缺陷逐漸暴露出來。Apache Flink出現之後,其在計算接口、計算性能和可靠性上的優異表現,使我們決定使用Apache Flink作為新一代實時計算平臺的計算引擎。

Oceanus:基於Apache Flink的一站式實時計算平臺

相比於Storm和其他一些流計算框架,Flink有著更先進的計算框架,具有以下幾點優勢:

1)首先,Flink提供了更友好的編程接口。Storm提供的API偏底層且過於簡單,用戶需要大量的開發工作來完成業務需求。另外,用戶在開發Storm程序時的學習成本也較高,需要熟悉框架原理和在分佈式環境下的執行細節。Flink除了提供Table API和SQL這些高級的聲明式編程語言之外,還對window這些流計算中常見的算子進行了封裝,幫助用戶處理流計算中數據亂序到達等問題,極大的降低了流計算應用的開發成本並減少了不必要的重複開發。

2)Flink提供了有效的狀態管理支持。大部分的計算程序都是有狀態的,即計算結果不僅僅決定於輸入,還依賴於計算程序當前的狀態。但Storm對程序狀態的支持十分有限。一般情況下,用戶常常需要將狀態數據保存在MySQL和HBase這樣的外部存儲中,自己負責這些狀態數據的訪問。這些對外部存儲的訪問常常成為Storm程序的性能瓶頸。大多數情況下,用戶只能設計複雜的本地cache來提升性能。Spark Streaming直到最近才提供了有限的狀態管理支持,但受限於其實現機制需要一定的遠程訪問和數據遷移工作,因此狀態數據的訪問效率並不高。Flink則對計算程序的狀態存儲提供了有效支持。用戶可以通過提供的接口方便地存儲和訪問程序狀態。由於這些狀態數據存放在本地,因此用戶可以得到較高的訪問性能。在發生故障時,Flink的狀態管理會配合容錯機制進行狀態數據的重建,保證用戶程序的正確性。而當用戶需要修改程序併發度時,Flink也可以自動地將狀態數據分發到新的計算節點上。

3)Flink提供了豐富的容錯語義。由於Storm缺少對程序狀態的有效支持,其對容錯的支持也較弱,很難保證在發生故障的情況下,每條輸入數據恰好被處理一次。而Flink則依靠分佈式系統中經典的Chandy-Lamport算法,能夠對用戶程序的輸入和狀態生成滿足一致性的程序快照。在發生異常的情況下通過快照回滾,Flink可以保證EXACTLY-ONCE的容錯語義。而利用異步checkpoint和增量checkpoint技術,Flink能夠在以較低的成本對用戶程序進行快照。在開啟快照時,用戶程序的性能幾乎不受影響。

4)Flink擁有出色的執行性能。Flink基於事件觸發的執行模式對數據流進行處理,相比於Spark Streaming採取mini batch的執行模式,能夠大量減少程序執行時的調度開銷。此外,Flink對網絡層進行了大量優化,通過細粒度封鎖和高效內存訪問提高數據傳輸性能,並通過反壓機制和流量控制有效降低流量擁塞導致的性能下降。加上Flink能夠避免狀態數據的遠程訪問,Flink在實踐中表現出比其他流計算系統更出色的執行性能,具有更低的處理延遲和更高的吞吐能力。

二、平臺介紹

儘管Flink作為計算引擎有著較為出色的表現,但在業務遷移過程中,我們仍然遇到了一些問題。一個流計算任務從開發到上線要經歷包括開發、測試、部署和運維在內的多個階段。用戶首先在開發階段使用IDE開發程序,並進行編譯和打包。之後用戶將打包好的程序部署到測試環境中,生產測試數據進行測試。測試通過之後,用戶需要將其部署到現網環境中,並設定需要的運維指標進行監控。在這些階段中,用戶需要在不同環境和不同工具打交道,整體的開發和運維效率較低。

Oceanus:基於Apache Flink的一站式實時計算平臺

為了提高用戶流計算任務持續集成和持續發佈的效率,實時計算團隊圍繞Flink打造了Oceanus,一個集開發、測試、部署和運維於一體的一站式可視化實時計算平臺。Oceanus集成了應用管理、計算引擎和資源管理等功能,同時通過日誌、監控、運維等周邊服務打通了應用的整個生命週期。

Oceanus:基於Apache Flink的一站式實時計算平臺

目前,Oceanus已經覆蓋了所有業務BG,為多個業務提供實時計算服務。實時計算團隊還將騰訊內部負責數據接入、處理和管理工作的TDBank作業都從JStorm遷移到了Oceanus平臺上。另外,原先基於SQL on Storm的EasyCount平臺上的大部分業務也都已遷移到Oceanus。

2.1 多樣化的應用構建方式

Oceanus提供了多種形式的應用構建方式來滿足不同用戶的需求。一般用戶可以使用畫布方便的構建他們的實時計算應用。Oceanus在web頁面上提供了常見的流計算算子,用戶可以將算子拖拽到畫布上,並將這些算子連接起來之後就構建好了一個流計算應用。這種構建方式十分簡單,不需要用戶瞭解底層實現的細節,也不需要掌握SQL等語言的語法,使得用戶能夠專注於業務邏輯和數據流向。

Oceanus:基於Apache Flink的一站式實時計算平臺

對於具有一定數據分析背景的用戶,Oceanus提供了Flink SQL接口。Flink SQL儘量遵循SQL標準來描述流數據的計算語義,因此對以前經常使用數據倉庫進行離線數據分析的用戶能夠很快的遷移到Flink SQL上,並用Flink SQL對實時數據流進行分析。為了進一步降低用戶的開發成本,Oceanus還在平臺上提供了很多常見的SQL函數。為了打造便捷流暢的使用體驗,Oceanus還為Flink SQL的開發提供了一系列的輔助功能:

1)語法高亮和自動補齊

2)表名和字段名的快捷輸入、模糊匹配

3)常見函數的模糊匹配

4)一鍵檢查代碼有效性

5)一鍵代碼格式化

......

考慮到不管是畫布還是SQL,它們的表達能力都比較有限,在開發一些具有複雜邏輯的應用時較為困難,並且也不能進行一些底層細節的優化,Oceanus允許用戶繼續使用Flink提供的DataStream接口開發實時計算程序。在這種方式下,用戶只需要將他們的實時計算程序打包好上傳到Oceanus即可。

2.2 外部數據管理

為了方便用戶管理Flink作業讀取和寫入,Oceanus提供了對外部數據管理的功能。在開發應用之前,用戶可以通過Oceanus聲明應用所需要使用的數據源名稱,存儲類型(如Hippo,Tube,MySQL或HBase等),以及每個數據字段的名稱和類型。外部數據管理使用戶可以在Oceanus上既可以完成外部數據的創建和訪問,並在開發程序時提供必要的字段和格式信息,提高了用戶開發實時計算應用的效率。此外,外部數據管理也允許用戶更好地維護外部數據的血緣關係和生產邏輯,在數據發生異常時能夠根據生產鏈路追溯並定位問題。

Oceanus:基於Apache Flink的一站式實時計算平臺

2.2 實時可視化的計算結果

對於運行中的應用,Oceanus提供了實時查看計算結果的功能。目前Oceanus提供了兩種不同的實時可視化方式。首先,用戶可以通過Oceanus提供的結果抽樣功能獲取到當前計算結果的實時採樣,利用對比結果來對實時計算應用的正確性進行驗證。此外,Oceanus還打通了專業報表平臺 – 小馬報表(http://xiaoma.qq.com)。用戶可以將計算結果接入到小馬報表中來搭建業務的Dashboard,將業務數據進行實時可視化。

Oceanus:基於Apache Flink的一站式實時計算平臺

2.3 自助調試,快速驗證業務邏輯

在完成實時計算應用的開發中,Oceanus為用戶程序提供了一系列的工具進行應用邏輯的驗證。用戶既可以使用Oceanus提供的一鍵生成功能產生測試數據,也可以自己向Oceanus上傳自己的的測試數據,通過對比預期結果和實際結果來驗證應用邏輯的正確性。在後續工作中,Oceanus還將提供從現網數據抽樣生成測試數據的功能。這樣,用戶就可以更好通過更真實的測試數據來發現應用邏輯的問題。

Oceanus:基於Apache Flink的一站式實時計算平臺

2.4 快速方便的資源管理和作業部署

Oceanus:基於Apache Flink的一站式實時計算平臺

用戶在完成作業的開發和測試之後,可以通過Oceanus快速的在集群上進行部署。Oceanus依託騰訊內部的資源調度系統Gaia來進行資源管理和作業部署。Oceanus在作業管理頁面上提供了作業資源的配置頁面,用戶可以通過這個配置頁面來對作業所需要的CPU和內存資源進行配置,並指定作業需要部署的集群。當用戶完成配置之後,Oceanus會向Gaia申請對應的資源並將作業提交到Gaia上運行。基於Flink提供的checkpoint功能,Oceanus允許用戶對作業併發度進行實時修改,實現動態的擴容和縮容。

2.5 豐富的運維監控指標

Oceanus對Flink作業運行時的多個運行指標進行採集,包括Task Manager的內存,I/O和GC等。這些採集的指標被寫入了消息隊列Tube中,並利用時序數據庫OpenTSDB進行聚合。通過這些豐富的運行指標,用戶能夠很好的瞭解應用運行的情況,並在出現異常時能協助用戶及時的定位問題。運維人員則可以通過這些採集到的指標,設置報警策略並實現精細化的運營。

Oceanus:基於Apache Flink的一站式實時計算平臺

三、功能改進

為了能夠提供更好的實時計算服務,實時計算團隊對Flink內核也進行了大量的改進,提高其可用性和可靠性。

為了方便用戶開發畫布和SQL程序,實時計算團隊實現了超過30個的Table API和SQL函數。用戶可以利用這些內置函數極大地提高實時計算應用的開發效率。此外,實時計算團隊也對數據流和外部維表的join進行了大量優化。另外還提供了AsyncIO算子的超時處理。實時計算團隊還實現了增強窗口來對延遲到達的數據進行更好的處理,避免這些延遲數據的丟失對計算結果正確性的影響。

Oceanus:基於Apache Flink的一站式實時計算平臺

實時計算團隊也對Flink的穩定性做了大量的工作。例如通過改進Job Master的容錯機制,實時計算團隊可以實現Master在發生故障時不影響作業的正常執行。

在對Flink持續進行改進的同時,實時計算團隊也和Flink社區建立了密切合作,將這些改進回饋給Flink,為Flink的發展做出了大量貢獻。目前實時計算團隊已經擁有了1名committer以及3名活躍contributor。在剛剛發佈的Flink 1.7版本中,實時計算團隊成員貢獻了超過30個pull request。

Oceanus:基於Apache Flink的一站式實時計算平臺

在後面的工作中,Oceanus將繼續在實時計算的可用性和穩定性上努力,為用戶提供更好的實時計算服務。我們將繼續完善我們的運維監控指標,使我們的監控系統更加智能化,方便用戶對運行作業的監控和對異常情況的定位。同時,我們還將優化現有的彈性伸縮機制,使用戶能根據業務負載實現快速的擴容和縮容。最後,我們會改進Flink現有的狀態管理系統,減少Flink由於負載傾斜導致的性能下降。


分享到:


相關文章: