在自定义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. dapr本地托管的服务调用体验与Java SDK的Spring Boot整合

    1 简介 之前在文章<dapr入门与本地托管模式尝试>中介绍了dapr和本地托管,本文我们来介绍如果在代码中使用dapr的服务调用功能,并把它整合到Spring Boot中. Dapr服务 ...

  2. 【单片机】nRF52832 实现停止蓝牙广播接口

    前言 有一个项目使用了 nRF52832 芯片作为主控,其中有用到蓝牙功能.在对蓝牙接口进一步封装的时候,发现 SDK 居然没有停止广播的接口,咨询了代理 FAE,对方也没有找到关闭广播的接口.后来通 ...

  3. chunjun同步两个带Kerberos认证的CDH集群数据

    最近在项目中遇到同步两个 CDH 数据文件的需求,调研了一圈,发现 datax 不支持两个 cdh 同时进行 kerberos 认证,因此切换到 chunjun,chunjun 在 kerberos ...

  4. 真正“搞”懂HTTP协议11之代理服务

    代理,其实全称应该叫做代理服务器,它是客户端与服务器之间得中间层,本质上来说代理就是一个服务器,在HTTP的链路中插入的一个中间环节,就是代理服务器啦.所谓的代理服务就是指:服务本身不生产内容,而是处 ...

  5. 力扣---167. 两数之和 II - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数.如果设这两个数分别是 numbers[index1 ...

  6. 5步带你入门GaussDB(DWS)的GDS导入导出

    摘要:本篇文档为使用GDS导入示例的具体简单步骤和示例. 本文分享自华为云社区<带你快速入门GDS导入导出,玩转PB级数仓GaussDB(DWS)>,作者: yd_220527686. 1 ...

  7. c++ 程序通用多线程单例设计 c++ web 框架设计经验谈

    设计 c++ web 框架时候,想要一个框架缓存类,很多通用缓存类是用字符保存,作为框架内置就不要序列和反序列了,因为框架内部使用. 想给自己的paozhu c++ web 框架添加缓存类,参考了sp ...

  8. C++练习9 函数的重载

    函数的重载是用一个函数名定义多个函数,但是这些同名函数的形参列表(参数个数,类型,顺序)必须不同. 函数重载的规则: 1.函数名称必须相同. 2.参数列表必须不同(个数不同.类型不同.参数排列顺序不同 ...

  9. charles初级使用

    使用charles抓包 一 charles简介 charles 是一个http proxy,是一个中间人,位于客户端Cilent和服务器Server中间. Client发送给Server的请求会经过c ...

  10. MQ收到无序的消息时如何进行业务处理

    业务背景 跟第三方系统做对接,双方通过ActiveMQ进行通信,消息之间是有内在关联的,也就是消息本来应该是有业务顺序的,但由于一些原因,现在收到消息是乱序的,这种情况下做业务处理就有一点小问题了 方 ...