先说调测程序中遇到的问题:

1、以纯java脚本连接Redis,可以实现增删查等操作,程序如下:

import com.huawei.jredis.client.KerberosUtil;
import redis.clients.jedis.*;
import www.hebei.huawei.utils.JedisClusterPool;/*** Step1:对Redis进行安全认证,keytab文件和krb5文件均在BDI主机,Redis集群认证过程在BDI主机完成,与Hadoop集群结点没有关系* Step2:设置Redis连接参数,修改Jedis连接池最大空闲连接数、最大连接数和最小空闲连接数* Step3:通过JedisCluster连接Redis,获得连接对象* Step4:对Redis进行增、查、删操作。* step5:关闭Redis连接*/public class SecureJedisClusterDemo {public static void main(String[] args) {System.out.println("正在获取redis客户端....");String redisuser_keytab= "/tmp/redis/redisuser.keytab";String krb5 = "/tmp/redis/krb5.conf";JedisClusterPool jedisClusterPool = new JedisClusterPool();JedisCluster client = jedisClusterPool.getJedisCluster(redisuser_keytab,krb5);System.out.println("redis客户端连接成功!");System.out.println(client.getClusterNodes());client.set("test","我是测试数据1,看到我你就成功了!");System.out.println("获取test值:" + client.get("test"));client.del("test");System.out.println("test键值对应的数据已删除!");try {System.out.println("正在关闭redis客户端...");client.close();System.out.println("redis客户端关闭成功!");}catch(Exception e){e.printStackTrace();}}}
import com.huawei.jredis.client.GlobalConfig
import com.huawei.jredis.client.auth.AuthConfiguration
import org.apache.commons.pool2.impl.GenericObjectPoolConfig
import redis.clients.jedis.{HostAndPort, JedisCluster}import java.io.File
import java.util/*** @Author: * @Email: * @Version: 2022/6/14 15:22* @Describe: 连接Redis* */
class JedisClusterPool{def getJedisCluster(keytab:String,krb5:String): JedisCluster = {System.setProperty("java.security.krb5.conf", krb5)System.setProperty("sun.security.krb5.debug", "true")System.setProperty("java.security.krb5.realm", "HADOOP.COM")val authConfiguration = new AuthConfiguration(keytab, "xxxxxxx")GlobalConfig.setAuthConfiguration(authConfiguration)val hosts = new util.HashSet[HostAndPort]hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))hosts.add(new HostAndPort("10.xxx.xxx.xxx", xxxxx))// Jedis连接池配置val jedisPoolConfig = new GenericObjectPoolConfig()// 最大空闲连接数, 默认8个jedisPoolConfig.setMaxIdle(8)// 最大连接数, 默认8个jedisPoolConfig.setMaxTotal(8)//最小空闲连接数, 默认0jedisPoolConfig.setMinIdle(0)// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1jedisPoolConfig.setMaxWaitMillis(2000); // 设置2秒//对拿到的connection进行validateObject校验jedisPoolConfig.setTestOnBorrow(true)// 连接val client: JedisCluster = new JedisCluster(hosts,2000,100,100, jedisPoolConfig)client}
}

2、使用生产环境Spark通过local模式连接Redis,通过以下命令进行鉴权,鉴权过程不报错,但是通过JedisCluster类去连接Redis时报错No Reachable node in cluster

System.setProperty("java.security.krb5.conf", krb5)
System.setProperty("sun.security.krb5.debug", "true")
System.setProperty("java.security.krb5.realm", "HADOOP.COM")
val authConfiguration = new AuthConfiguration(keytab, "XXXXXXX")
GlobalConfig.setAuthConfiguration(authConfiguration)

3、以Client模式运行Spark程序连接Redis,此时Driver端为运行程序的主机Executor为集群中的节点,使用和local模式同样的鉴权命令和鉴权文件,可以在客户端连接Redis实现增、删、查等操作,但是在集群节点中运行的程序无法连接Redis,报错类型为No Reachable node in cluster

4、以cluster模式运行Spark程序连接Redis,此时NameNode和DataNode均为集群中的虚机,使用同样的鉴权程序和鉴权文件,无法连接Redis,报错类型为No Reachable node in cluster

可以发现只能在本地主机完成Redis集群的Kerberos鉴权和连接,无法在集群中连接Redis!

再说一下我是怎么解决的:

主要原因出在鉴权文件上,krb5文件中必须添加Redis集群的节点信息,才能通过Kerberos鉴权,由于Executor与Redis创建连接需要使用鉴权文件,所以将keytab文件和krb5文件均需要添加到容器中,添加到容器的方法可以是sc.addfile("文件绝对路径")也可以在submit命令中通过--files添加,然后利用SparkFile.get("xxxx.conf")获取鉴权文件,最终可以连接Redis解决No Reachable node in cluster问题。

最后,同样的报错可能会由很多不同的情况导致,其他的解决问题的方法请自行百度吧,我这里就不进行总结了。我当初为了解决该问题也走了很多弯路,比如去研究Kerberos鉴权的过程,通过hadoop的kerberos鉴权进行对比,但就是没有怀疑过krb5.conf文件的问题,希望对大家有帮助。

与君共勉

Kerberos鉴权后Spark程序连接Redis数据库,解决No Reachable node in cluster错误相关推荐

  1. redis集群出现No reachable node in cluster

    Exception in thread "main" redis.clients.jedis.exceptions.JedisNoReachableClusterNodeExcep ...

  2. redis集群出现JedisNoReachableClusterNodeException异常(No reachable node in cluster)

    redis集群出现JedisNoReachableClusterNodeException异常(No reachable node in cluster) 参考文章: (1)redis集群出现Jedi ...

  3. 连接redis集群报错: no reachable node in cluster

    今天在连接redis集群时遇到个问题,试了很多方案也没解决. 就是连接redis集群老是报错: no reachable node in cluster. 后来改了一些参数,就可以调通了. 废话不多说 ...

  4. java 带密码连接redis 单节点/集群 No reachable node in cluster报错解决

    java 带密码连接redis 单节点/集群 No reachable node in cluster报错解决 maven依赖 <dependency><groupId>red ...

  5. 海康、大华等网络摄像头RTSP_Onvif网页无插件直播流媒体服务器EasyNVR鉴权出现跨域问题的解决方法

    背景分析 随着平安城市.智慧城市.雪亮工程.智能交通等各项建设的持续开展,安防逐渐得到普及,面对如此广阔的市场,对安防企业来说不仅仅是机遇更多的是挑战.现今大多数摄像头一直没能摆脱人工监控的传统监控方 ...

  6. redis数据库的主从、哨兵和cluster模式的实现原理与搭建详解(win10系统)

    Redis 内存K-V 型数据库 内存占用 redis 的数据保存在内存中,数据变多,内存占用更大.当 redis 服务器停止运行时,数据便会消失. 使用 save 和 bgsave 命令可以将内存中 ...

  7. Active Directory 02 - Windows Kerberos Authentication(Kerberos 协议鉴权)

    写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay.邀请链接在这里: https://discord.gg/9Xv ...

  8. 大数据Hadoop之——Zookeeper鉴权认证(Kerberos认证+账号密码认证)

    文章目录 一.Zookeeper概述与安装 二.Zookeeper Kerberos 鉴权认证 1)Kerberos安装 2)创建用户并生成keytab鉴权文件(前期准备) 3)独立zookeeper ...

  9. 鉴权必须了解的 5 个兄弟:cookie、session、token、jwt、单点登录

    本文你将看到: 基于 HTTP 的前端鉴权背景 cookie 为什么是最方便的存储方案,有哪些操作 cookie 的方式 session 方案是如何实现的,存在哪些问题 token 方案是如何实现的, ...

最新文章

  1. GEO芯片数据探针id转化
  2. php异常跑出,php 抛出异常但继续往下执行为什么
  3. QT的QScriptContext类的使用
  4. Coolpad Y1刷机方法
  5. LiveVideoStack线上分享第五季(十二):移动端多种通话场景统一技术方案实践...
  6. linux-shell命令之chgrp(change group)【更改群组】
  7. Spring4.x()-Spring的Jdbc事务-注解
  8. 线程创建方式3-实现 callable接口(Java)
  9. 中国科学院微电子学院计算机,周云燕 - 中国科学院大学 - 微电子学院
  10. Merge PDF - Split PDF(PDF合成)
  11. 关关采集器规则编写教程(最详细的教程)
  12. 数字基础设施可视化管理,任重而道远
  13. Python系列之面向对象编程
  14. Control Egress TCP Traffic
  15. win10蓝屏自动修复解决方案
  16. ETH持续暴雷!历史是如此的相似
  17. python中idx+=1_在Python中为apos;循环访问索引 Dovov编程网
  18. Linux添加用户练习
  19. 二分查找(普通、找第一个、找最后一个)
  20. 【Python实战】中国首份姓名报告出炉!中国爸妈给孩子取什么名?点开前你先猜一下……

热门文章

  1. Lesson 20 One man in a boat 独坐孤舟
  2. Bmob 萌新也能简易上手 之一 注册登录- *2020版 (有demo)
  3. B站手机APP缓存视频(m4s)转换为mp4格式
  4. 【中英双语】C 语言的历史
  5. 小型项目程序 ERP——沙盘模拟
  6. Mac OS X中virtualenv里python shell无法使用光标键问题的解决
  7. Java EE小知识
  8. 学计算机的用双核CPU够吗,电脑cpu核数越多越好吗
  9. PCB设计技巧10大技巧
  10. android apk是什么文件,apk是什么文件?apk文件肿么打开?