使用Java代码和Hadoop Java
API打开一个以Kerberized进行的会话,获取该会话的委派令牌,然后将该Token传递给另一个应用程序(如@tellisnz所建议的那样)有一个缺点:Java
API需要 很多资源依赖关系 (即很多JAR,以及Hadoop本机库)。尤其是如果您在Windows上运行应用程序,这将是一个艰难的过程。
另一个选择是使用Java代码和WebHDFS来运行单个SPNEGOed查询并 获取 委托令牌,然后将其传递给另一个应用程序-该选项
在服务器上完全不需要Hadoop库 。准系统版本会像
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() ;这就是我用来从Windows
Powershell脚本(甚至是Excel宏)访问HDFS的方式。注意:在Windows中,必须通过将指向适当的keytab文件的JAAS配置传递给JVM,来动态创建Kerberos
TGT。但是无论如何,该警告也适用于Java API。



