阿里巴巴為什麼選擇Apache Flink?
阿里妹導讀:伴隨著海量增長的資料,數字化時代的未來感撲面而至。不論是結繩記事的小資料時代,還是我們正在經歷的大資料時代,計算的邊界正在被無限拓寬,而資料的價值再也難以被計算。時下,談及大資料,不得不提到熱門的下一代大資料計算引擎Apache Flink(以下簡稱Flink)。本文將結合Flink的前世今生,從業務角度出發,向大家娓娓道來:為什麼阿里選擇了Flink?
本文主要整理自阿里巴巴計算平臺事業部資深技術專家莫問在雲棲大會的演講。
合抱之木,生於毫末
隨著人工智慧時代的降臨,資料量的爆發,在典型的大資料的業務場景下資料業務最通用的做法是:選用批處理的技術處理全量資料,採用流式計算處理實時增量資料。在絕大多數的業務場景之下,使用者的業務邏輯在批處理和流處理之中往往是相同的。但是,使用者用於批處理和流處理的兩套計算引擎是不同的。
因此,使用者通常需要寫兩套程式碼。毫無疑問,這帶來了一些額外的負擔和成本。阿里巴巴的商品資料處理就經常需要面對增量和全量兩套不同的業務流程問題,所以阿里就在想,我們能不能有一套統一的大資料引擎技術,使用者只需要根據自己的業務邏輯開發一套程式碼。這樣在各種不同的場景下,不管是全量資料還是增量資料,亦或者實時處理,一套方案即可全部支援,這就是阿里選擇Flink的背景和初衷。
目前開源大資料計算引擎有很多選擇,流計算如Storm,Samza,Flink,Kafka Stream等,批處理如Spark,Hive,Pig,Flink等。而同時支援流處理和批處理的計算引擎,只有兩種選擇:一個是Apache Spark,一個是Apache Flink。
從技術,生態等各方面的綜合考慮。首先,Spark的技術理念是基於批來模擬流的計算。而Flink則完全相反,它採用的是基於流計算來模擬批計算。
從技術發展方向看,用批來模擬流有一定的技術侷限性,並且這個侷限性可能很難突破。而Flink基於流來模擬批,在技術上有更好的擴充套件性。從長遠來看,阿里決定用Flink做一個統一的、通用的大資料引擎作為未來的選型。
Flink是一個低延遲、高吞吐、統一的大資料計算引擎。在阿里巴巴的生產環境中,Flink的計算平臺可以實現毫秒級的延遲情況下,每秒鐘處理上億次的訊息或者事件。同時Flink提供了一個Exactly-once的一致性語義。保證了資料的正確性。這樣就使得Flink大資料引擎可以提供金融級的資料處理能力。
Flink在阿里的現狀
基於Apache Flink在阿里巴巴搭建的平臺於2016年正式上線,並從阿里巴巴的搜尋和推薦這兩大場景開始實現。目前阿里巴巴所有的業務,包括阿里巴巴所有子公司都採用了基於Flink搭建的實時計算平臺。同時Flink計算平臺執行在開源的Hadoop叢集之上。採用Hadoop的YARN做為資源管理排程,以 HDFS作為資料儲存。因此,Flink可以和開源大資料軟體Hadoop無縫對接。
目前,這套基於Flink搭建的實時計算平臺不僅服務於阿里巴巴集團內部,而且通過阿里雲的雲產品API向整個開發者生態提供基於Flink的雲產品支援。
Flink在阿里巴巴的大規模應用,表現如何?
規模:一個系統是否成熟,規模是重要指標,Flink最初上線阿里巴巴只有數百臺伺服器,目前規模已達上萬臺,此等規模在全球範圍內也是屈指可數;
狀態資料:基於Flink,內部積累起來的狀態資料已經是PB級別規模;
Events:如今每天在Flink的計算平臺上,處理的資料已經超過萬億條;
PS:在峰值期間可以承擔每秒超過4.72億次的訪問,最典型的應用場景是阿里巴巴雙11大屏;
Flink的發展之路
接下來從開源技術的角度,來談一談Apache Flink是如何誕生的,它是如何成長的?以及在成長的這個關鍵的時間點阿里是如何進入的?並對它做出了那些貢獻和支援?
Flink誕生於歐洲的一個大資料研究專案StratoSphere。該專案是柏林工業大學的一個研究性專案。早期,Flink是做Batch計算的,但是在2014年,StratoSphere裡面的核心成員孵化出Flink,同年將Flink捐贈Apache,並在後來成為Apache的頂級大資料專案,同時Flink計算的主流方向被定位為Streaming,即用流式計算來做所有大資料的計算,這就是Flink技術誕生的背景。
2014年Flink作為主攻流計算的大資料引擎開始在開源大資料行業內嶄露頭角。區別於Storm,Spark Streaming以及其他流式計算引擎的是:它不僅是一個高吞吐、低延遲的計算引擎,同時還提供很多高階的功能。比如它提供了有狀態的計算,支援狀態管理,支援強一致性的資料語義以及支援Event Time,WaterMark對訊息亂序的處理。
Flink核心概念以及基本理念
Flink最區別於其他流計算引擎的,其實就是狀態管理。
什麼是狀態?例如開發一套流計算的系統或者任務做資料處理,可能經常要對資料進行統計,如Sum,Count,Min,Max,這些值是需要儲存的。因為要不斷更新,這些值或者變數就可以理解為一種狀態。如果資料來源是在讀取Kafka,RocketMQ,可能要記錄讀取到什麼位置,並記錄Offset,這些Offset變數都是要計算的狀態。
Flink提供了內建的狀態管理,可以把這些狀態儲存在Flink內部,而不需要把它儲存在外部系統。這樣做的好處是第一降低了計算引擎對外部系統的依賴以及部署,使運維更加簡單;第二,對效能帶來了極大的提升:如果通過外部去訪問,如Redis,HBase它一定是通過網路及RPC。如果通過Flink內部去訪問,它只通過自身的程式去訪問這些變數。同時Flink會定期將這些狀態做Checkpoint持久化,把Checkpoint儲存到一個分散式的持久化系統中,比如HDFS。這樣的話,當Flink的任務出現任何故障時,它都會從最近的一次Checkpoint將整個流的狀態進行恢復,然後繼續執行它的流處理。對使用者沒有任何資料上的影響。
Flink是如何做到在Checkpoint恢復過程中沒有任何資料的丟失和資料的冗餘?來保證精準計算的?
這其中原因是Flink利用了一套非常經典的Chandy-Lamport演算法,它的核心思想是把這個流計算看成一個流式的拓撲,定期從這個拓撲的頭部Source點開始插入特殊的Barries,從上游開始不斷的向下遊廣播這個Barries。每一個節點收到所有的Barries,會將State做一次Snapshot,當每個節點都做完Snapshot之後,整個拓撲就算完整的做完了一次Checkpoint。接下來不管出現任何故障,都會從最近的Checkpoint進行恢復。
Flink利用這套經典的演算法,保證了強一致性的語義。這也是Flink與其他無狀態流計算引擎的核心區別。
下面介紹Flink是如何解決亂序問題的。比如星球大戰的播放順序,如果按照上映的時間觀看,可能會發現故事在跳躍。
在流計算中,與這個例子是非常類似的。所有訊息到來的時間,和它真正發生在源頭,線上系統Log當中的時間是不一致的。在流處理當中,希望是按訊息真正發生在源頭的順序進行處理,不希望是真正到達程式裡的時間來處理。Flink提供了Event Time和WaterMark的一些先進技術來解決亂序的問題。使得使用者可以有序的處理這個訊息。這是Flink一個很重要的特點。
接下來要介紹的是Flink啟動時的核心理念和核心概念,這是Flink發展的第一個階段;第二個階段時間是2015年和2017年,這個階段也是Flink發展以及阿里巴巴介入的時間。故事源於2015年年中,我們在搜尋事業部的一次調研。當時阿里有自己的批處理技術和流計算技術,有自研的,也有開源的。但是,為了思考下一代大資料引擎的方向以及未來趨勢,我們做了很多新技術的調研。
結合大量調研結果,我們最後得出的結論是:解決通用大資料計算需求,批流融合的計算引擎,才是大資料技術的發展方向,並且最終我們選擇了Flink。
但2015年的Flink還不夠成熟,不管是規模還是穩定性尚未經歷實踐。最後我們決定在阿里內部建立一個Flink分支,對Flink做大量的修改和完善,讓其適應阿里巴巴這種超大規模的業務場景。在這個過程當中,我們團隊不僅對Flink在效能和穩定性上做出了很多改進和優化,同時在核心架構和功能上也進行了大量創新和改進,並將其貢獻給社群,例如:Flink新的分散式架構,增量Checkpoint機制,基於Credit-based的網路流控機制和Streaming SQL等。
阿里巴巴對Flink社群的貢獻
我們舉兩個設計案例,第一個是阿里巴巴重構了Flink的分散式架構,將Flink的Job排程和資源管理做了一個清晰的分層和解耦。這樣做的首要好處是Flink可以原生的跑在各種不同的開源資源管理器上。經過這套分散式架構的改進,Flink可以原生地跑在Hadoop Yarn和Kubernetes這兩個最常見的資源管理系統之上。同時將Flink的任務排程從集中式排程改為了分散式排程,這樣Flink就可以支援更大規模的叢集,以及得到更好的資源隔離。
另一個是實現了增量的Checkpoint機制,因為Flink提供了有狀態的計算和定期的Checkpoint機制,如果內部的資料越來越多,不停地做Checkpoint,Checkpoint會越來越大,最後可能導致做不出來。提供了增量的Checkpoint後,Flink會自動地發現哪些資料是增量變化,哪些資料是被修改了。同時只將這些修改的資料進行持久化。這樣Checkpoint不會隨著時間的執行而越來越難做,整個系統的效能會非常地平穩,這也是我們貢獻給社群的一個很重大的特性。
經過2015年到2017年對Flink Streaming的能力完善,Flink社群也逐漸成熟起來。Flink也成為在Streaming領域最主流的計算引擎。因為Flink最早期想做一個流批統一的大資料引擎,2018年已經啟動這項工作,為了實現這個目標,阿里巴巴提出了新的統一API架構,統一SQL解決方案,同時流計算的各種功能得到完善後,我們認為批計算也需要各種各樣的完善。無論在任務排程層,還是在資料Shuffle層,在容錯性,易用性上,都需要完善很多工作。
篇幅原因,下面主要和大家分享兩點:
統一 API Stack
統一 SQL方案
先來看下目前Flink API Stack的一個現狀,調研過Flink或者使用過Flink的開發者應該知道。Flink有2套基礎的API,一套是DataStream,一套是DataSet。DataStream API是針對流式處理的使用者提供,DataSet API是針對批處理使用者提供,但是這兩套API的執行路徑是完全不一樣的,甚至需要生成不同的Task去執行。所以這跟得到統一的API是有衝突的,而且這個也是不完善的,不是最終的解法。在Runtime之上首先是要有一個批流統一融合的基礎API層,我們希望可以統一API層。
因此,我們在新架構中將採用一個DAG(有限無環圖)API,作為一個批流統一的API層。對於這個有限無環圖,批計算和流計算不需要涇渭分明的表達出來。只需要讓開發者在不同的節點,不同的邊上定義不同的屬性,來規劃資料是流屬性還是批屬性。整個拓撲是可以融合批流統一的語義表達,整個計算無需區分是流計算還是批計算,只需要表達自己的需求。有了這套API後,Flink的API Stack將得到統一。
除了統一的基礎API層和統一的API Stack外,同樣在上層統一SQL的解決方案。流和批的SQL,可以認為流計算有資料來源,批計算也有資料來源,我們可以將這兩種源都模擬成資料表。可以認為流資料的資料來源是一張不斷更新的資料表,對於批處理的資料來源可以認為是一張相對靜止的表,沒有更新的資料表。整個資料處理可以當做SQL的一個Query,最終產生的結果也可以模擬成一個結果表。
對於流計算而言,它的結果表是一張不斷更新的結果表。對於批處理而言,它的結果表是相當於一次更新完成的結果表。從整個SOL語義上表達,流和批是可以統一的。此外,不管是流式SQL,還是批處理SQL,都可以用同一個Query來表達複用。這樣以來流批都可以用同一個Query優化或者解析。甚至很多流和批的運算元都是可以複用的。
Flink的未來方向
首先,阿里巴巴還是要立足於Flink的本質,去做一個全能的統一大資料計算引擎。將它在生態和場景上進行落地。目前Flink已經是一個主流的流計算引擎,很多網際網路公司已經達成了共識:Flink是大資料的未來,是最好的流計算引擎。下一步很重要的工作是讓Flink在批計算上有所突破。在更多的場景下落地,成為一種主流的批計算引擎。然後進一步在流和批之間進行無縫的切換,流和批的界限越來越模糊。用Flink,在一個計算中,既可以有流計算,又可以有批計算。
第二個方向就是Flink的生態上有更多語言的支援,不僅僅是Java,Scala語言,甚至是機器學習下用的Python,Go語言。未來我們希望能用更多豐富的語言來開發Flink計算的任務,來描述計算邏輯,並和更多的生態進行對接。
最後不得不說AI,因為現在很多大資料計算的需求和資料量都是在支援很火爆的AI場景,所以在Flink流批生態完善的基礎上,將繼續往上走,完善上層Flink的Machine Learning演算法庫,同時Flink往上層也會向成熟的機器學習,深度學習去整合。比如可以做Tensorflow On Flink, 讓大資料的ETL資料處理和機器學習的Feature計算和特徵計算,訓練的計算等進行整合,讓開發者能夠同時享受到多種生態給大家帶來的好處。
2018年12月20日-21日,首屆Flink Forward China峰會將在北京國家會議中心舉辦。點選文末“閱讀原文”即可報名。
阿里巴巴數學大賽賽題、官方參考答案現已公佈。
長按識別以下二維碼,關注“阿里巴巴機器智慧”公眾號,回覆“數學大賽”,即可下載。
↑ 翹首以盼等你關注
你可能還喜歡
點選下方圖片即可閱讀
關注「阿里技術」
把握前沿技術脈搏
相關文章
- 為什麼要選擇Apache Pulsar:IO隔離Apache
- 為什麼選擇.NETCore?NetCore
- 為什麼選擇Guice框架GUI框架
- 為什麼選擇使用Rust?Rust
- Aembit為什麼選擇 Rust?Rust
- 為什麼選擇Cynefin框架? – zwischenzugs框架
- 為什麼選擇高防DNS?DNS
- 為什麼選擇centos系統CentOS
- 為什麼選擇Python做爬蟲Python爬蟲
- 為什麼選擇ASP.NET CoreASP.NET
- 為什麼建議新手選擇Ubuntu?告訴你選擇理由!Ubuntu
- 為什麼選擇獨立伺服器伺服器
- [20200326]為什麼選擇這個索引.txt索引
- 你當初為什麼選擇了前端?前端
- 為什麼選擇無伺服器模型?伺服器模型
- 為什麼爬蟲要選擇住宅代理?爬蟲
- 老闆:你為什麼要選擇 Vue?Vue
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- 什麼Jupyter?為什麼初學Python推薦選擇Jupyter?Python
- 三種大資料流處理框架選擇比較:Apache Kafka流、Apache Spark流和Apache Flink - quora大資料框架ApacheKafkaSpark
- 新加坡為什麼是ICO的最後選擇,同時也是最佳選擇?
- Apache Flink 為什麼能夠成為新一代大資料計算引擎?Apache大資料
- 我為什麼放棄MySQL?選擇了MongoDBMySqlMongoDB
- 大公司為什麼要會選擇DevOps?dev
- (轉)為什麼選擇機器學習策略機器學習
- 為什麼選擇Java?Java具體好在哪?Java
- 為什麼要選擇代理來進行抓取?
- 為什麼要選擇分散式資料庫?分散式資料庫
- 為什麼選擇高防DNS雲解析?(一)DNS
- 為什麼要選擇電話機器人?機器人
- 為什麼伺服器選擇Linux系統伺服器Linux
- 為什麼選擇學習六西格瑪?
- 為什麼選擇 Intellij IDEA 作為日常開發工具IntelliJIdea
- 我為什麼選擇成為獨立開發者
- 你是怎麼選擇resetting和normalizing的?為什麼?ORM
- Apache Flink on K8s:四種執行模式,我該選擇哪種?ApacheK8S模式
- 為什麼我會選擇走 Java 這條路?Java
- 為什麼要選擇蘋果企業簽名?蘋果