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)
使用 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。
| 归档时间: |
|
| 查看次数: |
2730 次 |
| 最近记录: |