欢送拜访我的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办法:
- 追踪<font color="blue">writeUsingOutputFormat</font>发现也是调用了addSink,入参是<font color="blue">OutputFormatSinkFunction</font>:
- print和writeAsText背地都在调用addSink,那么另一个罕用的<font color="blue">writeAsCsv</font>办法呢?莫非也是调用addSink?关上一看果然,和writeAsText一样调用了<font color="blue">writeUsingOutputFormat</font>,而该办法外面就是在调用addSink:
- 综上所述,data sink的要害就是<font color="blue">addSink</font>的入参,即<font color="blue">SinkFunction</font>接口的实现,通过类图直观看到常见的sink能力是如何实现的:
- 从上图可见抽象类<font color="blue">RichSinkFunction</font>与各种sink能力的关系非常严密,咱们应该重点关注它,在类图上展现办法签名,如下图:
- 如上图所示,<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>这两种个性的联合;
- <font color="blue">RichFunction</font>的个性在后面的《Flink的DataSource三部曲》中曾经理解,就是资源的open和close;
- <font color="blue">SinkFunction</font>的个性呢?显然是用来解决计算结果的,类图上显示的是两个invoke办法,来看看官网的<font color="blue">PrintSinkFunction.java</font>:
- <font color="blue">writer.write(record)</font>的源码在PrintSinkOutputWriter.java,如下所示:
小结
至此,咱们曾经对Flink的sink有了根本理解:
- 负责实时计算结果的解决(如输入或长久化);
- 次要实现形式是调用DataStream.addSink办法;
- 各种sink能力的实现,次要路径是实现addSink办法的入参定义的接口;
前面的章节,一起进行sink方面的编码实战吧,实战的方向:体验官网提供的sink能力,自定义sink能力实现;
欢送关注公众号:程序员欣宸
微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游Java世界...
https://github.com/zq2599/blog_demos