16-Flink-Redis-Sink

戳更多文章:

1-Flink入門java

2-本地環境搭建&構建第一個Flink應用面試

3-DataSet APIredis

4-DataSteam APIsql

5-集羣部署數據庫

6-分佈式緩存apache

7-重啓策略bootstrap

8-Flink中的窗口c#

9-Flink中的Time緩存

簡介

流式計算中,咱們常常有一些場景是消費Kafka數據,進行處理,而後存儲到其餘的數據庫或者緩存或者從新發送回其餘的消息隊列中。 本文講述一個簡單的Redis做爲Sink的案例。 後續,咱們會補充完善,好比落入Hbase,Kafka,Mysql等。bash

關於Redis Sink

Flink提供了封裝好的寫入Redis的包給咱們用,首先咱們要新增一個依賴:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-redis_2.10</artifactId>
    <version>1.1.5</version>
</dependency>

複製代碼

而後咱們實現一個本身的RedisSinkExample:

//指定Redis set
public static final class RedisSinkExample implements RedisMapper<Tuple2<String,Integer>> {
public RedisCommandDescription getCommandDescription() {
    return new RedisCommandDescription(RedisCommand.SET, null);
}

public String getKeyFromData(Tuple2<String, Integer> data) {
    return data.f0;
}

public String getValueFromData(Tuple2<String, Integer> data) {
    return data.f1.toString();
}
}
複製代碼

咱們用最簡單的單機Redis的SET命令進行演示。

完整的代碼以下,實現一個讀取Kafka的消息,而後進行WordCount,並把結果更新到redis中:

public class RedisSinkTest {

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

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
env.enableCheckpointing(2000);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

//鏈接kafka
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "127.0.0.1:9092");

FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("test", new SimpleStringSchema(), properties);
consumer.setStartFromEarliest();
DataStream<String> stream = env.addSource(consumer);
DataStream<Tuple2<String, Integer>> counts = stream.flatMap(new LineSplitter()).keyBy(0).sum(1);

//實例化FlinkJedisPoolConfig 配置redis
FlinkJedisPoolConfig conf = new FlinkJedisPoolConfig.Builder().setHost("127.0.0.1").setHost("6379").build();
//實例化RedisSink,並經過flink的addSink的方式將flink計算的結果插入到redis

counts.addSink(new RedisSink<>(conf,new RedisSinkExample()));
env.execute("WordCount From Kafka To Redis");

}//
public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {

@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
    String[] tokens = value.toLowerCase().split("\\W+");
    for (String token : tokens) {
        if (token.length() > 0) {
            out.collect(new Tuple2<String, Integer>(token, 1));
        }
    }
}
}
//指定Redis set
public static final class RedisSinkExample implements RedisMapper<Tuple2<String,Integer>> {
public RedisCommandDescription getCommandDescription() {
    return new RedisCommandDescription(RedisCommand.SET, null);
}

public String getKeyFromData(Tuple2<String, Integer> data) {
    return data.f0;
}

public String getValueFromData(Tuple2<String, Integer> data) {
    return data.f1.toString();
}
}

}//

複製代碼

全部代碼,我放在了個人公衆號,回覆Flink能夠下載

  • 海量【java和大數據的面試題+視頻資料】整理在公衆號,關注後能夠下載~
  • 更多大數據技術歡迎和做者一塊兒探討~

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息