)从一段实例代码开始
- 下面是个简单的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?打开一看果然,和writeAsTe
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】 浏览器打开:qq.cn.hn/FTf 免费领取
xt一样调用了writeUsingOutputFormat,而该方法里面就是在调用addSink:
- 综上所述,data sink的关键就是addSink的入参,即SinkFunction接口的实现,通过类图直观看到常见的sink能力是如何实现的:
- 从上图可见抽象类RichSinkFunction与各种sink能力的关系十分紧密,我们应该重点关注它,在类图上展示方法签名,如下图:
-
如上图所示,RichSinkFunction本身没有内容,但是它实现SinkFunction,继承AbstractRichFunction,是RichFunction和SinkFunction这两种特性的结合;
-
RichFunction的特性在前面的[《Flink的DataSource三部曲》](
)中已经了解,就是资源的open和close;
- SinkFunction的特性呢?显然是用来处理计算结果的,类图上显示的是两个invoke方法,来看看官方的PrintSinkFunction.java:
- writer.write(record)的源码在PrintSinkOutputWriter.java,如下所示:
)小结
至此,我们已经对Flink的sink有了基本了解:
-
负责实时计算结果的处理(如输出或持久化);
-
主要实现方式是调用DataStream.addSink方法;



