阿里妹導讀:如同咱們去年12月在 Flink Forward China 峯會所約,阿里巴巴內部 Flink 版本 Blink 將於 2019 年 1 月底正式開源。今天,咱們終於等到了這一刻。web
阿里資深技術專家大沙,將爲你們詳細介紹本次開源的Blink主要功能和優化點,但願與業界同仁共同攜手,推進Flink社區進一步發展。算法
Apache Flink是德國柏林工業大學的幾個博士生和研究生從學校開始作起來的項目,早期叫作Stratosphere。2014年,StratoSphere項目中的核心成員從學校出來開發了Flink,同時將Flink計算的主流方向定位爲流計算,並在同年將Flink捐贈Apache,後來快速孵化成爲Apache的頂級項目。如今Flink是業界公認的最好的大數據流計算引擎。性能優化
阿里巴巴在2015年開始嘗試使用Flink。可是阿里的業務體量很是龐大,挑戰也不少。彼時的Flink無論是規模仍是穩定性還沒有經歷實踐,成熟度有待商榷。爲了把這麼大的業務體量支持好,咱們不得不在Flink之上作了一系列的改進,因此阿里巴巴維護了一個內部版本的Flink,它的名字叫作Blink。網絡
基於Blink的計算平臺於2016年正式上線。截至目前,阿里絕大多數的技術部門都在使用Blink。Blink一直在阿里內部錯綜複雜的業務場景中鍛鍊成長着。對於內部用戶反饋的各類性能、資源使用率、易用性等諸多方面的問題,Blink都作了針對性的改進。雖然如今Blink在阿里內部用的最多的場景主要仍是在流計算,可是在批計算場景也有很多業務上線使用了。例如,在搜索和推薦的算法業務平臺中,它使用Blink同時進行流計算和批處理。Blink被用來實現了流批一體化的樣本生成和特徵抽取這些流程,可以處理的特徵數達到了數千億,並且每秒鐘處理數億條消息。在這個場景的批處理中,咱們單個做業處理的數據量已經超過400T,而且爲了節省資源,咱們的批處理做業是和流計算做業以及搜索的在線引擎運行在一樣的機器上。因此你們能夠看到流批一體化已經在阿里巴巴取得了極大的成功,咱們但願這種成功和阿里巴巴內部的經驗都可以帶回給社區。數據結構
其實從咱們選擇Flink的第一天開始咱們就一直和社區緊密合做。過去的這幾年咱們也一直在把阿里對Flink 的改進推回社區。從2016年開始咱們已經將流計算SQL的大部分功能,針對runtime的穩定性和性能優化作的若干重要設計都推回了社區。可是Blink自己發展迭代的速度很是快,而社區有本身的步伐,不少時候可能沒法把咱們的變動及時推回去。對於社區來講,一些大的功能和重構,須要達成共識後,才能被接受,這樣才能更好地保證開源項目的質量,可是同時就會致使推入的速度變得相對較慢。通過這幾年的開發迭代,咱們這邊和社區之間的差距已經變得比較大了。架構
Blink 有一些很好的新功能,好比性能優越的批處理功能,在社區的版本是沒有的。在過去這段時間裏,咱們不斷聽到有人在詢問Blink的各類新功能。指望Blink儘快開源的呼聲愈來愈大。咱們一直在思考如何開源的問題,一種方案就是和之前同樣,繼續把各類功能和優化分解,逐個和社區討論,慢慢地推回Flink。但這顯然不是你們所期待的。另外一個方案,就是先完整的儘量的多的把代碼開源,讓社區的開發者可以儘快試用起來。第二個方案很快收到社區廣大用戶的支持。所以,從2018年年中開始咱們就開始作開源的相關準備。通過半年的努力,咱們終於把大部分Blink的功能梳理好,開源了出來。運維
咱們把代碼貢獻出來,是爲了讓你們能先嚐試一些他們感興趣的功能。Blink永遠不會單獨成爲一個獨立的開源項目來運做,他必定是Flink的一部分。開源後咱們指望能找到辦法以最快的方式將Blink merge到Flink中去。Blink開源只有一個目的,就是但願 Flink 作得更好。Apache Flink 是一個社區項目,Blink以什麼樣的形式進入 Flink 是最合適的,怎麼貢獻是社區最但願的方式,咱們都要和社區一塊兒討論。機器學習
在過去的一段時間內,咱們在Flink社區徵求了普遍的意見,你們一致認爲將本次開源的Blink代碼做爲Flink的一個branch直接推回到Apache Flink項目中是最合適的方式。而且咱們和社區也一塊兒討論規劃出一套可以快速merge Blink到Flink master中的方案(具體細節能夠查看Flink社區正在討論的FLIP32)。咱們指望這個merge可以在很短的時間內完成。這樣咱們以後的Machine Learning等其餘新功能就能夠直接推回到Flink master。相信用不了多久,Flink 和 Blink 就徹底合二爲一了。在那以後,阿里巴巴將直接使用Flink用於生產,並同時協助社區一塊兒來維護Flink。性能
本次開源的Blink代碼在Flink 1.5.1版本之上,加入了大量的新功能,以及在性能和穩定性上的各類優化。主要貢獻包括,阿里巴巴在流計算上積累的一些新功能和性能的優化,一套完整的(可以跑通所有TPC-H/TPC-DS,可以讀取Hive meta和data)高性能Batch SQL,以及一些以提高易用性爲主的功能(包括支持更高效的interactive programming, 與zeppelin更緊密的結合, 以及體驗和性能更佳的Flink web)。將來咱們還將繼續給Flink貢獻在AI,IoT以及其餘新領域的功能和優化。更多的關於這一版本Blink release的細節,請參考Blink代碼根目錄下的README.md文檔。下面,我來分模塊介紹下Blink主要的新的功能和優化點。學習
爲了更好的支持batch processing,以及解決阿里巴巴大規模生產場景中遇到的各類挑戰,Blink對Runtime架構、效率、穩定性方面都作了大量改進。在架構方面,首先Blink引入了Pluggable ShuffleArchitecture,開發者能夠根據不一樣的計算模型或者新硬件的須要實現不一樣的shuffle策略進行適配。此外Blink還引入新的調度架構,允許開發者根據計算模型自身的特色定製不一樣調度器。爲了優化性能,Blink可讓算子更加靈活的chain在一塊兒,避免了沒必要要的數據傳輸開銷。在Pipeline Shuffle模式中,使用了ZeroCopy減小了網絡層內存消耗。在BroadCast Shuffle模式中,Blink優化掉了大量的沒必要要的序列化和反序列化開銷。
此外,Blink提供了全新的JM FailOver機制,JM發生錯誤以後,新的JM會從新接管整個JOB而不是重啓JOB,從而大大減小了JM FailOver對JOB的影響。最後,Blink也開發了對Kubernetes的支持。不一樣於Standalone模式在Kubernetes上的拉起方式,在基於Flink FLIP6的架構上基礎之上,Blink根據job的資源需求動態的申請/釋放Pod來運行TaskExecutor,實現了資源彈性,提高了資源的利用率。
SQL/TableAPI架構上的重構和性能的優化是Blink本次開源版本的一個重大貢獻。首先,咱們對SQL engine的架構作了較大的調整。提出了全新的Query Processor(QP), 它包括了一個優化層(Query Optimizer)和一個算子層(Query Executor)。這樣一來,流計算和批計算的在這兩層大部分的設計工做就能作到儘量的複用。
另外,SQL和TableAPI的程序最終執行的時候將不會翻譯到DataStream和DataSet這兩個API上,而是直接構建到可運行的DAG上來,這樣就使得物理執行算子的設計不徹底依賴底層的API,有了更大的靈活度,同時執行代碼也可以被靈活的codegen出來。惟一的一個影響就是這個版本的SQL和TableAPI不能和DataSet這個API進行互相轉換,但仍然保留了和DataStream API互相轉換的能力(將DataStream註冊成表,或將Table轉成DataStream後繼續操做)。將來,咱們計劃把dataset的功能慢慢都在DataStream和TableAPI上面實現。到那時DataStream和SQL以及tableAPI同樣,是一個能夠同時描述bounded以及unbounded processing的API。
除了架構上的重構,Blink還在具體實現上作了較多比較大的重構。首先,Blink引入了二進制的數據結構BinaryRow,極大的減小了數據存儲上的開銷以及數據在序列化和反序列化上計算的開銷。其次,在算子的實現層面,Blink在更廣範圍內引入了CodeGen技術。因爲預先知道算子須要處理的數據的類型,在QP層內部就能夠直接生成更有針對性更高效的執行代碼。
Blink的算子會動態的申請和使用資源,可以更好的利用資源,提高效率,更加劇要的是這些算子對資源有着比較好的控制,不會發生OutOfMemory 的問題。此外,針對流計算場景,Blink加入了miniBatch的執行模式,在aggregate、join等須要和state頻繁交互且每每又能先作部分reduce的場景中,使用miniBatch可以極大的減小IO,從而成數量級的提高性能。除了上面提到的這些重要的重構和功能點,Blink還實現了完整的SQL DDL,帶emit策略的流計算DML,若干重要的SQL功能,以及大量的性能優化策略。
有了上面提到的諸多架構和實現上的重構。Blink的SQL/tableAPI在功能和性能方面都取得了脫胎換骨的變化。在批計算方面,首先Blink batch SQL可以完整的跑通TPC-H和TPC-DS,且性能上有着極大的提高。如上圖所示,是此次開源的Blink版本和spark 2.3.1的TPC-DS的benchmark性能對比。柱狀圖的高度表明瞭運行的總時間,高度越低說明性能越好。能夠看出,Blink在TPC-DS上和Spark相比有着很是明顯的性能優點。並且這種性能優點隨着數據量的增長而變得愈來愈大。在實際的場景這種優點已經超過 Spark的三倍。在流計算性能上咱們也取得了相似的提高。咱們線上的不少典型做業,它的性能是原來的3到5倍。在有數據傾斜的場景,以及若干比較有挑戰的TPC-H query,流計算性能甚至獲得了數十倍的提高。
除了標準的Relational SQL API。TableAPI在功能上是SQL的超集,所以在SQL上全部新加的功能,咱們在tableAPI也添加了相對應的API。除此以外,咱們還在TableAPI上引入了一些新的功能。其中一個比較重要是cache功能。在批計算場景下,用戶能夠根據須要來cache計算的中間結果,從而避免沒必要要的重複計算。它極大的加強了interactive programming體驗。咱們後續會在tableAPI上添加更多有用的功能。其實不少新功能已經在社區展開討論並被社區接受,例如咱們在tableAPI增長了對一整行操做的算子map/flatMap/aggregate/flatAggregate(Flink FLIP29)等等。
咱們此次開源的版本實現了在元數據(meta data)和數據層將Flink和Hive對接和打通。國內外不少公司都還在用 Hive 在作本身的批處理。對於這些用戶,如今使用此次Blink開源的版本,就能夠直接用Flink SQL去查詢Hive的數據,真正可以作到在Hive引擎和Flink引擎之間的自由切換。
爲了打通元數據,咱們重構了Flink catalog的實現,而且增長了兩種catalog,一個是基於內存存儲的FlinkInMemoryCatalog,另一個是可以橋接Hive metaStore的HiveCatalog。有了這個HiveCatalog,Flink做業就能讀取Hive的metaData。爲了打通數據,咱們實現了HiveTableSource,使得Flink job能夠直接讀取Hive中普通表和分區表的數據。所以,經過這個版本,用戶可使用Flink SQL讀取已有的Hive meta和data,作數據處理。將來咱們將在Flink上繼續加大對Hive兼容性的支持,包括支持Hive特有的query,data type,和Hive UDF等等。
爲了提供更好的可視化和交互式體驗,咱們作了大量的工做讓Zeppelin可以更好的支持Flink。這些改動有些是在Flink上的,有些是在Zeppelin上的。在這些改動所有推回Flink和Zeppelin社區以前,你們可使用這個Zeppelin image(具體細節請參考Blink代碼裏的docs/quickstart/zeppelin_quickstart.md)來測試和使用這些功能。這個用於測試的Zeppelin版本,首先很好的融合和集成了Flink的多種運行模式以及運維界面。使用文本SQL和tableAPI能夠自如的查詢Flink的static table和dynamic table。
此外,針對Flink的流計算的特色,這一版Zeppelin也很好的支持了savepoint,用戶能夠在界面上暫停做業,而後再從savepoint恢復繼續運行做業。在數據展現方面,除了傳統的數據分析界面,咱們也添加了流計算的翻牌器和時間序列展現等等功能。爲了方便用戶試用,咱們在這一版zeppelin中提供3個built-in的Flink tutorial的例子: 一個是作StreamingETL的例子, 另外兩個分別是作Flink Batch,Flink Stream的基礎樣例。
咱們對Flink Web的易用性與性能等多個方面作了大量的改進,從資源使用、做業調優、日誌查詢等維度新增了大量功能,使得用戶能夠更方便的對Flink做業進行運維。在資源使用方面,新增了Cluster、TaskManager與Job三個級別的資源信息,使得資源的申請與使用狀況一目瞭然。做業的拓撲關係及數據流向能夠追溯至 Operator 級別,Vertex 增長了InQueue,OutQueue等多項指標,能夠方便的追蹤數據的反壓、過濾及傾斜狀況。TaskManager 和 JobManager 的日誌功能獲得大幅度增強,從Job、Vertex、SubTask 等多個維度均可以關聯至對應日誌,提供多日誌文件訪問入口,以及分頁展現查詢和日誌高亮功能。
另外,咱們使用了較新的Angular 7.0 對Flink web進行了全面重構,頁面運行性能有了一倍以上的提高。在大數據量狀況下也不會發生頁面卡死或者卡頓狀況。同時對頁面的交互邏輯進行了總體優化,絕大部分關聯信息在單個頁面就能夠完成查詢和比對工做,減小了大量沒必要要的跳轉。
Blink邁出了全面開源的第一步,接下來咱們會和社區合做,儘量以最快的方式將Blink的功能和性能上的優化merge回Flink。本次的開源版本一方面貢獻了Blink多年在流計算的積累,另外一方面又重磅推出了在批處理上的成果。接下來,咱們會持續給Flink社區貢獻其餘方面的功能。咱們指望每過幾個月就能看到技術上有一個比較大的亮點貢獻到社區。下一個亮點應該是對機器學習的支持。要把機器學習支持好,有一系列的工做要作,包括引擎的功能,性能,和易用性。這裏面大部分的工做咱們已經開發完成,而且不少功能都已經在阿里巴巴內部服務上線了。
除了技術上創新以及新功能以外,Flink的易用性和外圍生態也很是重要。咱們已經啓動了若干這方面的項目,包括Python以及Go等多語言支持,Flink集羣管理,Notebook,以及機器學習平臺等等。這些項目有些會成爲Flink自身的一部分貢獻回社區,有些不是。但它們都基於Flink,是Flink生態的一個很好的補充。獨立於Flink以外的那些項目,咱們都也在認真的考慮開源出來。總之,Blink在開源的第一天起,就已經徹底all-in的融入了Flink社區,咱們但願全部的開發者看到咱們的誠意和決心。
將來,不管是功能仍是生態,咱們都會在Flink社區加大投入,咱們也將投入力量作 Flink 社區的運營,讓 Flink 真正在中國、乃至全世界大規模地使用起來。咱們衷心的但願更多的人加入,一塊兒把Apache Flink開源社區作得更好!
本文來自雲棲社區合做夥伴「阿里技術」,如需轉載請聯繫原做者。