2016-07-19 3 views
0

Я запускаю следующий код для взаимодействия с кластером hasoop, включенным в kerberos.Kerberos Java Credentials Cache

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("[email protected]", "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("[email protected]", "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 \ имя пользователя, но я не нашел. 2. Как я могу решить эту проблему кеширования избыточных писем, когда несколько пользователей пытаются получить доступ к хаоу за раз.

Благодаря

+1

Если вы были ** не **, используя API Hadoop, я бы предложил вам ** RTFM **> для глобальных настроек Kerberos, ср. http://web.mit.edu/kerberos/krb5-1.12/doc/basic/ccache_def.html и 'KRB5CCNAME' env variable> для настроек Java, ср. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/tutorials/AcnOnly.html –

ответ

0

Ваш код Java явно использует статические методы установить по умолчанию, неявный, глобальный, JVM шириной уги. Это то, что нужно людям в 99% случаев.

Но Если вам нужно обслуживать несколько сеансов для нескольких пользователей в режиме клиент-сервер, то ясно, что это невозможно. Пожалуйста, прочитайте that tutorial, выбранный случайным образом при поиске Google, в разделе «Несколько UGI». Затем сделайте некоторое исследование самостоятельно.

Если вы хотите, чтобы копаться в грязные детали реализации, вы можете заглянуть в эту awe-inspiring grimoire по парню, который на самом деле поддерживает код безопасности базы Hadoop (также коды базы Спарка и основание ZK код) и не слишком счастлив об этом.

+0

Я использовал loginUserFromKeytabAndReturnUGI этот метод. Но я получаю следующее исключение Исключение из потока «Thread-1» Исключение в потоке «Thread-2» java.io.IOException: Не удалось локальное исключение: java.io.IOException: javax.security.sasl.SaslException: GSS инициация не выполнена [Вызывается GSSException: нет действительных учетных данных (уровень механизма: не удалось найти какой-либо Kerberos tgt)]; Сведения о хосте: локальный хост: «my-pc/192.168.23.53»; хост назначения: «example.com»: 8020; – user3313379

+1

Посмотрите на GitBook * (ссылка выше под надписью «grimoire») * для раздела ** _ Низкоуровневые секреты _ ** >> как включить режим отладки; также просматривайте разделы ** _ Ошибки _ ** и ** _ Terrors _ ** для получения сборника сообщений об ошибках и обходных путей. –

+1

Кроме того, поскольку вы хотите использовать несколько учетных данных Kerberos в одном и том же приложении, с UGI не по умолчанию, вы должны использовать ** определенные ** методы. Ср когда он говорит * «Это делается с помощью метода ** doAs (** PrivilegedAction action **) ** в UGI». * –

Смежные вопросы