Flink的sink实战之一:初探
Posted 程序员欣宸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink的sink实战之一:初探相关的知识,希望对你有一定的参考价值。
欢迎访问我的GitHub
关于sink
- 下图来自Flink官方,红框中就是sink,可见实时数据从Source处开始,在Transformation阶段完成业务逻辑后在sink结束,因此sink可以用来处理计算结果,例如控制台输出或者保存数据库:
关于《Flink的sink实战》系列文章
- 本文是《Flink的sink实战》的第一篇,旨在初步了解sink,通过对基本API和addSink方法的分析研究,为后续的编码实战打好基础;
从一段实例代码开始
- 下面是个简单的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?打开一看果然,和writeAsText一样调用了==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方法;
- 各种sink能力的实现,主要途径是实现addSink方法的入参定义的接口;
- 后面的章节,一起进行sink方面的编码实战吧,实战的方向:体验官方提供的sink能力,自定义sink能力实现;
欢迎关注51CTO博客:程序员欣宸
以上是关于Flink的sink实战之一:初探的主要内容,如果未能解决你的问题,请参考以下文章
Flink处理函数实战之五:CoProcessFunction(双流处理)
2021年最新最全Flink系列教程_Flink原理初探和流批一体API