Flink从入门到真香(9、Sink数据输出-Redis)

如果没有redis环境,可以先在虚拟机上装一个
sudo yum install epel-release -y

sudo yum -y install redis

systemctl start redis

默认是监听在127.0.0.1的,如果要调整可以改/etc/redis.conf配置文件把#bind 127.0.0.1 改为 bind 0.0.0.0 再重启redis服务即可(如果发现还是访问不了,那大概率是linux防火墙问题)

在pom.xml中增加redis依赖
<dependency>
<groupId>org.apache.bahir</groupId>
<artifactId>flink-connector-redis_2.11</artifactId>
<version>1.0</version>
</dependency>

新建一个RedisSink1.scala(注意不要跟引入的源码中的RedisSink重名)
package com.mafei.sinktest

import org.apache.flink.streaming.api.scala.{StreamExecutionEnvironment, createTypeInformation}
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}

case class SensorReadingTest5(id: String,timestamp: Long, temperature: Double)

object RedisSink1 {
def main(args: Array[String]): Unit = {
//创建执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment

val inputStream= env.readTextFile("/opt/java2020_study/maven/flink1/src/main/resources/sensor.txt")
env.setParallelism(1)
inputStream.print()

//先转换成样例类类型
val dataStream = inputStream
  .map(data =>{
    val arr = data.split(",")   //按照,分割数据,获取结果
    SensorReadingTest5(arr(0), arr(1).toLong,arr(2).toDouble)  //生成一个传感器类的数据,参数中传toLong和toDouble是因为默认分割后是字符串类别
  })

//定义一个FlinkJedisConfigBase
val conf = new FlinkJedisPoolConfig.Builder()
    .setHost("127.0.0.1")
    .setPort(6379)
    .build()
dataStream.addSink(new RedisSink[SensorReadingTest5](conf, new MyRedisMapper))
env.execute("写入redis")

}
}

//定义一个redis的mapper类,用于定义保存到redis时调用的命令
class MyRedisMapper extends RedisMapper[SensorReadingTest5]{

//定义保存数据写入redis的命令,HSET 表名 key value
override def getCommandDescription: RedisCommandDescription = {
// additionalKey是用于类似hset时,设置表名
new RedisCommandDescription(RedisCommand.HSET, "sensor_temper")
}

//设置redis的key
override def getKeyFromData(t: SensorReadingTest5): String = t.id

//设置redis的value为温度
override def getValueFromData(t: SensorReadingTest5): String = t.temperature.toString
}

运行效果及代码结构图
Flink从入门到真香(9、Sink数据输出-Redis)
服务器上登录redis看看效果:
[root@localhost ~]# redis-cli
127.0.0.1:6379> keys *
1) "sensor_temper"
127.0.0.1:6379> hget sensor_temper sensor1
"41.0"

猜你喜欢

转载自blog.51cto.com/mapengfei/2547246