阿里妹導讀:Apache Flink 是公認的新一代開源大數據計算引擎,其流水線運行系統既可以執行批處理程序也可以執行流處理程序。目前,Flink 已成為 Apache 基金會和 GitHub 社區最為活躍的項目之一。在 Flink Forward Asia 2019 上,阿里巴巴資深技術專家,實時計算負責人王峰 (莫問)總結了 2019 年 Flink 在中國的發展和演進,阿里對 Flink 社區的貢獻以及未來 Flink 的最新發展方向。
GitHub 地址
https://github.com/apache/flink
Flink:最活躍 Apache 項目之一
首先,簡單總結一下 Flink 社區的發展情況。自 2014 年 Flink 貢獻給開源社區之後,其發展非常迅速。目前,Flink 可以稱之為 Apache 基金會中最為活躍的項目之一,在 GitHub 上其訪問量在 Apache 項目中位居前三。從 Star 數量上看,僅僅是 2019 年一年的時間,Flink 在 GitHub 上的 Star 數量就翻了一倍,Contributor 數量也呈現出持續增長的態勢。通過相關數據可以看出,越來越多的企業和開發者正在不斷地加入 Flink 社區,併為 Flink 的發展貢獻力量。其中,中國開發者也做出了巨大的貢獻。
歡迎一起在GitHub上點個Star
Apache Flink 在中國的應用
隨著 Flink 社區的快速發展,其技術也逐漸走向成熟。在 2019 年,國內已經有大量的本土互聯網公司開始採用 Apache Flink 作為主流的實時計算解決方案。同時,在全球範圍內,優步、網飛、微軟和亞馬遜等國際互聯網公司也逐漸開始使用 Apache Flink。
Apache Flink 的未來
如今,Flink 的主要應用場景基本上還是數據分析,尤其是實時數據分析。Flink 本質上是一款流式數據處理引擎,覆蓋的場景主要是實時數據分析、實時風控、實時 ETL 處理等。未來,社區希望 Flink 演化成為統一的數據引擎。
- 在離線數據處理方面,希望 Flink 能夠在流數據處理的基礎之上進一步實現批與流的統一,提供統一的數據處理和分析的解決方案。
- 另一方面,朝著在線數據分析處理的方向演進,即利用 Flink 的核心優勢、Event-Driven Function 的能力以及 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 做到批流高度融合。
統一 Flink SQL
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 的新技術。
統一 SQL 架構
下面將從技術層面分享 Flink Unified SQL 的架構是如何實現批流的融合,進而實現統一處理的。對於用戶的一條 SQL 而言,無論是批處理還是流處理,可能讀取數據的模式是相同的,只不過輸出結果可能是一次性輸出或者持續性輸出。在 Flink 中,可以對於用戶輸入的 SQL 採用統一的處理器進行解析、編譯、優化等動作,最終產生一個 Flink Job 提交到 Flink 集群中運行。
在查詢處理的過程中,新版本的 Flink 增加了非常多的優化技術,比如執行計劃策略的優化、執行算子的優化、二進制數據結構的優化、代碼自動生成的優化以及 JVM 的優化等,使得 SQL 編譯出來的 Job 執行效率更高。在 Runtime 方面,也對 Flink 執行引擎做了重構,對核心底層功能進行抽象,抽象出了可插拔的調度策略以及 Shuffle Service,這樣一來 Runtime 非常靈活,能夠自由適配流和批的 Job 模式,甚至能夠實現同一 Job 中流算子和批算子的自由轉換。
Flink 與 Hive 生態系統集成
讓大家能夠真正將 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 等消息隊列來處理實時數據。
TPC-DS Benchmark 測試效果
下圖為 Flink 在 TPC-DS 的 Benchmark 測試的性能表現。這裡的數據集規模為 10TB,數據格式為 Hive ORC,對比版本中,Hive 使用的是 3.0 版本,Flink 使用的 1.10 Pre-Release 版本。
結果表明,Flink 不僅能夠跑通 99 個 TPC-DS 的查詢,同時其性能還能夠達到 Hive 的 7 倍。通過 Benchmark 就可以看到 Flink SQL 無論是在功能完善性、性能還是其他各個方面都已經達到了業界的高標準,達到了生產級可用。
Flink 擁抱 AI
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 庫。
Alibaba Alink
眾所周知,阿里巴巴在 2018 年重磅推出了 Blink,也就是阿里內部的 Flink 版本。而 Alink 則是阿里巴巴內部的基於 Flink 的機器學習算法庫,由阿里雲機器學習 PAI 團隊開發。Alink 是一套分佈式、批流一體的機器學習算法庫,它既非常好地利用了 Flink 批流一體的計算能力以及在機器學習基礎設施上的一些優勢,還結合了阿里巴巴的業務場景。目前,Alink 的上百個機器學習算法也正在向 Flink 社區貢獻,希望能夠成為新一代的 Flink ML。為了儘快讓大家享受到 Alink 的技術紅利,阿里巴巴也決定同時開源 Alink 項目。
將 Alink 與主流的機器學習算法庫進行對比,可以發現其最大的優勢就是不僅能夠支持批式訓練的機器學習場景,也能夠支持在線的機器學習場景。Alink 在離線的機器學習場景下與主流的 Spark ML 做了對比,在功能集合上所有算法基本一致,此外還做了性能對比,Alink 和 Spark ML 在離線訓練場景下的性能基本在一個水平線上,旗鼓相當。但是 Alink 的優勢在於一些算法能夠以流式方法進行計算,更好地實現在線機器學習。
AI Flow
另外,AI 部分的新項目——AI Flow 也值得關注。AI Flow 是大數據及 AI 的處理流程平臺,在 AI Flow 中定義不同數據之間的關係以及元數據格式等就能夠非常方便地搭建一套大數據及 AI 處理的流程。整個 Workflow 並不綁定某一引擎或者平臺,但是用戶可以藉助 Flink 批流一體的能力去搭建自己的大數據及 AI 解決方案。目前,AI Flow 項目正在準備中,預計將於明年的第一季度以與 Alink 相同的模式進行開源。
雲原生 (Cloud Native)
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 中文社區的發展。
閱讀更多 阿里技術 的文章