Kerberos Java 凭据缓存

Kerberos Java Credentials Cache

我运行按照代码与启用了 kerberos 的 hadoop 集群进行交互。

val t1 = new Thread() {
            override def run() {
                println("output of first thread")
                val conf = new Configuration
                conf.set("hadoop.security.authentication", "Kerberos")
                conf.set("fs.defaultFS", "hdfs://192.168.23.206:8020")
                UserGroupInformation.setConfiguration(conf)
                UserGroupInformation.loginUserFromKeytab("dummy@platalyticsrealm", "E:\\dummy.keytab");
                val fs = FileSystem.get(conf);
                val status = fs.listStatus(new Path("/"))

                println(UserGroupInformation.getLoginUser().getShortUserName())
            }
        }
val t2 = new Thread() {
            override def run() {
                println("Running Thread 2")
                val conf = new Configuration
                conf.set("hadoop.security.authentication", "Kerberos")
                conf.set("fs.defaultFS", "hdfs://192.168.23.206:8020")
                UserGroupInformation.setConfiguration(conf)
                UserGroupInformation.loginUserFromKeytab("test@platalyticsrealm", "E:\\test.keytab");
                val fs = FileSystem.get(conf);
                val status = fs.listStatus(new Path("/"))

                println(UserGroupInformation.getLoginUser().getShortUserName())

            }
        }
        t1.start
        Thread.sleep(5000)
        t2.start

此代码产生以下输出。

测试

测试

这意味着第二个线程覆盖了第一个线程获得的凭据。 我有以下问题 1.凭据存储在我的 windows 环境中的位置。我在 C:\Users\username 下搜索,但没有找到。 2. 当多个用户同时尝试访问 hadoop 时,如何解决覆盖凭证缓存的问题。

谢谢

您的 Java 代码显然使用 静态方法 来设置 默认的、隐式的、全局的、JVM 范围的 UGI。这就是人们 99% 的时间所需要的。

但是 如果您需要在客户端-服务器模式下为多个用户提供多个会话,那么显然这是行不通的。请阅读在 Google 搜索中随机选择的 that tutorial,位于 "Multiple UGIs" 部分。那就自己研究一下吧。

如果您想深入了解实施细节,您可以查看 awe-inspiring grimoire 实际维护 Hadoop 安全代码库 (还有 Spark 代码库和ZK 代码库) 对此不太高兴。