1 Flink 写入Redis

基于巴希尔(Bahire)-Flink写入Redis集群。

1.1 继承RichSinkFunction

即Flink-Stream。

1.2 使用第3方的包

即Apache-Bachir-Flink。

public class RedisWriteUtil {
 
     /*
      * FlinkJedisClusterConfig: 集群模式
      * FlinkJedisPoolConfig:单机模式
      * FlinkJedisSentinelConfig:哨兵模式
      *
      */
     // Jedis配置
     private static FlinkJedisClusterConfig JEDIS_CONF = null;
 
     static {
             ParameterTool parameterTool = ParameterUtil.getParameters();
             String host = parameterTool.get("redis.host");
             String port = parameterTool.get("redis.port");
 
             InetSocketAddress inetSocketAddress = new InetSocketAddress(host,Integer.parseInt(port));
 
             Set<InetSocketAddress> set = new HashSet<>();
             set.add(inetSocketAddress);
             JEDIS_CONF = new FlinkJedisClusterConfig
                     .Builder()
                     .setNodes(set)
                     .build();
     }
 
     /**
      * 基于Bahir写入Redis,Redis的数据是String类型
      */
     public static void writeByBahirWithString(DataStream<Tuple2<String,String>> input) {
         input.addSink(new RedisSink<>(JEDIS_CONF,new RedisSinkByBahirWithString()));
     }
 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

注意到RedisSink:

public class RedisSink<IN> extends RichSinkFunction<IN> {
  • 1.

2 Redis-Connector

Apache-Bachir-Flink所提供的

缺点

  • 使用Jedis, 没有使用Lettuce
  • 没有对 Flink Table/SQL Api 的支持
public class RedisSinkByBahirWithString implements RedisMapper<Tuple2<String, String>> {
 
     @Override
     public RedisCommandDescription getCommandDescription() {
         /*
          * 如果Redis的数据类型是 hash 或 z-Set
          * RedisCommandDescription 的构造方法必须传入 additionalKey
          * additionalKey就是Redis的键
          */
         return new RedisCommandDescription(RedisCommand.SET);
     }
 
     @Override
     public String getKeyFromData(Tuple2<String, String> input) {
         return input.f0;
     }
 
     @Override
     public String getValueFromData(Tuple2<String, String> input) {
         return input.f1;
     }
 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

3 Flink 读取Redis

Flink通过富函数类实现自定义Source以及通过自定义Source读取Redis集群。

3.1 继承 RichSourceFunction

可实现自定义的Source。

3.2 继承RichParallelSourceFunction(推荐)

也就是可以设置并行度。

RichSourceFunction RichSinkFunction,RichMapFunction都是富函数类

Flink API集合分为2大类:

  • 函数类 (MapFunction)
  • 富函数类 (RichMapFunction)

富函数类比函数类提供更多函数生命周期和获取上下文的方法:

富函数类通常是抽象类

RichParallelSourceFunction V.S RichSourceFunction
  • RichParallelSourceFunction 可设置并行度
  • RichParallelSourceFunction 和RichSourceFunction 代码可互相套用
  • RichParallelSourceFunction 默认并行度是cpu core数
  • RichSourceFunction 并行度只能是1

3.3 实现SourceFunction接口

Flink 原生的Source。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考: