sink 写入 Redis
2.4.3 将数据写入 Redis (Redis Sink)
配置 Redis
vi redis.conf
注释掉 bind 0.0.0.0
protected-mode yes 改为 protected-mode no
启动 ./redis-server redis.conf
package com.flink.sink.study
import com.flink.streamapi.study.SensorReading
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.{RedisCommandDescription, RedisMapper}
object RedisSinkStudy {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val inputPath = "/home/ied/myFlinkStudy/resources/sensor.txt"
val StreamData = env.readTextFile(inputPath)
val resStream = StreamData
.map(x => {
val arr = x.split(", ")
SensorReading(arr(0), arr(1).toLong, arr(2).toDouble)
})
// Redis 数据库的连接信息
val conf = new FlinkJedisPoolConfig.Builder()
.setHost("192.168.23.97")
.setPort(6379)
.build()
resStream.addSink(new RedisSink[SensorReading](conf, new MyRedisMapper()))
env.execute("redis sink")
}
case class MyRedisMapper() extends RedisMapper[SensorReading]{
// 定义数据写入 Redis 命令 需要配置 Hset 表面 key value
// RedisCommand.HSET 设置数据格式
// "sensor" 表名
// getKeyFromData 设置表的 key
// getValueFromData 设置表的 value
override def getCommandDescription: RedisCommandDescription =
new RedisCommandDescription(RedisCommand.HSET, "sensor")
// 将 id 指定为 key 相同 key 的 value 会被覆盖,只会得到最后的 value
override def getKeyFromData(t: SensorReading): String = t.id
// 将温度值指定为 value
override def getValueFromData(t: SensorReading): String = t.temperature.toString
}
}
查看表 KEYS *
查看表所有数据:
HGETALL sensor
查看表指定 key 的 value:
HGET sensor sensor1