当前位置:   article > 正文

Java认证kerberos连接hbase成功后,24小时失效问题解决_java连接hive kerberos 24小时过期问题

java连接hive kerberos 24小时过期问题

        最近快要被kerberos这个东西搞疯了,Kerberos认证服务是一种网络身份验证协议,目的是提供安全的用户身份验证和授权服务。关于kereberos认证原理及详情我这里不做过多赘述,只讲在实际场景中是怎么应用的。

        在kerberos服务端和客户端都安装好,客户端用kinit命令生成对应的keytab后,hadoop的配置文件也要添加上kerberos相关的配置,可以参考该链接;hadoop、hbase、zookeeper集成kerberos认证_hadoop_昨夜雨疏风zhou-华为云开发者联盟

1、hbase-site.xml中,需要添加以下配置项来启用Kerberos认证

确保/path/to/hbase.keytab为正确的HBase Keytab文件路径,hbase/_HOST@EXAMPLE.COM为正确的HBase主体。

  1. <property>
  2. <name>hbase.security.authentication</name>
  3. <value>kerberos</value>
  4. </property>
  5. <property>
  6. <name>hbase.master.keytab.file</name>
  7. <value>/path/to/hbase.keytab</value>
  8. </property>
  9. <property>
  10. <name>hbase.master.kerberos.principal</name>
  11. <value>hbase/_HOST@EXAMPLE.COM</value>
  12. </property>
  13. <property>
  14. <name>hbase.regionserver.keytab.file</name>
  15. <value>/path/to/hbase.keytab</value>
  16. </property>
  17. <property>
  18. <name>hbase.regionserver.kerberos.principal</name>
  19. <value>hbase/_HOST@EXAMPLE.COM</value>
  20. </property>

2、core-site.xml中,需要添加以下配置项来启用Kerberos认证

  1. <property>
  2. <name>hadoop.security.authentication</name>
  3. <value>kerberos</value>
  4. </property>
  5. <property>
  6. <name>hadoop.security.authorization</name>
  7. <value>true</value>
  8. </property>

3、hbase-site.xml中,添加以下配置项:

  1. <property>
  2. <name>hbase.zookeeper.property.authProvider.1</name>
  3. <value>org.apache.zookeeper.server.auth.SASLAuthenticationProvider</value>
  4. </property>

在环境及各种配置都添加完毕后,接下来就是在代码中实现了。

刚开始我也以为很简单,就是在获取hbase链接前进行一下kerberos登录就行了,代码如下

  1. //添加kerberos信息
  2. Configuration conf = HBaseConfiguration.create();
  3. System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
  4. conf.set("hadoop.security.authentication", "Kerberos");
  5. conf.set("keytab.file","/home/xdy/smokeuser.headless.keytab");
  6. conf.set("kerberos.principal","bcdp@HADOOP.COM");
  7. UserGroupInformation.setConfiguration(conf);
  8. UserGroupInformation.loginUserFromKeytab("bcdp@HADOOP.COM", "/home/xdy/smokeuser.headless.keytab");
  9. conn = ConnectionFactory.createConnection(conf);

日志中出现Login successful for user 这一行就说明kerberos认证成功:

  1. INFO[org.apache.hadoop.security.UserGroupInformation:1069]- Login successful for user bcdp-bjlzxqcluster@HADOOP.COM using
  2. keytab file /home/xdy/smokeuser.headless.keytab

结果也确实没问题,可以成功访问hadoop集群,并进行hbase的查询和入库操作,但没想到过了24小时后却收到报错:

  1. [org.apache.hadoop.hbase.ipc.BlockingRpcConnection$1:398]- Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
  2. ERROR[org.apache.hadoop.hbase.ipc.BlockingRpcConnection$1:406]- SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.
  3. javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

总体就是说kerberos认证无效了,由于自己也是第一次接触kerberos,所以在网上查找了大量的资料,尝试了很多方法,可参考该链接:

java连接hbase Kerberos 24小时过期问题_kerbros 24小时后断-CSDN博客

上面提到的各种方法也都试过了,各种版本最后也和他的版本保持一致hbase-client-1.5.0,hadoop-common-2.8.5版本,定时任务也加了,但还是没用,还是过24小时就失效,然后重启,就这样循环重启了好几天,最后请教专家终于是把这个问题解决了。

        下面直接上代码:

  1. //循环执行kerberos认证登录
  2. public class ScheduleCheckTGTAndReloginFromKeyTab {
  3. private static Timer timer;
  4. private static ScheduleCheckTGTAndReloginFromKeyTab scheduleCheckTGTAndReloginFromKeyTab;
  5. private static final Logger logger = Logger.getLogger(ScheduleCheckTGTAndReloginFromKeyTab.class);
  6. private ScheduleCheckTGTAndReloginFromKeyTab(String serverName) {
  7. scheduleCheckTGTAndReloginFromKeyTab = this;
  8. timer = new Timer();
  9. timer.schedule(new RemindTask(serverName), 0, 2 * 3600 * 1000);
  10. }
  11. public synchronized static ScheduleCheckTGTAndReloginFromKeyTab getTimer(String serverName) {
  12. if (scheduleCheckTGTAndReloginFromKeyTab == null) {
  13. scheduleCheckTGTAndReloginFromKeyTab = new ScheduleCheckTGTAndReloginFromKeyTab(serverName);
  14. }
  15. return scheduleCheckTGTAndReloginFromKeyTab;
  16. }
  17. class RemindTask extends TimerTask {
  18. String server = "";
  19. public RemindTask(String serverName) {
  20. server = serverName;
  21. }
  22. public void run() {
  23. try {
  24. Connection connection = HbaseConnection.connectionMap.get(this.server);
  25. if (connection != null && !connection.isClosed()) {
  26. logger.info("start to check TGT and relogin from keytab at " + new Date().toString());
  27. UserGroupInformation.getCurrentUser().checkTGTAndReloginFromKeytab();
  28. HbaseConnection.getHbaseConnection(server);
  29. }
  30. System.gc();
  31. } catch (Exception e) {
  32. logger.error(e);
  33. }
  34. }
  35. }
  36. }
  1. //获取hbase链接
  2. public class HbaseConnection {
  3. public static Map<String, Connection> connectionMap = new HashMap<String, Connection>();
  4. private static final Logger logger = Logger.getLogger(HbaseConnection.class);
  5. public synchronized static Connection getHbaseConnection(String serverName) {
  6. Connection connection = connectionMap.get(serverName);
  7. if (connection != null && !connection.isClosed()) {
  8. return connection;
  9. } else {
  10. Configuration configuration = HBaseConfiguration.create();
  11. configuration.set("hbase.zookeeper.quorum", "lzxq-cdata01,lzxq-cdata02,lzxq-cdata03,lzxq-cdata04,lzxq-cmanager01,lzxq-cmanager02,lzxq-cmanager03");
  12. configuration.set("hbase.zookeeper.property.clientPort", "2181");
  13. configuration.set("zookeeper.znode.parent", "/hbase-secure");
  14. configuration.set("dfs.socket.timeout", "180000");
  15. configuration.set("keytab.file","/home/xdy/smokeuser.headless.keytab");
  16. configuration.set("kerberos.principal","bcdp@HADOOP.COM");
  17. configuration.set("hbase.master.port", "16000");
  18. configuration.set("hadoop.security.authentication", "kerberos");
  19. configuration.set("hbase.security.authentication", "kerberos");
  20. try {
  21. UserGroupInformation.setConfiguration(configuration);
  22. UserGroupInformation.loginUserFromKeytab("bcdp@HADOOP.COM", "/home/xdy/smokeuser.headless.keytab");
  23. ScheduleCheckTGTAndReloginFromKeyTab.getTimer(serverName);
  24. connection = ConnectionFactory.createConnection(configuration);
  25. if (connection != null) {
  26. connectionMap.put(serverName, connection);
  27. }
  28. }
  29. catch (IOException e) {
  30. logger.error(e);
  31. }
  32. return connection;
  33. }
  34. }

目前项目已经稳定运行了三天,没有出现什么问题。

总结:Java认证kerberos连接hbase成功后,24小时失效这个问题,如果客户端使用的hadoop版本在3.0以下,则使用我上面的这个方法,如果是3.0以上,则不需要循环认证,hadoop3.x版本里面自带重新认证登录kerberos的方法,更加的方便。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/611932
推荐阅读
相关标签
  

闽ICP备14008679号