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. 追踪writeUsingOutputFormat发现也是调用了addSink,入参是OutputFormatSinkFunction:

在这里插入图片描述

  1. print和writeAsText背后都在调用addSink,那么另一个常用的writeAsCsv方法呢?莫非也是调用addSink?打开一看果然,和writeAsText一样调用了writeUsingOutputFormat,而该方法里面就是在调用addSink:

在这里插入图片描述

  1. 综上所述,data sink的关键就是addSink的入参,即SinkFunction接口的实现,通过类图直观看到常见的sink能力是如何实现的:

在这里插入图片描述

  1. 从上图可见抽象类RichSinkFunction与各种sink能力的关系十分紧密,我们应该重点关注它,在类图上展示方法签名,如下图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418140807375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbGluZ19jYXZhbHJ5,size_16,color_FFFFFF,t_70)

  1. 如上图所示,RichSinkFunction本身没有内容,但是它实现SinkFunction,继承AbstractRichFunction,是RichFunction和SinkFunction这两种特性的结合;

  2. RichFunction的特性在前面的《Flink的DataSource三部曲》中已经了解,就是资源的open和close;

  3. SinkFunction的特性呢?显然是用来处理计算结果的,类图上显示的是两个invoke方法,来看看官方的PrintSinkFunction.java:

在这里插入图片描述

  1. writer.write(record)的源码在PrintSinkOutputWriter.java,如下所示:

在这里插入图片描述

小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值