揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?
本文為 Apache Flink 新版本重大功能特性解讀之 Flink SQL 系列文章的開篇,Flink SQL 系列文章由其核心貢獻(xiàn)者們分享,涵蓋基礎(chǔ)知識(shí)、實(shí)踐、調(diào)優(yōu)、內(nèi)部實(shí)現(xiàn)等各個(gè)方面,帶你由淺入深地全面了解 Flink SQL。
1. 發(fā)展歷程
今年的8月22日 Apache Flink 發(fā)布了1.9.0 版本(下文簡(jiǎn)稱1.9),在 Flink 1.9 中,Table 模塊迎來了核心架構(gòu)的升級(jí),引入了阿里巴巴Blink團(tuán)隊(duì)貢獻(xiàn)的諸多功能,本文對(duì)Table 模塊的架構(gòu)進(jìn)行梳理并介紹如何使用 Blink Planner。
Flink 的 Table 模塊 包括 Table API 和 SQL,Table API 是一種類SQL的API,通過Table API,用戶可以像操作表一樣操作數(shù)據(jù),非常直觀和方便;SQL作為一種聲明式語(yǔ)言,有著標(biāo)準(zhǔn)的語(yǔ)法和規(guī)范,用戶可以不用關(guān)心底層實(shí)現(xiàn)即可進(jìn)行數(shù)據(jù)的處理,非常易于上手,Flink Table API 和 SQL 的實(shí)現(xiàn)上有80%左右的代碼是公用的。作為一個(gè)流批統(tǒng)一的計(jì)算引擎,Flink 的 Runtime 層是統(tǒng)一的,但在 Flink 1.9 之前,Flink API 層 一直分為DataStream API 和 DataSet API, Table API & SQL 位于 DataStream API 和 DataSet API 之上。
Flink 1.8 Table 架構(gòu)
在 Flink 1.8 架構(gòu)里,如果用戶需要同時(shí)流計(jì)算、批處理的場(chǎng)景下,用戶需要維護(hù)兩套業(yè)務(wù)代碼,開發(fā)人員也要維護(hù)兩套技術(shù)棧,非常不方便。 Flink 社區(qū)很早就設(shè)想過將批數(shù)據(jù)看作一個(gè)有界流數(shù)據(jù),將批處理看作流計(jì)算的一個(gè)特例,從而實(shí)現(xiàn)流批統(tǒng)一,阿里巴巴的 Blink 團(tuán)隊(duì)在這方面做了大量的工作,已經(jīng)實(shí)現(xiàn)了 Table API & SQL 層的流批統(tǒng)一。 幸運(yùn)的是,阿里巴巴已經(jīng)將 Blink 開源回饋給 Flink 社區(qū)。為了實(shí)現(xiàn) Flink 整個(gè)體系的流批統(tǒng)一,在結(jié)合 Blink 團(tuán)隊(duì)的一些先行經(jīng)驗(yàn)的基礎(chǔ)上,Flink 社區(qū)的開發(fā)人員在多輪討論后,基本敲定了Flink 未來的技術(shù)架構(gòu)。
Flink 未來架構(gòu)
在Flink 的未來架構(gòu)中,DataSet API將被廢除,面向用戶的API只有 DataStream API 和 Table API & SQL,在實(shí)現(xiàn)層,這兩個(gè)API共享相同的技術(shù)棧,使用統(tǒng)一的 DAG 數(shù)據(jù)結(jié)構(gòu)來描述作業(yè),使用統(tǒng)一的 StreamOperator 來編寫算子邏輯,以及使用統(tǒng)一的流式分布式執(zhí)行引擎,實(shí)現(xiàn)徹底的流批統(tǒng)一。 這兩個(gè)API都提供流計(jì)算和批處理的功能,DataStream API 提供了更底層和更靈活的編程接口,用戶可以自行描述和編排算子,引擎不會(huì)做過多的干涉和優(yōu)化;Table API & SQL 則提供了直觀的Table API、標(biāo)準(zhǔn)的SQL支持,引擎會(huì)根據(jù)用戶的意圖來進(jìn)行優(yōu)化,并選擇最優(yōu)的執(zhí)行計(jì)劃。
2.Flink 1.9 Table 架構(gòu)
Blink 的 Table 模塊的架構(gòu)在開源時(shí)就已經(jīng)實(shí)現(xiàn)了流批統(tǒng)一,向著 Flink 的未來架構(gòu)邁進(jìn)了第一步,走在了 Flink 社區(qū)前面。 因此在 Flink 1.9 合入 Blink Table 代碼時(shí),為了保證 Flink Table 已有架構(gòu)和 Blink Table的架構(gòu)能夠并存并朝著 Flink 未來架構(gòu)演進(jìn),社區(qū)的開發(fā)人員圍繞FLIP-32(FLIP 即 Flink Improvement Proposals,專門記錄一些對(duì)Flink 做較大修改的提議。FLIP-32是:Restructure flink-table for future contributions) 進(jìn)行了重構(gòu)和優(yōu)化,從而使得 Flink Table 的新架構(gòu)具備了流批統(tǒng)一的能力,可以說 Flink 1.9 是 Flink 向著流批徹底統(tǒng)一這個(gè)未來架構(gòu)邁出的第一步。
Flink 1.9 Table 架構(gòu)
在 Flink Table 的新架構(gòu)中,有兩個(gè)查詢處理器:Flink Query Processor 和 Blink Query Processor,分別對(duì)應(yīng)兩個(gè)Planner,我們稱之為 Old Planner 和 Blink Planner。查詢處理器是 Planner 的具體實(shí)現(xiàn), 通過parser(解析器)、optimizer(優(yōu)化器)、codegen(代碼生成技術(shù))等流程將 Table API & SQL作業(yè)轉(zhuǎn)換成 Flink Runtime 可識(shí)別的 Transformation DAG (由Transformation組成的有向無環(huán)圖,表示作業(yè)的轉(zhuǎn)換邏輯),最終由 Flink Runtime 進(jìn)行作業(yè)的調(diào)度和執(zhí)行。
Flink 的查詢處理器針對(duì)流計(jì)算和批處理作業(yè)有不同的分支處理,流計(jì)算作業(yè)底層的 API 是 DataStream API, 批處理作業(yè)底層的 API 是 DataSet API;而 Blink 的查詢處理器則實(shí)現(xiàn)流批作業(yè)接口的統(tǒng)一,底層的 API 都是Transformation。
3.Flink Planner 與 Blink Planner
Flink Table 的新架構(gòu)實(shí)現(xiàn)了查詢處理器的插件化,社區(qū)完整保留原有 Flink Planner (Old Planner),同時(shí)又引入了新的 Blink Planner,用戶可以自行選擇使用 Old Planner 還是 Blink Planner。
在模型上,Old Planner 沒有考慮流計(jì)算作業(yè)和批處理作業(yè)的統(tǒng)一,針對(duì)流計(jì)算作業(yè)和批處理作業(yè)的實(shí)現(xiàn)不盡相同,在底層會(huì)分別翻譯到 DataStream API 和 DataSet API 上。而 Blink Planner 將批數(shù)據(jù)集看作 bounded DataStream (有界流式數(shù)據(jù)) ,流計(jì)算作業(yè)和批處理作業(yè)最終都會(huì)翻譯到 Transformation API 上。 在架構(gòu)上,Blink Planner 針對(duì)批處理和流計(jì)算,分別實(shí)現(xiàn)了BatchPlanner 和 StreamPlanner ,兩者共用了大部分代碼,共享了很多優(yōu)化邏輯。 Old Planner 針對(duì)批處理和流計(jì)算的代碼實(shí)現(xiàn)的是完全獨(dú)立的兩套體系,基本沒有實(shí)現(xiàn)代碼和優(yōu)化邏輯復(fù)用。
除了模型和架構(gòu)上的優(yōu)點(diǎn)外,Blink Planner 在阿里巴巴集團(tuán)內(nèi)部的海量業(yè)務(wù)場(chǎng)景下沉淀了許多實(shí)用功能,集中在三個(gè)方面:
- Blink Planner 對(duì)代碼生成機(jī)制做了改進(jìn)、對(duì)部分算子進(jìn)行了優(yōu)化,提供了豐富實(shí)用的新功能,如維表 join、Top N、MiniBatch、流式去重、聚合場(chǎng)景的數(shù)據(jù)傾斜優(yōu)化等新功能。
- Blink Planner 的優(yōu)化策略是基于公共子圖的優(yōu)化算法,包含了基于成本的優(yōu)化(CBO)和基于規(guī)則的優(yōu)化(CRO)兩種策略,優(yōu)化更為全面。同時(shí),Blink Planner 支持從 catalog 中獲取數(shù)據(jù)源的統(tǒng)計(jì)信息,這對(duì)CBO優(yōu)化非常重要。
- Blink Planner 提供了更多的內(nèi)置函數(shù),更標(biāo)準(zhǔn)的 SQL 支持,在 Flink 1.9 版本中已經(jīng)完整支持 TPC-H ,對(duì)高階的 TPC-DS 支持也計(jì)劃在下一個(gè)版本實(shí)現(xiàn)。
整體看來,Blink 查詢處理器在架構(gòu)上更為先進(jìn),功能上也更為完善。出于穩(wěn)定性的考慮,Flink 1.9 默認(rèn)依然使用 Flink Planner,用戶如果需要使用 Blink Planner,可以作業(yè)中顯式指定。
4.如何啟用 Blink Planner
在IDE環(huán)境里,只需要引入兩個(gè) Blink Planner 的相關(guān)依賴,就可以啟用 Blink Planner。
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-scala-bridge_2.11</artifactId> <version>1.9.0</version> </dependency><dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner-blink_2.11</artifactId> <version>1.9.0</version> </dependency>對(duì)于流計(jì)算作業(yè)和批處理作業(yè)的配置非常類似,只需要在 EnvironmentSettings 中設(shè)置 StreamingMode 或 BatchMode 即可,流計(jì)算作業(yè)的設(shè)置如下:
// ********************** // BLINK STREAMING QUERY // ********************** import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.java.StreamTableEnvironment;StreamExecutionEnvironment bsEnv = StreamExecutionEnvironment.getExecutionEnvironment(); EnvironmentSettings bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build(); StreamTableEnvironment bsTableEnv = StreamTableEnvironment.create(bsEnv, bsSettings); // or TableEnvironment bsTableEnv = TableEnvironment.create(bsSettings);bsTableEnv.sqlUpdate(…); bsTableEnv.execute();批處理作業(yè)的設(shè)置如下 :
// ****************** // BLINK BATCH QUERY // ****************** import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.TableEnvironment;EnvironmentSettings bbSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inBatchMode().build(); TableEnvironment bbTableEnv = TableEnvironment.create(bbSettings); bbTableEnv.sqlUpdate(…) bbTableEnv.execute()如果作業(yè)需要運(yùn)行在集群環(huán)境,打包時(shí)將 Blink Planner 相關(guān)依賴的 scope 設(shè)置為 provided,表示這些依賴由集群環(huán)境提供。這是因?yàn)?Flink 在編譯打包時(shí), 已經(jīng)將 Blink Planner 相關(guān)的依賴打包,不需要再次引入,避免沖突。
5. 社區(qū)長(zhǎng)遠(yuǎn)計(jì)劃
目前,TableAPI & SQL 已經(jīng)成為 Flink API 的一等公民,社區(qū)也將投入更大的精力在這個(gè)模塊。在不遠(yuǎn)的將來,待 Blink Planner 穩(wěn)定之后,將會(huì)作為默認(rèn)的 Planner ,而 Old Planner 也將會(huì)在合適的時(shí)候退出歷史的舞臺(tái)。目前社區(qū)也在努力賦予 DataStream 批處理的能力,從而統(tǒng)一流批技術(shù)棧,屆時(shí) DataSet API 也將退出歷史的舞臺(tái)。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解密 云HBase 冷热分离技术原理
- 下一篇: 分布式服务架构下的混沌工程实践