阿里妹導讀:Apache Flink 是公認的新一代開源大資料計算引擎,其流水線執行系統既可以執行批處理程式也可以執行流處理程式。目前,Flink 已成為 Apache 基金會和 GitHub 社群最為活躍的專案之一。在 Flink Forward Asia 2019 上,阿里巴巴資深技術專家,實時計算負責人王峰 (莫問)總結了 2019 年 Flink 在中國的發展和演進,阿里對 Flink 社群的貢獻以及未來 Flink 的最新發展方向。
https://github.com/apache/flink首先,簡單總結一下 Flink 社群的發展情況。自 2014 年 Flink 貢獻給開源社群之後,其發展非常迅速。目前,Flink 可以稱之為 Apache 基金會中最為活躍的專案之一,在 GitHub 上其訪問量在 Apache 專案中位居前三。從 Star 數量上看,僅僅是 2019 年一年的時間,Flink 在 GitHub 上的 Star 數量就翻了一倍,Contributor 數量也呈現出持續增長的態勢。通過相關資料可以看出,越來越多的企業和開發者正在不斷地加入 Flink 社群,併為 Flink 的發展貢獻力量。其中,中國開發者也做出了巨大的貢獻。隨著 Flink 社群的快速發展,其技術也逐漸走向成熟。在 2019 年,國內已經有大量的本土網際網路公司開始採用 Apache Flink 作為主流的實時計算解決方案。同時,在全球範圍內,優步、網飛、微軟和亞馬遜等國際網際網路公司也逐漸開始使用 Apache Flink。如今,Flink 的主要應用場景基本上還是資料分析,尤其是實時資料分析。Flink 本質上是一款流式資料處理引擎,覆蓋的場景主要是實時資料分析、實時風控、實時 ETL 處理等。未來,社群希望 Flink 演化成為統一的資料引擎。近年來,AI 場景發展得如火如荼並且計算的規模也越來越大。因此,Flink 社群也希望能夠主動擁抱 AI 場景,在 Flink 機器學習方面支援 AI 場景,甚至和 AI 原生的深度學習引擎比如 Flink + TensorFlow、Flink + PyTorch 等實現協同,提供大資料+AI 的全鏈路解決方案。下圖為 Apache Flink 批流一體的發展路線圖。在 1.9 版本之前,Flink 的批和流還屬於兩條 Code Path,DataSet 和 DataStream 是兩條獨立的 API,具有兩套不同的執行時環境,尚未實現批流一體的高度融合。所以在 2019 年釋出的 Flink 1.9 版本和即將釋出的 1.10 版本中,社群投入了大量精力去做 Flink 批流一體架構的整合。經過一年的努力,在 Flink 1.10 版本中已經實現了 Flink Task 的執行時環境、執行引擎層以及 SQL 和 Table 層面的批和流的高度統一。但是目前而言,Flink 在架構上還沒有完全實現批流全部統一。未來,社群希望將 DataSet 和 DataStream 兩套 API 做到批流高度融合。SQL 是在大資料處理中當之無愧的“王道”語言,同時也是最通用、最主流的語言。在 Flink 1.9 版本中釋出了一部分統一的 SQL 功能,而未來在 1.10 版本中也會發布更多的新功能,比如採用了批流統一的 Query 處理器、支援完整的 DDL 功能。此外,Flink 還通過了 TPC-H 和 TPC-DS 的測試集驗證,已達到生產級可用狀態。Flink 1.10 版本還增強了對於 Python 的支援,目前 Flink SQL 能夠非常方便地使用 Python UDF。除此之外,Flink 也積極地擁抱了 Hive 生態,使得 Flink SQL 能夠相容 Hive,這樣使用者能夠以極低的成本嘗試 Flink 的新技術。下面將從技術層面分享 Flink Unified SQL 的架構是如何實現批流的融合,進而實現統一處理的。對於使用者的一條 SQL 而言,無論是批處理還是流處理,可能讀取資料的模式是相同的,只不過輸出結果可能是一次性輸出或者持續性輸出。在 Flink 中,可以對於使用者輸入的 SQL 採用統一的處理器進行解析、編譯、優化等動作,最終產生一個 Flink Job 提交到 Flink 叢集中執行。在查詢處理的過程中,新版本的 Flink 增加了非常多的優化技術,比如執行計劃策略的優化、執行運算元的優化、二進位制資料結構的優化、程式碼自動生成的優化以及 JVM 的優化等,使得 SQL 編譯出來的 Job 執行效率更高。在 Runtime 方面,也對 Flink 執行引擎做了重構,對核心底層功能進行抽象,抽象出了可插拔的排程策略以及 Shuffle Service,這樣一來 Runtime 非常靈活,能夠自由適配流和批的 Job 模式,甚至能夠實現同一 Job 中流運算元和批運算元的自由轉換。讓大家能夠真正將 Flink SQL 用起來,不僅僅需要考慮優秀的核心技術或者完善的功能,也需要考慮到使用者的遷移成本。最理想的情況就是讓大家既能夠享受到 Flink SQL 的新技術成果,同時又不用去修改已有的系統或者資料以及後設資料等。因此,Flink SQL 在 2019 年的重大成果之一就是更好地對接了 Hive 生態。在 Flink 1.10 版本中,批流一體的 SQL 將直接無縫對接 Hive 的 metastore,可以與 Hive 直接共享後設資料,Flink Connector 能夠直接讀取 Hive 的分割槽表資料,並且不會產生任何影響。同時,Flink 還相容 Hive 的 UDF,可以直接執行在 Hive 叢集環境中,不需要定義額外的叢集。整體的效果使得使用者僅花費極低的成本就能夠在 Hive SQL 和 Flink SQL 之間非常自由地實現切換。Flink SQL 的另外一個先天優勢是可以支援流資料,也就是同一套業務邏輯在處理 Hive 資料的同時,也可以對接到 Kafka 等訊息佇列來處理實時資料。下圖為 Flink 在 TPC-DS 的 Benchmark 測試的效能表現。這裡的資料集規模為 10TB,資料格式為 Hive ORC,對比版本中,Hive 使用的是 3.0 版本,Flink 使用的 1.10 Pre-Release 版本。結果表明,Flink 不僅能夠跑通 99 個 TPC-DS 的查詢,同時其效能還能夠達到 Hive 的 7 倍。通過 Benchmark 就可以看到 Flink SQL 無論是在功能完善性、效能還是其他各個方面都已經達到了業界的高標準,達到了生產級可用。2019 年,整個技術圈裡最火的當屬 AI 了。而 Flink 除了做資料處理之外,還希望能夠更好地擁抱 AI 場景。2019 年,Flink 在 AI 方面首先鋪墊了機器學習基礎設施,這部分所做的第一件事情就是實現了 Flink ML Lib 的基礎 API,稱之為 ML Pipeline。 ML Pipeline 的核心是機器學習的流程,其中的核心概念包含 Transformer、Estimator、Model 等。Flink 機器學習演算法的開發人員可以使用這套 API 去開發不同的 Transformer、Estimator、Model,去實現各種經典的機器學習演算法,非常方便。基於 ML Pipeline 這套 API 還能夠自由組合元件來構建機器學習的訓練流程和預測流程。
對於 AI 演算法的開發人員而言,他們最喜歡的往往並不是 SQL 而是 Python。因此,Flink 對於 Python 的支援也尤為重要。在 2019 年,Flink 社群也投入了大量的資源來完善 Flink 的 Python 生態,誕生了 PyFlink 專案。並且在 Flink 1.9 版本中實現了 Python 對於 Table API 的支援。但這是不夠的,在 Flink 1.10 版本中還重點支援了 Python UDF 特性。為了實現這一目標一般有兩種技術選擇,一種是從無到有地實現從 Java 到 Python 的通訊,另一種是直接使用成熟的框架。很幸運的是 Beam 社群在 Python 支援上非常強大,因此 Flink 社群與 Beam 社群之間開展了良好的合作,Flink 使用了 Beam 的 Python 資源,比如 SDK、Framework 以及資料通訊格式等。在未來,Flink 會進一步完善對於 Python API 和 UDF 的支援,在 ML Pipeline 上更多地支援 Python,同時也希望引入更多成熟的 Python 庫。眾所周知,阿里巴巴在 2018 年重磅推出了 Blink,也就是阿里內部的 Flink 版本。而 Alink 則是阿里巴巴內部的基於 Flink 的機器學習演算法庫,由阿里雲機器學習 PAI 團隊開發。Alink 是一套分散式、批流一體的機器學習演算法庫,它既非常好地利用了 Flink 批流一體的計算能力以及在機器學習基礎設施上的一些優勢,還結合了阿里巴巴的業務場景。目前,Alink 的上百個機器學習演算法也正在向 Flink 社群貢獻,希望能夠成為新一代的 Flink ML。為了儘快讓大家享受到 Alink 的技術紅利,阿里巴巴也決定同時開源 Alink 專案。將 Alink 與主流的機器學習演算法庫進行對比,可以發現其最大的優勢就是不僅能夠支援批式訓練的機器學習場景,也能夠支援線上的機器學習場景。Alink 在離線的機器學習場景下與主流的 Spark ML 做了對比,在功能集合上所有演算法基本一致,此外還做了效能對比,Alink 和 Spark ML 在離線訓練場景下的效能基本在一個水平線上,旗鼓相當。但是 Alink 的優勢在於一些演算法能夠以流式方法進行計算,更好地實現線上機器學習。另外,AI 部分的新專案——AI Flow 也值得關注。AI Flow 是大資料及 AI 的處理流程平臺,在 AI Flow 中定義不同資料之間的關係以及後設資料格式等就能夠非常方便地搭建一套大資料及 AI 處理的流程。整個 Workflow 並不繫結某一引擎或者平臺,但是使用者可以藉助 Flink 批流一體的能力去搭建自己的大資料及 AI 解決方案。目前,AI Flow 專案正在準備中,預計將於明年的第一季度以與 Alink 相同的模式進行開源。Flink 與 Kubernetes 生態系統整合Flink 1.10 版本將會發布 Flink 與 Kubernetes 生態系統的整合功能,使得 Flink 能夠原生地執行在 Kubernetes 管理平臺之上。之所以要將 Flink 放在 Kubernetes 之上,是因為這樣做有以下幾點優勢:第一,Kubernetes 能夠在多租戶場景下為 Flink 帶來更好的體驗。
第二,目前各大公司都在逐步採用 Kubernetes 做 IT 設施的管理,如果 Flink 能夠執行在 Kubernetes 之上,對於使用者而言就能夠實現更大規模的資源共享和統一管理,降低成本的同時能夠提高效率。
第三,Kubernetes 雲原生生態發展非常迅速,如果 Flink 能夠與 Kubernetes 生態實現很好的整合,就能夠讓 Flink 享受到 Kubernetes 生態的技術紅利,使得 Flink 能夠在生產環境下提供運維保障。
阿里巴巴 Blink 貢獻給 Apache Flink 社群2019 年 3 月,Blink 正式開源。與此同時,阿里巴巴也希望將 Blink 的能力貢獻回 Flink,共建一套 Flink 社群。而 Flink 通過 1.9 和即將釋出的 1.10 兩個大版本的迭代基本完成了這項工作。在這 10 個月的工作中,阿里巴巴向 Flink 社群貢獻了超過一百萬行程式碼,將 Blink 中積累的大量架構優化工作都推回給了 Flink 社群,不僅包括 Runtime、SQL、PyFlink,還包括新的 ML 等。阿里雲實時計算-Ververica Platform on Alibaba Cloud在將 Blink 逐步貢獻到 Flink 之後,阿里巴巴決定在 2020 年將兩套核心逐漸合併為一套核心,將 Blink 核心合併到 Flink 核心中,全面支援開源社群的發展。未來,阿里雲的產品和內部服務都會基於開源的 Flink 核心來實現。此外,阿里巴巴的技術團隊和 Flink 創始團隊 一起合作,聯合打造了 Flink 企業版:Ververica Platform。這套全新的企業版將會支援阿里巴巴內部業務和雲上業務。阿里巴巴也將投入更多力量到開源 Flink 的發展和社群的建設當中,也希望和廣大業界同仁一起助力 Flink 中文社群的發展。