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 代码库) 对此不太高兴。
我运行按照代码与启用了 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 代码库) 对此不太高兴。