Kerberos Java凭据缓存

时间:2016-07-19 09:35:12

标签: java hadoop kerberos

我正在运行以下代码来与启用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时,如何解决覆盖凭证缓存的问题。

由于

1 个答案:

答案 0 :(得分:1)

您的Java代码明确使用静态方法来设置默认,隐式,全局,JVM范围 UGI。这是人们99%的时间都需要的东西。

但是如果您需要为多个用户提供多个会话,则在客户端 - 服务器模式下,那么显然无法正常工作。请阅读Google搜索,"多个UGI" 部分下随机选择的that tutorial。然后自己做一些研究。

如果你想深入了解脏实现细节,你可能会看到实际维护Hadoop安全代码库(也是Spark代码库和ZK代码库)的人awe-inspiring grimoire对此并不太满意。