Flink 实时将数据写到 Redis

  1. RedisSinkDemo 代码
    import java.net.InetSocketAddress
    import java.util
    
    import org.apache.flink.streaming.api.scala._
    import org.apache.flink.streaming.connectors.redis.RedisSink
    import org.apache.flink.streaming.connectors.redis.common.config.FlinkJedisClusterConfig
    import org.apache.flink.streaming.connectors.redis.common.mapper.{RedisCommand, RedisCommandDescription, RedisMapper}
    
    
    object RedisSinkDemo {
    
      def main(args: Array[String]): Unit = {
    
        val streamEnv = StreamExecutionEnvironment.getExecutionEnvironment
    
        val socketHost: String = "node01"
        val socketPort: Int = 7777
        val redisHost: String = "node02"
        val redisPort: Int = 7777
    
        val socketDs: DataStream[String] = streamEnv.socketTextStream(socketHost, socketPort)
    
        val wordCount: DataStream[(String, Int)] =
          socketDs.flatMap(_.split(" ")).map((_, 1)).keyBy(0).sum(1)
    
        //连接redis的配置
        val nodes = new util.HashSet[InetSocketAddress](
          util.Arrays.asList(
            new InetSocketAddress(redisHost, redisPort)
          ))
        val config: FlinkJedisClusterConfig = new FlinkJedisClusterConfig.Builder()
          .setNodes(nodes).build()
        //写入redis
        wordCount.addSink(new RedisSink[(String, Int)](config, new MyRedisMapper))
        streamEnv.execute("Redis Sink Demo")
      }
    }
    
    class MyRedisMapper extends RedisMapper[(String, Int)] {
      override def getCommandDescription: RedisCommandDescription = {
        new RedisCommandDescription(RedisCommand.HSET, "wordcount")
      }
    
      override def getKeyFromData(t: (String, Int)): String = {
        t._1
      }
    
      override def getValueFromData(t: (String, Int)): String = {
        t._2.toString
      }
    }
    
  2. 自行编译打包 flink-connector-redis_2.11

    下载地址: https://bahir.apache.org/downloads/flink/
    github: https://github.com/apache/bahir-flink.git

    编译命令:

    mvn -T8C -DskipTests=true clean install
    

    本地仓库安装命令:

    mvn install:install-file --settings=D:\development\apache-maven-3.3.9\conf\settings-local.xml -Dfile=D:\flink-connector-redis_2.11-1.1-SNAPSHOT.jar -DgroupId=org.apache.bahir -DartifactId=flink-connector-redis_2.11 -Dversion=1.1-SNAPSHOT -Dpackaging=jar 
    

    遇到的问题:
    使用 RedisCommand.HSET 会在 flink 程序重新启动时会重置 redis 中存储的 key,但由于目前该版本不支持 hincriby 命令,故自行添加支持该命令。代码请查看 https://github.com/Git-Charles/bahir-flink.git

    使用 RedisCommand.HINCRBY 时,不能加 sum(1) 函数,这里 flink 做了累加。
    上述代码修改为:

    ...
    val wordCount: DataStream[(String, Int)] =
          socketDs.flatMap(_.split(" ")).map((_, 1)).keyBy(0)
    ...
    new RedisCommandDescription(RedisCommand.HINCRBY, "wordcount")
    ...
    
  3. pom.xml 文件部分内容
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <scala.version>2.11.12</scala.version>
        <scala.version.large>2.11</scala.version.large>
        <!--<hadoop.version>3.0.0-cdh6.3.2</hadoop.version>-->
        <flink.version>1.9.2</flink.version>
        <jedis.version>2.9.0</jedis.version>
        <flink.connector.redis.version>1.1-SNAPSHOT</flink.connector.redis.version>
        <scope.level>compile</scope.level>
    </properties>
    
    <repositories>
        <!-- cloudera 的仓库 -->
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
            <name>Cloudera Repositories</name>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    
    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>${jedis.version}</version>
        </dependency>
        <!-- scala -->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
            <!--            <scope>${scope.level}</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.bahir</groupId>
            <artifactId>flink-connector-redis_${scala.version.large}</artifactId>
            <version>${flink.connector.redis.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.flink</groupId>
                    <artifactId>flink-streaming-java_2.11</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-scala_${scala.version.large}</artifactId>
            <version>${flink.version}</version>
            <scope>${scope.level}</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-statebackend-rocksdb_2.11</artifactId>
            <version>${flink.version}</version>
            <scope>${scope.level}</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_${scala.version.large}</artifactId>
            <version>${flink.version}</version>
            <scope>${scope.level}</scope>
        </dependency>
    </dependencies>
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink中,可以使用FlinkRedis连接器来将偏移量保存到Redis中。以下是一个简单的示例: 首先,需要添加FlinkRedis连接器依赖: ``` <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-redis_2.11</artifactId> <version>${flink.version}</version> </dependency> ``` 然后,在Flink应用程序中,可以使用如下代码将偏移量保存到Redis中: ```java public class RedisOffsetSinkFunction implements SinkFunction<Tuple2<String, Long>> { private final RedisClient redisClient; private final String redisKey; public RedisOffsetSinkFunction(RedisClient redisClient, String redisKey) { this.redisClient = redisClient; this.redisKey = redisKey; } @Override public void invoke(Tuple2<String, Long> value) throws Exception { RedisCommands<String, String> commands = redisClient.connect().sync(); commands.hset(redisKey, value.f0, value.f1.toString()); } } ``` 在上述代码中,假设我们要将偏移量保存到Redis的哈希表中,哈希表的键是`redisKey`,哈希表的字段是偏移量对应的分区编号,哈希表的值是偏移量。 最后,在Flink应用程序中,可以使用如下代码将偏移量写入Redis: ```java DataStream<Tuple2<String, Long>> offsets = ...; // 假设这里获取到了偏移量数据RedisClient redisClient = RedisClient.create(new RedisURI("redis://localhost:6379")); RedisOffsetSinkFunction sinkFunction = new RedisOffsetSinkFunction(redisClient, "offsets"); offsets.addSink(sinkFunction); ``` 这里假设偏移量数据流的类型为`Tuple2<String, Long>`,其中`String`类型的字段表示分区编号,`Long`类型的字段表示偏移量。通过`addSink`方法将偏移量数据流写入Redis即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值