У меня есть рабочее приложение для управления HDFS с использованием WebHDFS. Мне нужно сделать это на защищенном Kerberos кластере.
Проблема в том, что нет библиотеки или расширения для согласования билета для моего приложения, у меня есть только базовый HTTP-клиент.
Возможно ли создать Java-сервис, который будет обрабатывать обмен билета, и как только он получит билет службы, чтобы просто передать его в приложение для использования в HTTP-запросе? Другими словами, мое приложение попросит службу Java договориться о билетах, и оно вернет билет службы обратно в мое приложение в строке или необработанной строке, и приложение просто привяжет его к HTTP-запросу?
EDIT: Есть ли подобное подобное решение, такое как @SamsonScharfrichter, описанное для HTTPfs? (Насколько мне известно, он не поддерживает токены делегаций)
EDIT2: Привет, ребята, я все еще полностью потерян. Я пытаюсь найти клиента Hadoop-auth без везения. Не могли бы вы помочь мне снова? Я уже часами читал об этом без везения. Примеры говорят, чтобы сделать это:
* // establishing an initial connection
*
* URL url = new URL("http://foo:8080/bar");
* AuthenticatedURL.Token token = new AuthenticatedURL.Token();
* AuthenticatedURL aUrl = new AuthenticatedURL();
* HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection();
* ....
* // use the 'conn' instance
* ....
Я потерял уже здесь. Какое начальное соединение мне нужно? Как
new AuthenticatedURL(url, token).openConnection();
взять два параметра? для такого случая не существует конструктора. (из-за этого возникает ошибка). Не должен ли кто-нибудь указать кого-нибудь? Вероятно, это будет не так просто.
URL url = new URL("http://<host>:14000/webhdfs/v1/?op=liststatus");
AuthenticatedURL.Token token = new AuthenticatedURL.Token();
HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection(url, token);
Используя Java-код плюс API-интерфейс Hadoop для открытия сеанса Kerberized, получите токен делегирования для сеанса и передайте этот токен другому приложению - как было предложено @tellisnz - имеет недостаток: Java API требует довольно много зависимостей (т.е. много JAR, а также родные библиотеки Hadoop). Если вы запустите приложение в Windows, в частности, это будет непростая поездка.
Другим вариантом является использование Java-кода плюс WebHDFS для запуска одного запроса SPNEGOed и получения идентификатора делегирования, а затем передачи его другому приложению - для этого параметра требуется абсолютно не библиотека Hadoop на вашем сервере, Версия barebones будет выглядеть как
URL urlGetToken = new URL("http://<host>:<port>/webhdfs/v1/?op=GETDELEGATIONTOKEN") ;
HttpURLConnection cnxGetToken =(HttpURLConnection) urlGetToken.openConnection() ;
BufferedReader httpMessage = new BufferedReader( new InputStreamReader(cnxGetToken.getInputStream()), 1024) ;
Pattern regexHasToken =Pattern.compile("urlString[\": ]+(.[^\" ]+)") ;
String httpMessageLine ;
while ( (httpMessageLine =httpMessage.readLine()) != null)
{ Matcher regexToken =regexHasToken.matcher(httpMessageLine) ;
if (regexToken.find())
{ System.out.println("Use that template: http://<Host>:<Port>/webhdfs/v1%AbsPath%?delegation=" +regexToken.group(1) +"&op=...") ; }
}
httpMessage.close() ;
Это то, что я использую для доступа к HDFS из Windows Powershell script (или даже макроса Excel). Предостережение: с Windows вы должны создать свой Kerberos TGT на лету, передав JVM конфигурацию JAAS, указывающую на соответствующий файл keytab. Но это оговорку также применимо к API Java.
Вы можете взглянуть на клиент hadoop-auth и создать сервис, который выполняет первое подключение, тогда вы, возможно, сможете захватить заголовки "Authorization" и "X-Hadoop-Delegation-Token" и cookie из него и добавьте его в ваши основные клиентские запросы.
Сначала вам нужно будет либо использовать kinit для аутентификации вашего пользователя для приложения перед запуском. В противном случае вам нужно будет сделать логин JAAS для вашего пользователя, этот учебник дает довольно хороший обзор того, как это сделать.
Затем, чтобы выполнить вход в WebHDFS/HttpFS, нам нужно сделать что-то вроде:
URL url = new URL("http://youhost:8080/your-kerberised-resource");
AuthenticatedURL.Token token = new AuthenticatedURL.Token();
HttpURLConnection conn = new AuthenticatedURL().openConnection(url, token);
String authorizationTokenString = conn.getRequestProperty("Authorization");
String delegationToken = conn.getRequestProperty("X-Hadoop-Delegation-Token");
...
// do what you have to to get your basic client connection
...
myBasicClientConnection.setRequestProperty("Authorization", authorizationTokenString);
myBasicClientConnection.setRequestProperty("Cookie", "hadoop.auth=" + token.toString());
myBasicClientConnection.setRequestProperty("X-Hadoop-Delegation-Token", delegationToken);