欢送拜访我的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办法的剖析钻研,为后续的编码实战打好根底;

全系列链接

  1. 《Flink的sink实战之一:初探》
  2. 《Flink的sink实战之二:kafka》
  3. 《Flink的sink实战之三:cassandra3》
  4. 《Flink的sink实战之四:自定义》

从一段实例代码开始

  1. 上面是个简略的flink利用代码,红框中的print办法就是sink操作:

  1. 下图是官网给出的sink形式,都是DataStream类的API,间接调用即可实现sink,方才代码中的print就是其中一个:

  1. 接下来看看上图中API的源码,先看print办法,在DataStream.java中,如下,实际上是调用了addSink办法,入参是PrintSinkFunction:

  1. 另一个罕用API是writeAsText,源码如下,调用了writeUsingOutputFormat办法:

  1. 追踪<font color="blue">writeUsingOutputFormat</font>发现也是调用了addSink,入参是<font color="blue">OutputFormatSinkFunction</font>:

  1. print和writeAsText背地都在调用addSink,那么另一个罕用的<font color="blue">writeAsCsv</font>办法呢?莫非也是调用addSink?关上一看果然,和writeAsText一样调用了<font color="blue">writeUsingOutputFormat</font>,而该办法外面就是在调用addSink:

  1. 综上所述,data sink的要害就是<font color="blue">addSink</font>的入参,即<font color="blue">SinkFunction</font>接口的实现,通过类图直观看到常见的sink能力是如何实现的:

  1. 从上图可见抽象类<font color="blue">RichSinkFunction</font>与各种sink能力的关系非常严密,咱们应该重点关注它,在类图上展现办法签名,如下图:

  1. 如上图所示,<font color="blue">RichSinkFunction</font>自身没有内容,然而它实现<font color="blue">SinkFunction</font>,继承<font color="blue">AbstractRichFunction</font>,是<font color="blue">RichFunction</font>和<font color="blue">SinkFunction</font>这两种个性的联合;
  2. <font color="blue">RichFunction</font>的个性在后面的《Flink的DataSource三部曲》中曾经理解,就是资源的open和close;
  3. <font color="blue">SinkFunction</font>的个性呢?显然是用来解决计算结果的,类图上显示的是两个invoke办法,来看看官网的<font color="blue">PrintSinkFunction.java</font>:

  1. <font color="blue">writer.write(record)</font>的源码在PrintSinkOutputWriter.java,如下所示:

小结

至此,咱们曾经对Flink的sink有了根本理解:

  1. 负责实时计算结果的解决(如输入或长久化);
  2. 次要实现形式是调用DataStream.addSink办法;
  3. 各种sink能力的实现,次要路径是实现addSink办法的入参定义的接口;

前面的章节,一起进行sink方面的编码实战吧,实战的方向:体验官网提供的sink能力,自定义sink能力实现;

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游Java世界...
https://github.com/zq2599/blog_demos