歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類匯總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
關于sink
下圖來自Flink官方,紅框中就是sink,可見實時資料從Source處開始,在Transformation階段完成業務邏輯后在sink結束,因此sink可以用來處理計算結果,例如控制臺輸出或者保存資料庫:

關于《Flink的sink實戰》系列文章
本文是《Flink的sink實戰》的第一篇,旨在初步了解sink,通過對基本API和addSink方法的分析研究,為后續的編碼實戰打好基礎;
全系列鏈接
- 《Flink的sink實戰之一:初探》
- 《Flink的sink實戰之二:kafka》
- 《Flink的sink實戰之三:cassandra3》
- 《Flink的sink實戰之四:自定義》
從一段實體代碼開始
- 下面是個簡單的flink應用代碼,紅框中的print方法就是sink操作:

- 下圖是官方給出的sink方式,都是DataStream類的API,直接呼叫即可實作sink,剛才代碼中的print就是其中一個:

- 接下來看看上圖中API的原始碼,先看print方法,在DataStream.java中,如下,實際上是呼叫了addSink方法,入參是PrintSinkFunction:

- 另一個常用API是writeAsText,原始碼如下,呼叫了writeUsingOutputFormat方法:

- 追蹤writeUsingOutputFormat發現也是呼叫了addSink,入參是OutputFormatSinkFunction:

- print和writeAsText背后都在呼叫addSink,那么另一個常用的writeAsCsv方法呢?莫非也是呼叫addSink?打開一看果然,和writeAsText一樣呼叫了writeUsingOutputFormat,而該方法里面就是在呼叫addSink:

- 綜上所述,data sink的關鍵就是addSink的入參,即SinkFunction介面的實作,通過類圖直觀看到常見的sink能力是如何實作的:

8. 從上圖可見抽象類RichSinkFunction與各種sink能力的關系十分緊密,我們應該重點關注它,在類圖上展示方法簽名,如下圖:

9. 如上圖所示,RichSinkFunction本身沒有內容,但是它實作SinkFunction,繼承AbstractRichFunction,是RichFunction和SinkFunction這兩種特性的結合;
10. RichFunction的特性在前面的《Flink的DataSource三部曲》中已經了解,就是資源的open和close;
11. SinkFunction的特性呢?顯然是用來處理計算結果的,類圖上顯示的是兩個invoke方法,來看看官方的PrintSinkFunction.java:

12. writer.write(record)的原始碼在PrintSinkOutputWriter.java,如下所示:

小結
至此,我們已經對Flink的sink有了基本了解:
- 負責實時計算結果的處理(如輸出或持久化);
- 主要實作方式是呼叫DataStream.addSink方法;
- 各種sink能力的實作,主要途徑是實作addSink方法的入參定義的介面;
后面的章節,一起進行sink方面的編碼實戰吧,實戰的方向:體驗官方提供的sink能力,自定義sink能力實作;
歡迎關注公眾號:程式員欣宸
微信搜索「程式員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/206661.html
標籤:其他
下一篇:技術點1:HTML
