Flink的sink实战之一:初探

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 学习和实践Flink的data sink相关的技术细节

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

关于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,是RichFunctionSinkFunction这两种特性的结合;
  • RichFunction的特性在前面的《Flink的DataSource三部曲》中已经了解,就是资源的open和close;
  • SinkFunction的特性呢?显然是用来处理计算结果的,类图上显示的是两个invoke方法,来看看官方的PrintSinkFunction.java

在这里插入图片描述

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

在这里插入图片描述

小结

  • 至此,我们已经对Flink的sink有了基本了解:
  1. 负责实时计算结果的处理(如输出或持久化);
  2. 主要实现方式是调用DataStream.addSink方法;
  3. 各种sink能力的实现,主要途径是实现addSink方法的入参定义的接口;
  • 后面的章节,一起进行sink方面的编码实战吧,实战的方向:体验官方提供的sink能力,自定义sink能力实现;

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
5天前
|
SQL Java 关系型数据库
Flink DataSet API迁移到DataStream API实战
本文介绍了作者的Flink项目从DataSet API迁移到DataStream API的背景、方法和遇到的问题以及解决方案。
143 3
|
5天前
|
关系型数据库 MySQL 流计算
Flink自定义sink写入mysql
Flink自定义sink写入mysql
57 0
|
5天前
|
流计算
Flink自定义source、自定义sink
Flink自定义source、自定义sink
41 0
|
5天前
|
数据处理 数据库 流计算
Flink 操作mapper、sink解析
Flink 操作mapper、sink解析
31 0
|
7月前
|
分布式计算 Hadoop 大数据
大数据Hadoop之——Apache Hudi 数据湖实战操作(Spark,Flink与Hudi整合)
大数据Hadoop之——Apache Hudi 数据湖实战操作(Spark,Flink与Hudi整合)
|
5天前
|
SQL 消息中间件 存储
Flink报错问题之Flink报错:Table sink 'a' doesn't support consuming update and delete changes which is produced by node如何解决
Flink报错通常是指在使用Apache Flink进行实时数据处理时遇到的错误和异常情况;本合集致力于收集Flink运行中的报错信息和解决策略,以便开发者及时排查和修复问题,优化Flink作业的稳定性。
|
7月前
|
消息中间件 关系型数据库 MySQL
Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)
Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)
|
4天前
|
SQL 消息中间件 Kafka
实时计算 Flink版产品使用合集之支持sink到多分区的kafka ,还能保持有序吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
18 0
|
5天前
|
传感器 存储 缓存
[尚硅谷flink学习笔记] 实战案例TopN 问题
这段内容是关于如何使用Apache Flink解决实时统计水位传感器数据中,在一定时间窗口内出现次数最多的水位问题,即"Top N"问题。首先,介绍了一个使用滑动窗口的简单实现,通过收集传感器数据,按照水位计数,然后排序并输出前两名。接着,提出了全窗口和优化方案,其中优化包括按键分区(按水位vc分组)、开窗操作(增量聚合计算count)和过程函数处理(聚合并排序输出Top N结果)。最后,给出了一个使用`KeyedProcessFunction`进行优化的示例代码,通过按键by窗口结束时间,确保每个窗口的所有数据到达后再进行处理,提高了效率。
|
5天前
|
消息中间件 关系型数据库 MySQL
[flink 实时流基础] 输出算子(Sink)
[flink 实时流基础] 输出算子(Sink)