Flink DataStream API (十三)Flink 输出到 Redis

文章目录

  • 输出到 Redis

输出到 Redis

Redis 是一个开源的内存式的数据存储,提供了像字符串(string)、哈希表(hash)、列表(list)、集合(set)、排序集合(sorted set)、位图(bitmap)、地理索引和流(stream)等一系列常用的数据结构。因为它运行速度快、支持的数据类型丰富,在实际项目中已经成为了架构
优化必不可少的一员,一般用作数据库、缓存,也可以作为消息代理。
Flink 没有直接提供官方的 Redis 连接器,不过 Bahir 项目还是担任了合格的辅助角色,为我们提供了 Flink-Redis 的连接工具。但版本升级略显滞后,目前连接器版本为 1.0,支持的Scala 版本最新到 2.11。由于我们的测试不涉及到 Scala 的相关版本变化,所以并不影响使用。在实际项目应用中,应该以匹配的组件版本运行。
具体测试步骤如下:
(1)导入的 Redis 连接器依赖

<dependency>
    <groupId>org.apache.bahirgroupId>
    <artifactId>flink-connector-redis_2.11artifactId>
    <version>1.0version>
dependency>

(2)启动 Redis
(3)编写输出到 Redis 的示例代码

连接器为我们提供了一个 RedisSink,它继承了抽象类 RichSinkFunction,这就是已经实现好的向 Redis 写入数据的 SinkFunction。我们可以直接将 Event 数据输出到 Redis:

这里 RedisSink 的构造方法需要传入两个参数:

  • FlinkJedisPoolConfig:Jedis 的连接配置
  • RedisMapper:Redis 映射类接口,说明怎样将数据转换成可以写入 Redis 的类型
public class SinkToRedis {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        //自定义测试数据源
        DataStreamSource<Event> stream = env.addSource(new ClickSource());

        //创建一个jedis的连接配置
        FlinkJedisPoolConfig config = new FlinkJedisPoolConfig.Builder()
                .setHost("hadoop102")
                .setPort(6379)
                .build();

        //写入redis
        stream.addSink(new RedisSink<>(config, new MyRedisMapper()));

        env.execute();
    }

    //自定义类实现RedisMapper接口
    public static class MyRedisMapper implements RedisMapper<Event> {

        //返回一个redis操作命令的描述
        @Override
        public RedisCommandDescription getCommandDescription() {
            // 保存在Hset表中,表名click
            return new RedisCommandDescription(RedisCommand.HSET, "click");
        }

        //返回当前的key
        @Override
        public String getKeyFromData(Event data) {
            return data.user;
        }

        //返回当前的value
        @Override
        public String getValueFromData(Event data) {
            return data.url;
        }
    }
}

源代码如下:Flink 输出到 Redis

(4)运行代码,Redis 查看是否收到数据。

Flink DataStream API (十三)Flink 输出到 Redis_第1张图片

我们会发现, 发送了多条数据,Redis 中只有 4 条数据,原因是 hash 中的 key 重复了,后面的会把前面的覆盖掉

你可能感兴趣的:(#,Flink,Flink)