无需 SPnego 即可访问 kerberos 保护的 WebHDFS

MaB*_*aBu 2 java hadoop kerberos webhdfs

我有一个使用 WebHDFS 管理 HDFS 的工作应用程序。我需要能够在 Kerberos 安全集群上执行此操作。

问题是,没有库或扩展来协商我的应用程序的票证,我只有一个基本的 HTTP 客户端。

是否可以创建一个 Java 服务来处理票证交换,并且一旦获得服务票证就将其传递给应用程序以在 HTTP 请求中使用?换句话说,我的应用程序会要求 Java 服务协商票证,然后它将服务票证以字符串或原始字符串形式返回给我的应用程序,而应用程序只需将其附加到 HTTP 请求?

编辑:是否有像 @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
* ....
Run Code Online (Sandbox Code Playgroud)

我已经在这里迷路了。我需要什么初始连接?怎么能

new AuthenticatedURL(url, token).openConnection();
Run Code Online (Sandbox Code Playgroud)

取两个参数?对于这种情况没有构造函数。(我因此而出错)。主体不应该在某个地方指定吗?这可能不会那么容易。

    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);
Run Code Online (Sandbox Code Playgroud)

Sam*_*ter 5

使用 Java 代码加上 Hadoop Java API 打开 Kerberized 会话,获取会话的委托令牌,并将该令牌传递给其他应用程序(如 @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() ;
Run Code Online (Sandbox Code Playgroud)

这就是我用来从 Windows Powershell 脚本(甚至是 Excel 宏)访问 HDFS 的方法。警告:对于 Windows,您必须通过向 JVM 传递指向相应密钥表文件的 JAAS 配置来动态创建 Kerberos TGT。但无论如何,这一警告也适用于 Java API。