如何理解Flink關(guān)系型API

這篇文章給大家介紹如何理解Flink關(guān)系型API,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作與策劃設(shè)計(jì),臨猗網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:臨猗等地區(qū)。臨猗做網(wǎng)站價(jià)格咨詢:028-86922220

在接觸關(guān)系型API之前,用戶通常會(huì)采用DataStream、DataSet API來編寫Flink程序,它們都提供了豐富的處理能力,以DataStream為例,它有如下這些優(yōu)點(diǎn):

  • 富有表現(xiàn)力的流處理,包括但不限于:轉(zhuǎn)換數(shù)據(jù),更新狀態(tài),定義窗口、聚合,事件時(shí)間語(yǔ)義,有狀態(tài)且保證正確性等;

  • 高度自定義的窗口邏輯:分配器、觸發(fā)器、逐出器以及允許延遲等;

  • 提升與外部系統(tǒng)連接能力的異步I/O接口;

  • ProcessFunction給予用戶訪問時(shí)間戳和定時(shí)器等低層級(jí)的操作能力;

但它同時(shí)也存在一些使用壁壘導(dǎo)致它并不適合所有用戶:

  • 寫DataStream程序并非總是很容易:流處理技術(shù)發(fā)展很快,一些概念層出不窮,比如,時(shí)間、狀態(tài)、窗口等;

  • 需要特殊的知識(shí)與技巧:持續(xù)的流計(jì)算應(yīng)用需要特殊的要求以及Java/Scala的編程經(jīng)驗(yàn);

用戶希望更專注于他們的業(yè)務(wù)邏輯,于是Flink提供了更具表達(dá)能力的API——關(guān)系型API。關(guān)系型API有很多好處:

  • 它是聲明式的,用戶只需告知它們想要的,系統(tǒng)決定如何計(jì)算,用戶不必指定具體的實(shí)現(xiàn)細(xì)節(jié);

  • 查詢可被高效地優(yōu)化和執(zhí)行,相比之下底層API中的UDF則難于優(yōu)化且需要人工調(diào)優(yōu);

  • 大眾(尤其是數(shù)據(jù)分析領(lǐng)域的從業(yè)者)對(duì)SQL的了解和熟悉程度要遠(yuǎn)高于特定的編程語(yǔ)言;

關(guān)系型API其實(shí)是Table API和SQL API的統(tǒng)稱:

  • Table API:為Java&Scala SDK提供類似于LINQ(語(yǔ)言集成查詢)模式的API(自0.9.0版本開始)

  • SQL API:支持標(biāo)準(zhǔn)SQL(自1.1.0版本開始)

關(guān)系型API作為一個(gè)統(tǒng)一的API層,既能夠做到在Batch模式的表上進(jìn)行可終止地查詢并生成有限的結(jié)果集,同時(shí)也能做到在Streaming模式的表上持續(xù)地運(yùn)行并生產(chǎn)結(jié)果流,并且在兩種模式的表上的查詢具有相同的語(yǔ)法跟語(yǔ)義。這其中最重要的概念是Table,Table與DataSet、DataStream緊密結(jié)合,DataSet和DataStream都可以很容易地轉(zhuǎn)換成Table,同樣轉(zhuǎn)換回來也很方便。下面的代碼段展示了采用關(guān)系型API編寫Flink程序的示例:

val tEnv = TableEnvironment.getTableEnvironment(env)
//配置數(shù)據(jù)源
val customerSource = CsvTableSource.builder()
 .path("/path/to/customer_data.csv")
 .field("name", Types.STRING).field("prefs", Types.STRING)
 .build()

//將數(shù)據(jù)源注冊(cè)為一個(gè)Table
tEnv.registerTableSource(”cust", customerSource)

//定義你的table程序(在一個(gè)Flink程序中Table API和SQL API可以混用)
val table = tEnv.scan("cust").select('name.lowerCase(), myParser('prefs))
val table = tEnv.sql("SELECT LOWER(name), myParser(prefs) FROM cust")

//轉(zhuǎn)換為DataStraem
val ds: DataStream[Customer] = table.toDataStream[Customer]

關(guān)系型API架構(gòu)在基礎(chǔ)的DataStream、DataSet API之上,其整體層次關(guān)系如下圖所示:

如何理解Flink關(guān)系型API

它們提供等價(jià)的特性集合,并且可以在同一個(gè)程序中混合使用,兩者都與Flink的core API緊密集成。從上圖來看,上層有兩種API,而其下有兩個(gè)基礎(chǔ)(DataSet、DataStream)API作為后端。那這是否意味著實(shí)現(xiàn)時(shí)的四種組合的轉(zhuǎn)換路徑呢?其實(shí),F(xiàn)link并沒有自己去實(shí)現(xiàn)轉(zhuǎn)換、SQL的解析、執(zhí)行計(jì)劃的生成、優(yōu)化等操作,它將一些“不擅長(zhǎng)”的任務(wù)轉(zhuǎn)交給了Apache Calcite。整體架構(gòu)如下圖:

如何理解Flink關(guān)系型API

Apache Calcite是一個(gè)SQL解析與查詢優(yōu)化框架(這個(gè)定義是從Flink關(guān)注的視角來看,Calcite官方的定義為動(dòng)態(tài)的數(shù)據(jù)管理框架),目前已被許多項(xiàng)目選擇用來解析并優(yōu)化SQL查詢,比如:Drill、Hive、Kylin等。

我們來對(duì)上面的架構(gòu)圖進(jìn)行解讀。從中上部我們看到,可以從DataSet、DataStream以及Table Source等多種渠道來創(chuàng)建Table,Table相關(guān)的一些信息比如schema、數(shù)據(jù)字段及類型等信息統(tǒng)一被注冊(cè)并存放到Calcite Catalog中。這些信息將為Table & SQL API提供元數(shù)據(jù)。接著往下看,Table API跟SQL構(gòu)建的查詢將被翻譯成共同的邏輯計(jì)劃表示,邏輯計(jì)劃將作為Calcite優(yōu)化器的輸入。優(yōu)化器結(jié)合邏輯計(jì)劃以及特定的后端(DataSet、DataStream)規(guī)則進(jìn)行翻譯和優(yōu)化,隨之產(chǎn)生不同的計(jì)劃。計(jì)劃將通過代碼生成器,生成特定的后端程序。后端程序的執(zhí)行將返回DataSet或DataStream。

這個(gè)架構(gòu)圖展示了Flink關(guān)系型API的整體架構(gòu),也是后續(xù)我們分析這個(gè)模塊的基礎(chǔ)。

關(guān)于如何理解Flink關(guān)系型API就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

分享標(biāo)題:如何理解Flink關(guān)系型API
網(wǎng)站路徑:http://bm7419.com/article42/gocphc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站制作手機(jī)網(wǎng)站建設(shè)、虛擬主機(jī)企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)