當前位置:股票大全官網 - 股票投資 - 轉載:阿裏巴巴為什麽選擇Apache Flink?

轉載:阿裏巴巴為什麽選擇Apache Flink?

本文主要整理自阿裏巴巴計算平臺事業部高級技術專家莫問在雲起大會上的演講。

壹棵大樹從壹棵小樹苗長成;小小橡實可能長成參天大樹

隨著人工智能時代的到來和數據的爆炸式增長,典型大數據業務場景中最常見的數據業務方式是使用批處理技術處理總量數據,使用流計算處理實時增量數據。在大多數業務場景中,用戶的業務邏輯在批處理和流處理中往往是相同的。但是,用戶用於批處理和流處理的兩套計算引擎是不同的。

因此,用戶通常需要編寫兩套代碼。無疑,這帶來了壹些額外的負擔和成本。阿裏巴巴的商品數據處理往往需要面對增量和全量兩套不同的業務流程,所以阿裏在想,我們能不能有壹個統壹的大數據引擎技術,用戶只需要根據自己的業務邏輯開發壹套代碼。這樣在各種場景下,無論是全數據還是增量數據,或者實時處理,壹套方案都可以支持,這也是阿裏選擇Flink的背景和初衷。

目前開源的大數據計算引擎有很多選擇,包括Storm、Samza、Flink、Kafka Stream等流計算,Spark、Hive、Pig、Flink等批量計算。但是同時支持流處理和批處理的計算引擎只有兩個選擇:壹個是Apache Spark,壹個是Apache Flink。

從技術、生態等多方面綜合考慮。首先,Spark的技術理念是模擬基於批量的流量計算。另壹方面,Flink使用基於流的計算來模擬批處理計算。

從技術發展的角度來看,用批處理來模擬流程存在壹定的技術局限性,這種局限性可能很難突破。另壹方面,Flink基於流模擬批處理,這在技術上更具可擴展性。從長遠來看,阿裏決定將Flink作為未來選擇的統壹通用大數據引擎。

Flink是壹個低延遲、高吞吐量的統壹大數據計算引擎。在阿裏巴巴的生產環境中,Flink的計算平臺每秒可以處理數億條消息或事件,延遲為毫秒級。同時,Flink提供了壹次性壹致性語義。保證了數據的正確性。這使得Flink大數據引擎能夠提供金融級的數據處理能力。

弗林克在阿裏的現狀

基於Apache Flink在阿裏巴巴搭建的平臺於2016正式上線,從阿裏巴巴的搜索和推薦兩個場景實現。目前,阿裏巴巴所有業務,包括阿裏巴巴所有子公司,都采用了基於Flink的實時計算平臺。同時,Flink計算平臺運行在開源的Hadoop集群上。Hadoop的YARN作為資源管理調度,HDFS作為數據存儲。所以Flink可以和開源大數據軟件Hadoop無縫對接。

目前,這個基於Flink的實時計算平臺不僅服務於阿裏巴巴集團,還通過阿裏雲的雲產品API向整個開發者生態系統提供基於Flink的雲產品支持。

Flink在阿裏巴巴的大規模應用表現如何?

規模:壹個系統是否成熟是壹個重要的指標。Flink最初推出阿裏巴巴只有幾百臺服務器,現在規模已經達到上萬臺,這樣的規模在全球屈指可數;

狀態數據:基於Flink,內部積累的狀態數據已經是PB級;

事件:如今,每天有超過壹萬億條數據在Flink的計算平臺上被處理。

PS:高峰期每秒可承擔超過4.72億次訪問。最典型的應用場景是阿裏巴巴的雙11大屏;

弗林克的發展之路

接下來,從開源技術的角度,我們來談談Apache Flink是如何誕生,如何成長的。而阿裏是如何在這個成長的關鍵時刻進入的?而妳又為此做出了哪些貢獻和支持?

Flink誕生於歐洲大數據研究項目平流層。這個項目是柏林工業大學的壹個研究項目。早期Flink做的是批量計算,但是2014年,平流層的核心成員孵化了Flink,同年把Flink捐贈給了Apache,後來成為Apache的頂級大數據項目。同時,Flink計算的主流方向被定位為流式,即利用流式計算來做所有的大數據計算,這是Flink技術誕生的背景。

2014作為專註於流計算的大數據引擎,Flink開始在開源大數據行業嶄露頭角。不同於Storm、Spark Streaming等流計算引擎,它不僅是壹個高吞吐量、低延遲的計算引擎,還提供了許多高級功能。比如提供有狀態計算,支持狀態管理,支持強壹致性數據語義,支持事件時間,水印處理消息無序。

Flink核心概念和基本概念

Flink區別於其他流計算引擎的地方其實是狀態管理。

什麽是國家?比如開發壹個流計算系統或者數據處理的任務,經常需要對數據進行統計,比如sum,count,min,max,這些值都需要存儲。因為它是不斷更新的,所以這些值或變量可以理解為壹種狀態。如果數據源正在讀取Kafka和Rocket MQ,可能需要記錄讀取的位置並記錄偏移量。這些偏移變量都是要計算的狀態。

Flink提供內置的狀態管理,可以存儲在Flink內部,不需要存儲在外部系統中。這樣做的好處是:首先,減少了計算引擎對外部系統的依賴和部署,使得運維更加容易;第二,在性能上有了很大的提升:如果是從外部訪問,比如Redis和HBase,就必須通過網絡和RPC訪問。如果是通過Flink訪問的,那麽它只通過自己的進程訪問這些變量。同時,Flink會定期在檢查點持久化這些狀態,並將檢查點存儲在分布式持久化系統中,比如HDFS。這樣,當Flink的任務出現任何故障時,它都會從最新的檢查點開始恢復整個流的狀態,然後繼續運行它的流處理。對用戶沒有數據影響。

Flink如何在檢查點恢復過程中實現無數據丟失和數據冗余?要保證計算準確?

原因是Flink使用了非常經典的Chandy-Lamport算法。其核心思想是將這種流量計算視為流式拓撲,每隔壹定時間從拓撲的源點插入特殊的屏障,將屏障從上遊廣播到下遊。當每個節點接收到所有柵欄時,它將拍攝狀態快照。當每個節點完成快照時,整個拓撲將被視為壹個完整的檢查點。接下來,無論出現任何故障,都將從最近的檢查點恢復。

Flink使用這種經典算法來確保語義的強壹致性。這也是Flink與其他無狀態流計算引擎的核心區別。

以下是Flink解決無序問題的方法。比如按照上映時間看星球大戰的序列,可能會發現故事跳躍。

在流量計算上,和這個例子很像。所有消息的到達時間與源在線系統日誌中實際發生的時間不壹致。在流處理中,希望消息按照它們在源中實際出現的順序進行處理,而不是按照它們實際到達程序的時間進行處理。Flink提供了壹些先進的事件時間和水印技術來解決亂序問題。以便用戶可以有序地處理該消息。這是Flink的壹個很重要的特點。

接下來介紹壹下Flink起步時的核心概念和理念,這是Flink發展的第壹個階段。第二階段是2015和2017,也是Flink發展和阿裏巴巴介入的時間。故事源於2015年中搜索事業部的壹次調查。當時阿裏有自己的批處理技術和流計算技術,既有自研的,也有開源的。但是,為了思考下壹代大數據引擎的方向和未來趨勢,我們對新技術做了大量的研究。

結合大量的研究成果,我們最終得出結論:解決通用大數據計算需求,融合批量和流的計算引擎是大數據技術的發展方向,最終我們選擇了Flink。

但是2015的Flink還不夠成熟,規模和穩定性還沒有經歷實踐。最後我們決定在阿裏成立Flink分公司,對Flink進行大量的修改和改進,使其適應阿裏巴巴超大規模的業務場景。在這個過程中,我們團隊不僅在Flink的性能和穩定性上做了大量的改進和優化,在核心架構和功能上也做了大量的創新和改進,並貢獻給了社區,比如Flink新的分布式架構、增量式檢查點機制、基於信用的網絡流量控制機制和流式SQL。

阿裏巴巴對Flink社區的貢獻

我們來看兩個設計案例。第壹個是阿裏巴巴重構了Flink的分布式架構,對Flink的作業調度和資源管理進行了清晰的分層和解耦。這樣做的第壹個好處是Flink可以在各種開源資源管理器上本地運行。這種分布式架構改進後,Flink可以在Hadoop Yarn和Kubernetes這兩種最常見的資源管理系統上運行。同時,Flink的任務調度由集中式調度改為分布式調度,使Flink可以支持更大的集群,獲得更好的資源隔離。

另壹個是實現增量檢查點機制,因為Flink提供了有狀態計算和周期性檢查點機制。如果內部數據越來越多,檢查點就會越來越大,最終可能導致失敗。提供增量檢查點後,Flink會自動找出哪些數據是增量,哪些數據是修改過的。同時,只有這些修改過的數據被持久化。這樣Checkpoint就不會隨著時間變得越來越難做,整個系統的性能也會非常穩定,這也是我們貢獻給社區的壹個非常重要的特性。

2015到2017之後,Flink流能力提升,Flink社區逐漸成熟。Flink也成為流媒體領域最主流的計算引擎。因為Flink最開始是想做壹個統壹流式和批量處理的大數據引擎,所以這個工作是從2018開始的。為了實現這壹目標,阿裏巴巴提出了新的統壹API架構和統壹SQL解決方案。同時,在流式計算的各種功能改進後,我們認為批量計算也需要各種改進。無論是在任務調度層還是數據洗牌層,在容錯性和易用性方面都有很多工作需要改進。

由於篇幅原因,這裏有兩個要點與大家分享:

●統壹的API堆棧

●統壹的SQL方案

我們來看看Flink API棧的現狀。研究過Flink或者用過Flink的開發者應該都知道。Flink有兩個基本的API,壹個是數據流,壹個是數據集。數據流API提供給流用戶,數據集API提供給批量用戶,但是這兩個API的執行路徑完全不同,甚至需要生成不同的任務來執行。所以這和得到壹個統壹的API是沖突的,而且這並不完美,不是最終的解決方案。在運行時之上,必須有壹個基礎的API層,用於批量流程的統壹和集成,我們希望統壹API層。

因此,我們將采用DAG(有限非循環圖)API作為新架構中批處理流的統壹API層。對於這種有限無環圖,批量計算和流量計算不需要明確表示。開發者只需要在不同的節點和不同的邊定義不同的屬性,就可以規劃數據是流屬性還是批屬性。整個拓撲可以是批量流的統壹語義表達,整個計算不需要區分流計算和批量計算,只需要表達自己的需求。有了這個API,Flink的API棧就統壹了。

除了統壹的基礎API層和統壹的API棧,SQL解決方案在上層也是統壹的。對於流量和批量的SQL,可以考慮有流量計算的數據源和批量計算的數據源,我們可以把兩個數據源都模擬成數據表。可以認為流數據的數據源是壹個不斷更新的數據表,批處理的數據源可以認為是壹個相對靜態的表,沒有更新的數據表。整個數據處理可以看作是SQL的壹個查詢,最終結果也可以模擬成壹個結果表。

對於流量計算,它的結果表是壹個不斷更新的結果表。對於批處理,其結果表相當於更新後的結果表。從整個SOL語義來看,流和批處理是可以統壹的。此外,流SQL和批處理SQL都可以使用同壹個查詢來表示重用。這樣,所有流批次都可以用同壹個查詢進行優化或解析。甚至許多流和批處理操作符都可以重用。

弗林克的未來方向

首先,阿裏巴巴要基於Flink的本質做壹個全能的統壹大數據計算引擎。在生態和場景上落地。目前,Flink已經是主流的流式計算引擎,很多互聯網公司已經達成共識,Flink是大數據的未來,是最好的流式計算引擎。接下來的重要任務是讓Flink在批量計算上有所突破。在更多場景下成為主流的批量計算引擎。然後進壹步進行流和批的無縫切換,流和批的界限越來越模糊。使用Flink,在壹個計算中,可以同時進行流量計算和批量計算。

第二個方向是Flink的生態被更多的語言支持,不僅僅是Java,Scala,甚至是機器學習中使用的Python和Go。未來希望用更豐富的語言開發Flink計算任務,描述計算邏輯,連接更多生態。

最後不得不說AI,因為現在很多大數據計算需求和數據量都在支持非常熱門的AI場景,所以在Flink batch生態完善的基礎上,我們會繼續往上走,完善上層Flink的機器學習算法庫,同時Flink會向成熟的機器學習,與上層深度學習融合。比如可以在Flink上做Tensorflow,把大數據的ETL數據處理和機器學習的特征計算、特征計算、訓練計算整合在壹起,讓開發者同時享受多個生態系統帶來的好處。