Flink Redis Sink 基本用法

简介

flink提供了专门操作redis的Redis Sink

依赖

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

Redis Sink 提供用于向Redis发送数据的接口的类。接收器可以使用三种不同的方法与不同类型的Redis环境进行通信:

场景备注
FlinkJedisPoolConfig单Redis服务器适用于本地、测试场景
FlinkJedisClusterConfigRedis集群
FlinkJedisSentinelConfigRedis哨兵

在这里插入图片描述

使用

Redis Sink 核心类是 RedisMappe 是一个接口,使用时我们要编写自己的redis操作类实现这个接口中的三个方法

RedisMapper

public interface RedisMapper<T> extends Function, Serializable {

    /**
     * 设置使用的redis数据结构类型,和key的名词
     * 通过RedisCommand设置数据结构类型
     * Returns descriptor which defines data type.
     *
     * @return data type descriptor
     */
    RedisCommandDescription getCommandDescription();

    /**
     * 设置value中的键值对 key的值
     * Extracts key from data.
     *
     * @param data source data
     * @return key
     */
    String getKeyFromData(T data);

    /**
     * 设置value中的键值对 value的值
     * Extracts value from data.
     *
     * @param data source data
     * @return value
     */
    String getValueFromData(T data);
}

RedisCommand

使用RedisCommand设置数据结构类型时和redis结构对应关系。

Data TypeRedis Command [Sink]
HASHHSET
LISTRPUSH, LPUSH
SETSADD
PUBSUBPUBLISH
STRINGSET
HYPER_LOG_LOGPFADD
SORTED_SETZADD
SORTED_SETZREM

Demo


package com.yljphp.demo.sink

import org.apache.flink.streaming.api.scala._
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, RedisCommandDescription, RedisMapper}
import org.apache.flink.util.StringUtils

object RedisBasicApp extends App {

  val env = StreamExecutionEnvironment.getExecutionEnvironment

  env.setParallelism(1)

  val text: DataStream[String] = env.socketTextStream("localhost", 9000)

  val data: DataStream[(String, String)] = text.filter(!StringUtils.isNullOrWhitespaceOnly(_))
    .flatMap(_.split(","))
    .map(("ylj_test_1", _))
    .map(x=>{
      println(x)
      x
    })


  val config: FlinkJedisPoolConfig = new FlinkJedisPoolConfig.Builder()
    .setHost("localhost")
    .setPort(6379)
    .build()


  val redisSink = new RedisSink[(String,String)](config,new MyRedisMapper)

  data.addSink(redisSink)

  env.execute("sink_demo")
}

class MyRedisMapper extends RedisMapper[(String, String)] {
  override def getCommandDescription: RedisCommandDescription = {
    new RedisCommandDescription(RedisCommand.SADD, "ylj_test_2")
  }

  override def getKeyFromData(data: (String, String)): String = data._1

  override def getValueFromData(data: (String, String)): String = data._2
}

在这里插入图片描述

参考

Flink Redis Connector

已标记关键词 清除标记
相关推荐
<p style="color:#333333;"> 大数据发展史:<br /> <img src="https://10.url.cn/qqke_course_info/ajNVdqHZLLAicLicp7c0pgCrMWa38xMj5YF2TuawK4VBCIdAxbILlmVpDel0nsSEiadHjZ4gTOWWHI/" alt="" /> </p> <p style="color:#333333;"> Flink和storm sparkstreaming对比<br /> <img src="https://10.url.cn/qqke_course_info/ajNVdqHZLLAG1PPfA0fFu9z8BssmHc1Via0kl4hxUDXlSLs6PH1bjmcRgOhkIZsdsSYVmbGIssYY/" alt="" /><br /> <img src="https://10.url.cn/qqke_course_info/ajNVdqHZLLBCwdvdAam64sN1X04EFKLHW4HTGl1c3lvZUtSpK495ZCQcckNcz6wdIjmATYPjSh0/" alt="" /> </p> <p style="color:#333333;"> <strong>实时框架如何选择</strong><br /> 1:需要关注流数据是否需要进行状态管理 <br /> 2:At-least-once或者Exectly-once消息投递模式是否有特殊要求 <br /> 3:对于小型独立的项目,并且需要低延迟的场景,建议使用storm <br /> 4:如果你的项目已经使用了spark,并且秒级别的实时处理可以满足需求的话,建议使用sparkStreaming<br /> 5:要求消息投递语义为 Exactly Once 的场景;数据量较大,要求高吞吐低延迟的场景;需要进行状态管理或窗口统计的场景,建议使用flink </p> <p style="color:#333333;"> 针对以上知识我们通过flink读取kafka保存到redis方式快速让大家学习flink如何使用,以及我们如果搭建高性能的flink应用,这个课程属于快速实战篇。 </p> <p style="color:#333333;"> Flink + kafka + redis 实时计算 </p> <p style="color:#333333;"> <br /> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页