在自定义source&sink这一块官方给的说明并不是很多,需要去看源代码熟悉,自己实现一个redis sink主要需要实现StreamTableSinkFactory,RichSinkFunction和AppendStreamTableSink/RetractStreamTableSink/UpsertStreamTableSink,代码逻辑依赖主要如下

1.定义TableFactory

定义一个TableSinkFactory需要实现以下一个或者多个接口,在这里只实现StreamTableSinkFactory

  • BatchTableSourceFactory: Creates a batch table source.
  • BatchTableSinkFactory: Creates a batch table sink.
  • StreamTableSourceFactory: Creates a stream table source.
  • StreamTableSinkFactory: Creates a stream table sink.
  • DeserializationSchemaFactory: Creates a deserialization schema format.
  • SerializationSchemaFactory: Creates a serialization schema forma

createStreamTableSink():在这里能够拿到ddl的with参数,我们通过getValidatedProperties进行合法性校验,再将参数构建为一个RedisOptions供后续方法使用,tableSchema主要包含ddl语句字段信息,最后返回实例化的RedisTableSink
requiredContext():指定已为此工厂实现的上下文。该框架保证仅在满足指定的属性和值集的情况下才与此工厂匹配。典型的属性可能是connector.type,format.type或update-mode。 为将来的向后兼容情况保留了诸如connect.property-version和format.property-version之类的属性键。
supportedProperties():此工厂可以处理的属性键的列表。此方法将用于验证。如果传递了该工厂无法处理的属性,则将引发异常。该列表不得包含上下文指定的键。
getValidatedProperties():构建DescriptorProperties并作合法性校验

2.定义TableSink

定义一个TableSink可以实现BatchTableSink、RetractStreamTableSink、UpsertStreamTableSink或者AppendStreamTableSink,redis的数据写入,我们按照来一条写一条的思路来实现,不涉及到数据的删除,所以只需要继承AppendStreamTableSink

consumeDataStream():在这里能够拿到数据流,在addSink的时候将实例化的RedisSinkFunction写入方法传进去即可
emitDataStream():已经废弃
configure():拿到的是sql返回字段和类型,在这里我们和tableSchema做一致性校验,必须完全对应才能通过
getConsumedDataType():返回Consumed数据类型
getTableSchema():返回tableSchema信息

3.定义RedisSinkFunction

定义RedisSinkFunction需要继承RichSinkFunction,如果需要在Checkpoint时候做一些事情还可以实现CheckpointedFunction

open():可以在这里构建jedis方法
close():在这里执行销毁或者关闭方法
invoke():数据写入的执行方法,我们这里根据ddl的connector.data.type类型来确定调用的方法,目前先实现了string,set,list,map,sortedset五种
snapshotState():如果是mysql或者hbase那种定时/定量写入方式,可以在这里调用写入方法

4.创建java spi发现目录和文件

在resources目录下创建META-INF/services文件夹,创建一个名为org.apache.flink.table.factories.TableFactory的文件,将com.bigdata.connect.redis.RedisTableFactory写入,如果还有自定义的其他source/sink也一起写在这里

5.打包发布

注意打包的时候一定要确认把com.bigdata.connect.redis.RedisTableFactory打进去了,最好打包完反编译一下看时候被覆盖。我使用maven-assembly-plugin打包就会出现被覆盖的问题,后面改为maven-shade-plugin打包就没问题,所以一定要检查下。

6.遇到的问题

org.apache.flink.table.api.TableException: Table sink does not implement a table schema.

在RedisTableSink中忘记重写getTableSchema方法

org.apache.flink.table.api.TableException: Table sink does not implement a consumed data type.

在RedisTableSink中忘记重写getConsumedDataType方法

org.apache.flink.api.common.InvalidProgramException: root
|-- pay_hour: STRING
|-- item_id: STRING
is not serializable. The object probably contains or references non serializable fields.

在RedisTableSink的emitDataStream方法中将tableSchema传到RedisSinkFunction方法中去,而TableSchema未实现Serializable,出现序列化的问题

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: The StreamTableSink#consumeDataStream(DataStream) must be implemented and return the sink transformation DataStreamSink. However, com.bigdata.connect.redis.RedisTableSink doesn't implement this method.

使用了废弃的emitDataStream方法,而且没有重写consumeDataStream

7.使用方式

sink使用方法:

参考文档

https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/sourceSinks.html

Flink Table API & SQL 自定义Redis Sink 代码实现的更多相关文章

  1. 【翻译】Flink Table Api & SQL — 自定义 Source & Sink

    本文翻译自官网: User-defined Sources & Sinks  https://ci.apache.org/projects/flink/flink-docs-release-1 ...

  2. Flink Table Api & SQL 翻译目录

    Flink 官网 Table Api & SQL  相关文档的翻译终于完成,这里整理一个安装官网目录顺序一样的目录 [翻译]Flink Table Api & SQL —— Overv ...

  3. 【翻译】Flink Table Api & SQL — SQL客户端Beta 版

    本文翻译自官网:SQL Client Beta  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/sqlCl ...

  4. 【翻译】Flink Table Api & SQL —— 概念与通用API

    本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/common.html Flink Tabl ...

  5. 【翻译】Flink Table Api & SQL —— 连接到外部系统

    本文翻译自官网:Connect to External Systems  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev ...

  6. 【翻译】Flink Table Api & SQL — SQL

    本文翻译自官网:SQL https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/sql.html Flink Tab ...

  7. 【翻译】Flink Table Api & SQL — Hive —— Hive 函数

    本文翻译自官网:Hive Functions  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/hive/h ...

  8. 【翻译】Flink Table Api & SQL —— Overview

    本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/ Flink Table Api & ...

  9. 【翻译】Flink Table Api & SQL —— 数据类型

    本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/types.html Flink Table ...

  10. 【翻译】Flink Table Api & SQL —Streaming 概念 ——在持续查询中 Join

    本文翻译自官网 :  Joins in Continuous Queries   https://ci.apache.org/projects/flink/flink-docs-release-1.9 ...

随机推荐

  1. Ubuntu 22.04 GCC Arm 12.2.rel1编译 DAPLink

    ARMmbed / DAPLink 项目 仓库地址 https://github.com/ARMmbed/DAPLink Arm Mbed 应该属于Arm的机构或者是Arm资助的机构. 常用的 DAP ...

  2. Python修改柱状图边缘柱子与图边界的距离

      本文介绍基于Python中matplotlib.pyplot模块,修改柱状图.条形图最两侧的柱子与图像边缘之间距离的方法.   最近,绘制了一个水平的柱状图,但是发现图的上.下边距(不是柱子与柱子 ...

  3. Vue3 企业级优雅实战 - 组件库框架 - 11 组件库的打包构建和发布

    回顾第一篇文章中谈到的组件库的几个方面,只剩下最后的.也是最重要的组件库的打包构建.本地发布.远程发布了. 1 组件库构建 组件库的入口是 packages/yyg-demo-ui,构建组件库有两个步 ...

  4. 快速上手Java开发工具Eclipse之简易手册

    Eclipse下载,可以下载最新版本,文档是以2020-12R版本为例 http://www.eclipse.org/downloads/ 下载Packages即可 安装Eclipse 解压安装 除了 ...

  5. 高仿微信|基于Windows微信实现一个IM即时通讯App

    本文干货充足篇幅较长,建议收藏后阅读避免迷路.文末可获取[自动聊天机器人源码和Demo]. 即时通讯IM概述 如果能开发一款即时聊天App,能和微信消息互通,并且只需少许代码量,应该是件非常兴奋的事情 ...

  6. 关于php imagettftext 函数错误解决问题

    imagettftext 这个函数是给图片添加水印的,但是不知道为什么我用不起,直到在网上找到了答案: 是因为字体文件路径原因,相对路径可能我位置不对,该成绝对路径就没问题了! 把'Facon-2.t ...

  7. VS Ctrl+D 快速复制上一行

    打开 VS   工具-->选项-->环境-->键盘   选择默认值,确定.     搞定!

  8. Linux内存占用过高排查过程

    1 查看服务器状态 系统是 CentOS Linux release 7.5.1804 (Core)使用top命令看了下系统的状态 系统的整体负载和cpu并不高,但是内存使用比较高(总8G使用了7.2 ...

  9. effective python

    第8条 用zip函数同时遍历两个迭代器 内置的zip函数可以同时遍历多个迭代器. zip会创建惰性生成器,让它每次只生成一个元组,所以无论输入的数据有多长,它都是一个一个处理的. 如果提供的迭代器的长 ...

  10. Redis一主多从哨兵模式

    首先配置一主多从示例如下: 1.两台主机IP地址如下: 主: 192.168.3.81 端口:6379 从:192.168.3.82  端口:6379 从:192.168.3.82  端口:6380 ...