我正在运行以下代码来与启用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时,如何解决覆盖凭证缓存的问题。
由于
答案 0 :(得分:1)
您的Java代码明确使用静态方法来设置默认,隐式,全局,JVM范围 UGI。这是人们99%的时间都需要的东西。
但是如果您需要为多个用户提供多个会话,则在客户端 - 服务器模式下,那么显然无法正常工作。请阅读Google搜索,"多个UGI" 部分下随机选择的that tutorial。然后自己做一些研究。
如果你想深入了解脏实现细节,你可能会看到实际维护Hadoop安全代码库(也是Spark代码库和ZK代码库)的人awe-inspiring grimoire。 对此并不太满意。