Flink的sink實戰之一:初探

關於sink

下圖來自Flink官方,紅框中就是sink,可見實時數據從Source處開始,在Transformation階段完成業務邏輯後在sink結束,因此sink可以用來處理計算結果,例如控制檯輸出或者保存數據庫:

Flink的sink實戰之一:初探

關於《Flink的sink實戰》系列文章

本文是《Flink的sink實戰》的第一篇,旨在初步瞭解sink,通過對基本API和addSink方法的分析研究,為後續的編碼實戰打好基礎;

從一段實例代碼開始

  • 下面是個簡單的flink應用代碼,紅框中的print方法就是sink操作:
Flink的sink實戰之一:初探


  • 下圖是官方給出的sink方式,都是DataStream類的API,直接調用即可實現sink,剛才代碼中的print就是其中一個:
Flink的sink實戰之一:初探
  • 接下來看看上圖中API的源碼,先看print方法,在DataStream.java中,如下,實際上是調用了addSink方法,入參是PrintSinkFunction
Flink的sink實戰之一:初探
  • 另一個常用API是writeAsText,源碼如下,調用了writeUsingOutputFormat方法:
Flink的sink實戰之一:初探
  • 追蹤writeUsingOutputFormat發現也是調用了addSink,入參是OutputFormatSinkFunction
Flink的sink實戰之一:初探
  • print和writeAsText背後都在調用addSink,那麼另一個常用的writeAsCsv方法呢?莫非也是調用addSink?打開一看果然,和writeAsText一樣調用了writeUsingOutputFormat,而該方法裡面就是在調用addSink:
Flink的sink實戰之一:初探
  • 綜上所述,data sink的關鍵就是addSink的入參,即SinkFunction接口的實現,通過類圖直觀看到常見的sink能力是如何實現的:
Flink的sink實戰之一:初探
  • 從上圖可見抽象類RichSinkFunction與各種sink能力的關係十分緊密,我們應該重點關注它,在類圖上展示方法簽名,如下圖:
Flink的sink實戰之一:初探
  • 如上圖所示,RichSinkFunction本身沒有內容,但是它實現SinkFunction,繼承AbstractRichFunction,是RichFunctionSinkFunction這兩種特性的結合;
  • RichFunction的特性在前面的《Flink的DataSource三部曲》中已經瞭解,就是資源的open和close;
  • SinkFunction的特性呢?顯然是用來處理計算結果的,類圖上顯示的是兩個invoke方法,來看看官方的PrintSinkFunction.java
Flink的sink實戰之一:初探
  • writer.write(record)的源碼在PrintSinkOutputWriter.java,如下所示:
Flink的sink實戰之一:初探

小結

至此,我們已經對Flink的sink有了基本瞭解:

  1. 負責實時計算結果的處理(如輸出或持久化);
  2. 主要實現方式是調用DataStream.addSink方法;
  3. 各種sink能力的實現,主要途徑是實現addSink方法的入參定義的接口;

後面的章節,一起進行sink方面的編碼實戰吧,實戰的方向:體驗官方提供的sink能力,自定義sink能力實現;


Flink的sink實戰之一:初探



分享到:


相關文章: