flink读取kafka的数据处理完毕写入redis

/* 
 * 从Kafka读取数据处理完毕写入Redis
 */
public class KafkaToRedis {

    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //开启checkpointing
        env.enableCheckpointing(1000);
        //设置StateBackEnd 存储在HDFS中
        env.setStateBackend(new FsStateBackend("hdfs://mydfs/checkpoint"));
        //设置cancel任务checkpoint数据的策略  cancel任务保留checkpoint的数据
        env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
        Properties properties = new Properties();
        //设置Broker地址
        properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"linux01:9092,linux02:9092,linux03:9092");
        //设置没有偏移量的话从头开始读取数据
        properties.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_DOC,"earliest");
        //设置不自动提交偏移量
        properties.setProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,"false");
        //设置GroupID
        properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, UUID.randomUUID().toString());
        FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>("wordcount", new SimpleStringSchema(), properties);
        //设置在checkpoint后不提交偏移量到kafka特殊的topic中
        kafkaConsumer.setCommitOffsetsOnCheckpoints(false);
        DataStreamSource<String> kafkaSource = env.addSource(kafkaConsumer);

        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = kafkaSource.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
                String[] words = line.split(" ");
                for (String word : words) {
                    out.collect(Tuple2.of(word,1));
                }
            }
        });

        SingleOutputStreamOperator<Tuple2<String, Integer>> result = wordAndOne.keyBy(tp -> tp.f0).sum(1);
        FlinkJedisPoolConfig config = new FlinkJedisPoolConfig.Builder().setHost("linux01").build();
        //将数据写入redis
        result.addSink(new RedisSink<Tuple2<String, Integer>>(config,new KafkaToRedisMapper()));
        //启动程序
        env.execute();
    }
    private static class KafkaToRedisMapper implements RedisMapper<Tuple2<String,Integer>>{
        //设置Redis中的key
        @Override
        public RedisCommandDescription getCommandDescription() {
            return new RedisCommandDescription(RedisCommand.HSET,"wordcount");
        }
        //设置Value -> Hash类型的key
        @Override
        public String getKeyFromData(Tuple2<String, Integer> data) {
            return data.f0;
        }
        //设置Value -> Hash类型的value
        @Override
        public String getValueFromData(Tuple2<String, Integer> data) {
            return data.f1.toString();
        }
    }
}

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、付费专栏及课程。

余额充值