当前位置: 首页 > 知识库问答 >
问题:

使用spark在Spring创建Redis群集客户端

谷梁英毅
2023-03-14

我有一个项目连接到独立的redis,客户端创建为:

public RedisConnectionFactory clientCreation() {

        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(5);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);

        JedisConnectionFactory client = new JedisConnectionFactory(poolConfig);
        client.setHostName(redisEastEndpoint);
        client.setPort(redisEastPort);
        client.setTimeout(redisTimeout);
        return client;

用于绝地武士和spring data redis的库版本为:

[INFO] +- redis.clients:jedis:jar:2.9.3:compile
[INFO] |  \- org.apache.commons:commons-pool2:jar:2.6.2:compile
[INFO] +- org.springframework.data:spring-data-redis:jar:2.1.8.RELEASE:compile
[INFO] |  +- org.springframework.data:spring-data-keyvalue:jar:2.1.8.RELEASE:compile
[INFO] |  +- org.springframework:spring-oxm:jar:5.1.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-aop:jar:5.1.7.RELEASE:compile
[INFO] |  \- org.springframework:spring-context-support:jar:5.1.7.RELEASE:compile

现在我需要移动到集群redis,并将客户端创建更改为

public RedisConnectionFactory clientCreation() {

        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(5);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);


        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisEastEndpoint);
        if(StringUtils.isNotBlank(redisPassword)) {
            redisClusterConfiguration.setPassword(redisPassword);
        }

        JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
        jedisClientConfiguration.connectTimeout(Duration.ofSeconds(redisTimeout));
        jedisClientConfiguration.usePooling().poolConfig(poolConfig);

        return new JedisConnectionFactory(redisClusterConfiguration,
                jedisClientConfiguration.build());

通过此代码更改,我在群集中找不到可访问的节点,如下所示:

Caused by: org.springframework.data.redis.RedisConnectionFailureException: No reachable node in cluster; nested exception is redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
    at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:67)
    at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:41)
    at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44)
    at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42)
    at org.springframework.data.redis.connection.jedis.JedisClusterConnection.convertJedisAccessException(JedisClusterConnection.java:760)
    at org.springframework.data.redis.connection.jedis.JedisClusterStringCommands.convertJedisAccessException(JedisClusterStringCommands.java:556)
    at org.springframework.data.redis.connection.jedis.JedisClusterStringCommands.setNX(JedisClusterStringCommands.java:186)
    at org.springframework.data.redis.connection.DefaultedRedisConnection.setNX(DefaultedRedisConnection.java:288)
    at org.springframework.data.redis.core.DefaultValueOperations.lambda$setIfAbsent$10(DefaultValueOperations.java:296)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:224)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
    at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
    at org.springframework.data.redis.core.DefaultValueOperations.setIfAbsent(DefaultValueOperations.java:296)
    at org.springframework.data.redis.support.atomic.RedisAtomicLong.initializeIfAbsent(RedisAtomicLong.java:147)
    at org.springframework.data.redis.support.atomic.RedisAtomicLong.<init>(RedisAtomicLong.java:92)
    at org.springframework.data.redis.support.atomic.RedisAtomicLong.<init>(RedisAtomicLong.java:62)
    at com.capitalone.api.customers.customerapi.service.config.RedisConfig.westESCID(RedisConfig.java:126)
    at com.capitalone.api.customers.customerapi.service.config.RedisConfig$$EnhancerBySpringCGLIB$$88e1d043.CGLIB$westESCID$4(<generated>)
    at com.capitalone.api.customers.customerapi.service.config.RedisConfig$$EnhancerBySpringCGLIB$$88e1d043$$FastClassBySpringCGLIB$$7889c704.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
    at com.capitalone.api.customers.customerapi.service.config.RedisConfig$$EnhancerBySpringCGLIB$$88e1d043.westESCID(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 39 more
Caused by: redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
    at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnection(JedisSlotBasedConnectionHandler.java:61)
    at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:78)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:113)
    at redis.clients.jedis.JedisClusterCommand.runBinary(JedisClusterCommand.java:58)
    at redis.clients.jedis.BinaryJedisCluster.setnx(BinaryJedisCluster.java:273)
    at org.springframework.data.redis.connection.jedis.JedisClusterStringCommands.setNX(JedisClusterStringCommands.java:184)


    ... 59 more

}

由于spark-2.1.3中运行了spark应用程序,由于版本依赖性,我需要使用相同的spring data redis。如果没有jedis和spring data redis的版本升级,我如何连接到集群redis?

共有1个答案

公冶俊达
2023-03-14

瓶颈是火花2.1.3。一旦火花升级到2.4.4,它就像预期的那样工作。

 类似资料:
  • 我已经使用jedis将redis集成到我的spring web应用程序中(redis支持AWS弹性缓存)。在单节点上,它可以很好地使用单绝地连接工厂进行读写。 我现在需要将它扩展到一个集群,以便写入主节点并从次节点读取。也就是说,如果一个下降,那么复制将由AWS自动发生,在这种情况下,我将连接的主机名将被更改。 如何读取进入图片的新节点? 我如何从spring容器(我指的是XML文件)连接到它?

  • 我正在尝试使用apache-spark读取和写入Ignite集群,我可以使用JDBC瘦客户机,但不是本机方法,正如几个spark+Ignite示例中提到的那样。 现在,所有的spark+ignite示例都启动了一个本地ignite集群,但我希望我的代码作为客户端连接到已经存在的集群。 完整代码:-(sparkDSLExample)函数无法使用thin连接ignite远程群集 示例-default.

  • 我们正在尝试使用ZK设置火花高可用性设置。我们有2台机器用于Spark进程的主机,另有3台机器用于Spark从机。Spark主机中的配置在spark-env.sh中如下所示: 其中DEV-SMP-Manager01:2181DEV-SMP-Worker01:2181、DEV-SMP-Worker05:2181是ZK法定人数。它们都在运行。 我们看到了一些与curator相关的错误消息 java.l

  • 我所有的Redis服务器配置如下: 大师:192.168.0.106:7001,192.168.0.1057001,192.168.0.112:7001 从属:192.168.0.106:7002192.168.0.105:7002192.168.0.122:7002 其中192.168.0.106:7002服务器是192.168.0.106:7001服务器的从属服务器等等。我有所有的服务器上an

  • 点击右上角的“创建客群”按钮,进入客群创建页面。创建客群时需设定客群名称,并选择用户组(该新建客群所属的用户组)。 目前用户画像+平台提供了基础属性、购买属性等七大类属性标签用于在线创建客群,用户还可以自己上传文件(imeiMd5格式)创建客群。 在线创建客群时,通过选择属性标签定义客群范围,平台提供了“与”,“或”两种操作,用户可以通过“添加下一项”选择其他属性标签。例如,下图是用于创建年龄在2

  • 我被困在: 在我得到这个之前: 当我签出应用程序跟踪页面时,我在stderr上得到以下信息: 我对这一切都很陌生,也许我的推理有缺陷,任何投入或建议都会有所帮助。