天天看點

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

Flink-1.12.1源碼閱讀之table

  • 1 調試
  • 2 main方法分析
  • 3 對大資料中sql的一些總結
  • 4 總結

  Flink的核心工程之一便是table,雖然flink不像spark那樣有sql專門為一個核心點,但是這個table其實就是sql,就是基于sql來執行流或批處理.

  Flink和hive一樣,使用calcite來解析sql,同時加入了自己的一些額外的優化,至于calcite是如何解析sql的這裡不再展開,可以參照其apache的官網,上面有詳細的解釋.是以這裡就是類似于解釋spark的sql那樣,主要就是為了弄清楚flink的sql執行邏輯.

1 調試

  這裡依然使用examples工程中的類,在table的目錄下,首先來看一下stream相關的table的例子.

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

  可見,在table目錄下,有兩個stream相關的例子,這裡以第二個為例,其實和第一個是類似的,讀者也可以以第一個為例.斷點設定如下

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

2 main方法分析

  此處main方法的代碼較少,這裡完整看一下計算的邏輯.main方法全貌如下

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

  首先設定env,接着設定輸入資料,再設定計算邏輯,此處在toAppendStream處打上斷點,進入該方法

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

  調用的是tEnv的toAppendStream方法,進入該方法

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

  最終調用的是toDataStream方法,進入該方法

Flink-1.12.1源碼閱讀之table1 調試2 main方法分析3 對大資料中sql的一些總結4 總結

  可以看到,有關sql的操作就是在第一步轉換transformation完成的,此處使用了planner的translate方法,該方法就是完成sql解析中的主要解析功能,隻是借助calcite來完成,最終傳回的是DataStream類型,這又回到了flink最初的流處理過程.

  是以在經過tanslate過程後,把sql解析為最終的流處理對應的算子,就像spark sql最終會被解析為rdd的操作一樣,進入固定的模式完成執行.

  期間flink是如何使用calcite來解析sql的有興趣的讀者可以參考calcite的官網和flink的源碼進行更進一步的解讀,由于之前本人已經解析過spark sql,隻不過spark是使用antlr4來完成sql解析的,是以這裡是同樣相同的情景,隻不過flink換成了calcite,此處略過.

3 對大資料中sql的一些總結

  不論是之前的spark,還是這裡的flink,又或者是hive,它們都使用了sql,并且都是作為一個核心點來設計和實作的,這說明sql不僅是在傳統的資料庫中得到廣泛使用,在大資料的範疇中也是不可或缺的.

  Sql作為一整套搜尋的設計和實作,使其作為大資料範疇内的不二選擇也是理所當然的.各種大資料在使用sql時無不是按照其設計的那一套來嚴格實作的,隻是最終的執行階段換成了自己的計算方式,比如rdd算子,流算子以及mr.

  同樣,影響sql運作的還是最終得到執行的這些算子,特别是在大資料範疇内,資料量大的特點也決定了sql不會像傳統資料庫那樣運作的很快,但是這确實是一種有效的能夠得到計算結果的方式,或者說也是一種捷徑.

4 總結

  Flink的table其實就是sql,來處理流和批的計算,使用了calcite來解析sql并最終映射到最基礎的算子,按照固定的流程來執行.

繼續閱讀