Flink将数据写入到redis

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.redis.RedisSink;
import org.apache.flink.streaming.connectors.redis.common.config.FlinkJedisPoolConfig;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommand;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommandDescription;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisMapper;

/**
 * Author:panghu
 * Date:2022-05-29
 * Description: 输出数据到redis
 */
public class _17SinkToRedisTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DataStreamSource<String> streamSource = env.readTextFile("input/clicks.csv");
        // 将字符串封装为Event对象
        SingleOutputStreamOperator<Event> mapSource = streamSource.map(new MapFunction<String, Event>() {
            @Override
            public Event map(String line) throws Exception {
                String[] split = line.split(", ");
                Event event = new Event(split[0], split[1], Long.valueOf(split[2]));
                return event;
            }
        });

        // 创建redis链接配置
        FlinkJedisPoolConfig conf = new FlinkJedisPoolConfig.Builder().setHost("hadoop102").build();

        mapSource.addSink(new RedisSink<Event>(conf,
                new MyRedisMapper()));

        env.execute();
    }

    public static class MyRedisMapper implements RedisMapper<Event> {
        @Override
        public RedisCommandDescription getCommandDescription() {
            // 参数1:redis数据类型   参数2:redis中存储的key
            return new RedisCommandDescription(RedisCommand.HSET, "clicks");
        }

        /**
         * 要保存的字段
         * @param event
         * @return
         */
        @Override
        public String getKeyFromData(Event event) {
            return event.user;
        }

        /**
         * 要保存的值
         * @param event
         * @return
         */
        @Override
        public String getValueFromData(Event event) {
            return event.url;
        }
    }
}

Apache Flink 和 Apache Kafka 结合使用时,可以实现实时流处理从Kafka主题读取数据,然后将这些数据写入Redis缓存。这是一个常见的架构模式,用于提升数据处理速度和响应能力。以下是基本步骤: 1. **配置FlinkKafka连接**: 首先,在Flink项目中添加对Kafka的依赖,并配置`FlinkKafkaConsumer`来订阅指定的Kafka topic。 ```java Properties props = new Properties(); props.setProperty("bootstrap.servers", "kafka-broker-host:port"); KafkaConsumer<String, String> kafkaSource = new FlinkKafkaConsumer<>("topic-name", new SimpleStringSchema(), props); ``` 2. **创建Flink作业**: 创建一个`DataStream`实例,从Kafka消费数据,然后处理它(如过滤、转换等),最后准备将数据写入Redis。 ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<String> stream = env.addSource(kafkaSource) .map(new MapFunction<String, String>() { // 这里处理Kafka数据 }); ``` 3. **写入Redis**: 使用Flink提供的`RedisSink`或者第三方库(如lettuce)来将数据写入Redis。首先,需要创建一个`RedisSinkFunction`,并设置适当的序列化策略。 ```java // 假设使用JedisConnectionPool作为Redis连接 JedisConnectionFactory connectionFactory = new JedisConnectionFactory(); RedisSink<String> redisSink = RedisSink.create() .withConnectionFactory(connectionFactory) .withKeySerializer(RedisSerializationUtil.stringToByte()) .withValueSerializer(RedisSerializationUtil.stringToByte()); stream.addSink(redisSink); ``` 4. **提交作业运行**: 最后,提交Flink作业到集群执行。 ```java env.execute("Flink Kafka to Redis Pipeline"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值