1. 程式人生 > >Flink的sink實戰之一:初探

Flink的sink實戰之一:初探

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ### 關於sink 下圖來自Flink官方,紅框中就是sink,可見實時資料從Source處開始,在Transformation階段完成業務邏輯後在sink結束,因此sink可以用來處理計算結果,例如控制檯輸出或者儲存資料庫: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108092959759-34368881.png) ### 關於《Flink的sink實戰》系列文章 本文是《Flink的sink實戰》的第一篇,旨在初步瞭解sink,通過對基本API和addSink方法的分析研究,為後續的編碼實戰打好基礎; ### 全系列連結 1. [《Flink的sink實戰之一:初探》](https://blog.csdn.net/boling_cavalry/article/details/105597628) 2. [《Flink的sink實戰之二:kafka》](https://blog.csdn.net/boling_cavalry/article/details/105598224) 3. [《Flink的sink實戰之三:cassandra3》](https://blog.csdn.net/boling_cavalry/article/details/105598968) 4. [《Flink的sink實戰之四:自定義》](https://blog.csdn.net/boling_cavalry/article/details/105599511) ### 從一段例項程式碼開始 1. 下面是個簡單的flink應用程式碼,紅框中的print方法就是sink操作: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093000276-235215560.png) 2. 下圖是官方給出的sink方式,都是DataStream類的API,直接呼叫即可實現sink,剛才程式碼中的print就是其中一個: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093000774-1219921797.png) 3. 接下來看看上圖中API的原始碼,先看print方法,在DataStream.java中,如下,實際上是呼叫了addSink方法,入參是PrintSinkFunction: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093001184-1404084436.png) 4. 另一個常用API是writeAsText,原始碼如下,呼叫了writeUsingOutputFormat方法: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093001574-1367623413.png) 5. 追蹤writeUsingOutputFormat發現也是呼叫了addSink,入參是OutputFormatSinkFunction: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093001918-1498687560.png) 6. print和writeAsText背後都在呼叫addSink,那麼另一個常用的writeAsCsv方法呢?莫非也是呼叫addSink?開啟一看果然,和writeAsText一樣呼叫了writeUsingOutputFormat,而該方法裡面就是在呼叫addSink: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093002400-74716433.png) 7. 綜上所述,data sink的關鍵就是addSink的入參,即SinkFunction介面的實現,通過類圖直觀看到常見的sink能力是如何實現的: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093002765-1142480645.png) 8. 從上圖可見抽象類RichSinkFunction與各種sink能力的關係十分緊密,我們應該重點關注它,在類圖上展示方法簽名,如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093003267-1566770306.png) 9. 如上圖所示,RichSinkFunction本身沒有內容,但是它實現SinkFunction,繼承AbstractRichFunction,是RichFunction和SinkFunction這兩種特性的結合; 10. RichFunction的特性在前面的[《Flink的DataSource三部曲》](https://blog.csdn.net/boling_cavalry/article/details/105467076)中已經瞭解,就是資源的open和close; 11. SinkFunction的特性呢?顯然是用來處理計算結果的,類圖上顯示的是兩個invoke方法,來看看官方的PrintSinkFunction.java: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093003558-1572236963.png) 12. writer.write(record)的原始碼在PrintSinkOutputWriter.java,如下所示: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201108093004008-314337427.png) ### 小結 至此,我們已經對Flink的sink有了基本瞭解: 1. 負責實時計算結果的處理(如輸出或持久化); 2. 主要實現方式是呼叫DataStream.addSink方法; 3. 各種sink能力的實現,主要途徑是實現addSink方法的入參定義的介面; 後面的章節,一起進行sink方面的編碼實戰吧,實戰的方向:體驗官方提供的sink能力,自定義sink能力實現; ### 歡迎關注公眾號:程式設計師欣宸 > 微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界... [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blo