在自定义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. java跨域问题解决

    问题描述:在使用前后端分离的情况下,前端访问后端时会出现跨域问题 解决方式: 1.设置跨域 1).单个控制器方法CORS注解 在单个方法中加入注解@CrossOrigin. 2).整个控制器启用COR ...

  2. 【随笔记】MFC 解决按下 ESC、Enter 键会自动退出的问题

    网上大部分人的做法是通过拦截按键消息来屏蔽,实际正确的做法是: 1. 在对话框头文件重载 OnOK()(回车会触发) 和 OnCancel()(ESC会触发) 函数. // XXXXXXXDlg.h ...

  3. JavaScript五花八门的跳转方式

    我们最常见的跳转方式是location.href = "http://www.baidu.com", 这种是最常见的,但是常常使用location.replace,location ...

  4. 线程基础知识17 Quene

    1 ConcurrentLinkedQueue 1.1 简介 它是一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序. 新的元素插入到队列的尾部,队列获取操作从队列 ...

  5. 【Windows】ip地址修改器v5.0.5.4 修改ip更简便

    ip地址修改器v5.0.5.4 修改ip更简便 IP地址修改器,一款能够快速的切换IP地址,在几个不同的固定IP之间进行切换,手动输太麻烦,所以可以用到这款IP地址修改器! 下载 ip地址修改器v5. ...

  6. mybatis学习日记2

    1.mybatis中的连接池 配置的位置:  主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是用来表示采用何种连接方式 mybatis连接池提供了3种方式的配置 ...

  7. Windows QT程序配置删除网卡IP

    1.Windows下可在CMD控制终端使用Dos命令对指定网卡进行IP配置,需要使用管理员权限打开CMD终端 往网卡添加IP主要有以下两种方法: 方法1: netsh interface ip add ...

  8. 基于WebGL的方式使用OpenLayers

    1. 引言 在绘制海量数据时,使用GPU进行绘制可有效减少CPU的负载,提升绘制时的速度在浏览器中,可以使用WebGL的方式与GPU交互 OpenLayers是一个常用的GIS相关的JavaScrip ...

  9. because another server process exited abnormally and possibly corrupted shared memory

    一.环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.1.1   二.症状 Red Hat 7.2操作系统部署HGDB 4.1.1后,日志经常出 ...

  10. 数据结构和算法day1(Java)

    1.什么是数据结构? 数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据. 1.2.数据结构的分类: 逻辑结构 和物理结构 逻辑结构: 集合结构(无关系).线性结构(一对一).树形 ...