Flink流处理-Redis Connector

本文介绍如何使用Apache Flink 1.9.0版本通过Flink-connector-redis_2.11连接Redis 5.0.4单机模式,并提供具体测试代码,展示将流处理结果写入Redis的Hash表的全过程。

环境

flink-1.9.0
redis-5.0.4单机模式

一、需要的依赖

<!--flink流处理依赖-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.11</artifactId>
    <version>1.9.0</version>
</dependency>
<!--连接redis依赖-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-redis_2.11</artifactId>
    <version>1.1.5</version>
</dependency>

二、测试代码

package cn.myclass.connector;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
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;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommandDescription;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisMapper;


/**
 * flink连接redis,将结果写入redis
 * @author Yang
 */
public class RedisConnector {

    /**
     * 自定义redis数据类型的映射
     */
    public static class MyRedisMapper implements RedisMapper<Tuple2<String, Integer>> {

        /**
         * 设置redis数据类型以及hash表键的名称。
         * 即将处理结果(元组Tuple2<String, Integer>)映射为redis里的hash表数据类型
         */
        @Override
        public RedisCommandDescription getCommandDescription() {
            return new RedisCommandDescription(RedisCommand.HSET, "flink");
        }

        /**
         * 设置键,从元组中获取到单词作为键
         * @param data 元组数据
         * @return java.lang.String 键
         */
        @Override
        public String getKeyFromData(Tuple2<String, Integer> data) {
            return data.f0;
        }

        /**
         * 设置键的值,从元组中获取到单词出现的次数设置为键的值
         * @param data 元组数据
         * @return java.lang.String 键对应的值
         */
        @Override
        public String getValueFromData(Tuple2<String, Integer> data) {
            return data.f1.toString();
        }
    }

    public static void main(String[] args) throws Exception {
        // 获得流执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 将元素变为元组并计算出现的次数
        DataStream<Tuple2<String, Integer>> stream = env.fromElements("hello","hello","hi").map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
                return new Tuple2<>(s, 1);
            }
        }).keyBy(0).sum(1);

        // 单机连接redis
        FlinkJedisPoolConfig conf = new FlinkJedisPoolConfig.Builder().setHost("hadoop").build();
        // 将结果写入redis
        stream.addSink(new RedisSink<>(conf, new MyRedisMapper()));
        // 执行任务
        env.execute("redis sink");
    }
}

注:Redis在Flink中的数据类型与Redis命令行数据类型对应关系
在这里插入图片描述

三、测试结果

打开redis客户端查看
在这里插入图片描述

root@pwj:/opt/project/test_1# mvn clean package -U [INFO] Scanning for projects... [INFO] [INFO] -----------------------< org.example:scala_test >----------------------- [INFO] Building scala_test 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- Downloading from apache-hbase: https://repository.apache.org/content/repositories/releases/net/minidev/json-smart/maven-metadata.xml Downloading from alimaven: https://maven.aliyun.com/repository/public/net/minidev/json-smart/maven-metadata.xml Downloading from cloudera-repos: https://repository.cloudera.com/artifactory/cloudera-repos/net/minidev/json-smart/maven-metadata.xml Downloading from aliyun-public: https://maven.aliyun.com/repository/public/net/minidev/json-smart/maven-metadata.xml Downloaded from aliyun-public: https://maven.aliyun.com/repository/public/net/minidev/json-smart/maven-metadata.xml (1.4 kB at 7.3 kB/s) Downloaded from alimaven: https://maven.aliyun.com/repository/public/net/minidev/json-smart/maven-metadata.xml (1.4 kB at 7.3 kB/s) Downloading from maven-central-mirror: https://repo.maven.apache.org/maven2/net/minidev/json-smart/maven-metadata.xml Downloading from aliyun-spring: https://maven.aliyun.com/repository/spring/net/minidev/json-smart/maven-metadata.xml [WARNING] Checksum validation failed, expected <!doctype but is b912a31b6985bf6264b5e9525a859606934851b3 from aliyun-spring for https://maven.aliyun.com/repository/spring/net/minidev/json-smart/maven-metadata.xml [WARNING] Could not validate integrity of download from https://maven.aliyun.com/repository/spring/net/minidev/json-smart/maven-metadata.xml: Checksum validation failed, expected <!doctype but is b912a31b6985bf6264b5e9525a859606934851b3 [WARNING] Checksum validation failed, expected <!doctype but is b912a31b6985bf6264b5e9525a859606934851b3 from aliyun-spring for https://maven.aliyun.com/repository/spring/net/minidev/json-smart/maven-metadata.xml Downloaded from aliyun-spring: https://maven.aliyun.com/repository/spring/net/minidev/json-smart/maven-metadata.xml (159 kB at 1.1 MB/s) Downloading from apache.snapshots: https://repository.apache.org/snapshots/net/minidev/json-smart/maven-metadata.xml Downloading from dynamodb-local-oregon: https://s3-us-west-2.amazonaws.com/dynamodb-local/release/net/minidev/json-smart/maven-metadata.xml Downloading from apache.snapshots.https: https://repository.apache.org/content/repositories/snapshots/net/minidev/json-smart/maven-metadata.xml Downloaded from cloudera-repos: https://repository.cloudera.com/artifactory/cloudera-repos/net/minidev/json-smart/maven-metadata.xml (1.4 kB at 869 B/s) Downloading from repository.jboss.org: https://repository.jboss.org/nexus/content/groups/public/net/minidev/json-smart/maven-metadata.xml Downloaded from maven-central-mirror: https://repo.maven.apache.org/maven2/net/minidev/json-smart/maven-metadata.xml (1.4 kB at 735 B/s) [WARNING] The metadata /root/.m2/repository/net/minidev/json-smart/maven-metadata-aliyun-spring.xml is invalid: unexpected markup <!d (position: START_DOCUMENT seen \n<!d... @2:4) Downloading from alimaven: https://maven.aliyun.com/repository/public/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.pom Downloading from aliyun-public: https://maven.aliyun.com/repository/public/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.pom Downloading from apache-hbase: https://repository.apache.org/content/repositories/releases/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.pom Downloading from cloudera-repos: https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.pom Downloading from aliyun-spring: https://maven.aliyun.com/repository/spring/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.pom Downloading from maven-central-mirror: https://repo.maven.apache.org/maven2/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.pom [WARNING] The POM for org.apache.bahir:flink-connector-redis_2.12:jar:1.1.1 is missing, no dependency information available Downloading from alimaven: https://maven.aliyun.com/repository/public/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.jar Downloading from aliyun-public: https://maven.aliyun.com/repository/public/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.jar Downloading from apache-hbase: https://repository.apache.org/content/repositories/releases/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.jar Downloading from cloudera-repos: https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.jar Downloading from aliyun-spring: https://maven.aliyun.com/repository/spring/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.jar Downloading from maven-central-mirror: https://repo.maven.apache.org/maven2/org/apache/bahir/flink-connector-redis_2.12/1.1.1/flink-connector-redis_2.12-1.1.1.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 16.924 s [INFO] Finished at: 2025-09-25T10:02:06+08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project scala_test: Could not resolve dependencies for project org.example:scala_test:jar:1.0-SNAPSHOT: Could not find artifact org.apache.bahir:flink-connector-redis_2.12:jar:1.1.1 in alimaven (https://maven.aliyun.com/repository/public) -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException root@pwj:/opt/project/test_1# Could not find artifact org.apache.bahir:flink-connector-redis_2.12:pom:1.1.1 in alimaven (https://maven.aliyun.com/repository/public)
09-26
<think> 根据用户需求,需要解决在Maven项目中找不到`org.apache.bahir:flink-connector-redis_2.12:1.1.1`依赖的问题。结合引用内容,解决方案如下: ### 问题原因分析 1. **Maven中央仓库索引延迟** Apache Bahir项目的`flink-connector-redis_2.12:1.1.1`虽已发布[^1],但可能存在仓库同步延迟。 2. **本地缓存损坏** Maven本地仓库(`~/.m2/repository`)中可能存在不完整的依赖缓存。 3. **网络访问限制** 访问Maven中央仓库(`repo.maven.apache.org`)受阻,尤其在国内网络环境下。 --- ### 解决方案 #### 步骤1:确保依赖声明正确(当前配置已验证) ```xml <dependency> <groupId>org.apache.bahir</groupId> <artifactId>flink-connector-redis_2.12</artifactId> <version>1.1.1</version> </dependency> ``` #### 步骤2:添加显式仓库配置(引用[2]建议) 在`pom.xml`中增加Bahir专属仓库(位于Apache仓库组): ```xml <repositories> <repository> <id>apache.snapshots</id> <url>https://repository.apache.org/content/repositories/snapshots/</url> <releases><enabled>false</enabled></releases> </repository> <!-- 新增Bahir发布仓库 --> <repository> <id>apache.releases</id> <url>https://repository.apache.org/content/repositories/releases/</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories> ``` #### 步骤3:强制更新Maven依赖 执行命令强制下载最新依赖: ```bash mvn clean package -U -DskipTests ``` 参数说明: - `-U`:强制检查远程仓库更新 - `-DskipTests`:跳过测试(引用[2]推荐) #### 步骤4:验证依赖存在性 检查Maven中央仓库页面: https://repo.maven.apache.org/maven2/org/apache/bahir/flink-connector-redis_2.12/1.1.1/ --- ### 备选方案(如仍失败) 若上述步骤无效,可尝试以下方法: 1. **阿里云镜像加速** 在`settings.xml`中配置阿里云镜像: ```xml <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> ``` 2. **手动下载安装** 通过页面下载JAR包后手动安装到本地仓库: ```bash mvn install:install-file \ -Dfile=flink-connector-redis_2.12-1.1.1.jar \ -DgroupId=org.apache.bahir \ -DartifactId=flink-connector-redis_2.12 \ -Dversion=1.1.1 \ -Dpackaging=jar ``` --- ### 验证结果 检查依赖树确认Redis连接器已引入: ```bash mvn dependency:tree | grep bahir ``` 预期输出应包含: ``` [INFO] +- org.apache.bahir:flink-connector-redis_2.12:jar:1.1.1:compile ``` > **注意**:根据引用[4]的实践,Flink连接器需严格匹配Scala主版本(`2.11`/`2.12`),错误版本将导致`NoClassDefFoundError`[^2]。 --- §§相关问题§§ 1. 如何解决Maven仓库镜像访问超时问题? 2. Flink连接器与Scala版本不兼容的表现有哪些? 3. 除了Maven Central,还有哪些仓库提供Apache Bahir组件? </think> ### 解决 Maven 构建找不到 `org.apache.bahir:flink-connector-redis_2.12:1.1.1` 依赖的方案 #### 问题原因分析 1. **仓库配置缺失** Apache Bahir 的依赖默认不在 Maven 中央仓库,需显式添加专属仓库配置[^2]。 2. **版本兼容性问题** 若 Flink 版本与 Bahir 版本不匹配(如 Flink 1.14.x 需匹配 Bahir 1.1.x),会导致依赖解析失败[^1]。 3. **网络访问限制** 国内直接访问 Apache 仓库可能不稳定,需配置镜像加速[^2]。 --- #### 解决方案(修改 `pom.xml`) ##### 第一步:添加 Bahir 专属仓库 ```xml <repositories> <!-- 新增 Apache Bahir 仓库 --> <repository> <id>apache-bahir-releases</id> <url>https://repository.apache.org/content/repositories/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> ``` ##### 第二步:修正依赖声明 ```xml <dependency> <groupId>org.apache.bahir</groupId> <!-- GroupID 修正为 bahir --> <artifactId>flink-connector-redis_${scala.binary.version}</artifactId> <version>1.1.1</version> </dependency> ``` ##### 第三步:添加阿里云镜像(可选提速) 在 `~/.m2/settings.xml` 中添加: ```xml <mirror> <id>aliyun-bahir</id> <mirrorOf>apache-bahir-releases</mirrorOf> <name>阿里云 Bahir 镜像</name> <url>https://maven.aliyun.com/repository/apache-snapshots</url> </mirror> ``` --- #### 验证步骤 1. **清除本地缓存** 删除本地 Maven 仓库中的 Bahir 目录: ```bash rm -rf ~/.m2/repository/org/apache/bahir ``` 2. **强制更新依赖** 执行构建命令: ```bash mvn clean package -U -DskipTests ``` 参数说明: - `-U`:强制检查远程仓库更新 - `-DskipTests`:跳过测试(引用[2]建议) 3. **检查依赖树** ```bash mvn dependency:tree -Dincludes=org.apache.bahir ``` 预期输出: ``` [INFO] org.apache.bahir:flink-connector-redis_2.12:jar:1.1.1 ``` --- #### 备选方案(若仍失败) **手动下载安装**: 1. 访问 [Bahir 发行版页面](https://dist.apache.org/repos/dist/release/bahir/flink-connector-redis_2.12/1.1.1/) 2. 下载 JAR 文件到本地 3. 执行安装命令: ```bash mvn install:install-file \ -Dfile=flink-connector-redis_2.12-1.1.1.jar \ -DgroupId=org.apache.bahir \ -DartifactId=flink-connector-redis_2.12 \ -Dversion=1.1.1 \ -Dpackaging=jar ``` > **关键提示**:根据引用[4]经验,Scala 二进制版本(`${scala.binary.version}`)必须与 Flink 运行时完全一致,否则会引发 `NoClassDefFoundError`[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值