当前位置: 首页 > 面试题库 >

在没有SPnego的情况下访问由kerberos保护的WebHDFS

能烨华
2023-03-14
问题内容

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

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

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

编辑:是否为HTTPfs描述了类似@SamsonScharfrichter的优雅解决方案?(据我所知,它不支持委托令牌)

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代码和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。



 类似资料:
  • 我有一个使用webhdfs管理HDFS的工作应用程序。我需要能够在Kerberos安全集群上执行此操作。 问题是,没有库或扩展来协商我的应用程序的票,我只有一个基本的HTTP客户端。 是否可以创建一个Java服务来处理票证交换,并且一旦它获得服务票证,就将其传递给应用程序以在HTTP请求中使用?换句话说,我的应用程序会要求Java服务协商票证,它会将服务票证以字符串或原始字符串的形式返回给我的应用

  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 问题内容: 我可以在没有jQuery的情况下访问数据属性吗? 使用jQuery很容易,但是如果没有jQuery,我在任何地方都看不到该怎么做。 如果我在Google上搜索“没有jQuery”,那么我得到的只是jQuery示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。

  • 问题内容: 当然,这个问题可能不是树莓派所特有的。另外,我对Linux还比较陌生。 我想编写一个小库(在node.js中,如果有关系的话),以使用sysfs访问树莓派的GPIO。但是,访问sysfs需要sudo访问,这很明显是有原因的。 Quick2Wire似乎有解决方案,但我想更好地理解它,而不仅仅是盲目使用。他们当然使用了C,但是据我了解,代码并不复杂,即使不那么优雅,也可以仅使用bash即可

  • 我正在开发一个服务器端应用程序,即RESTAPI。用户可以通过这个API将自己手工制作的客户端的数据发布到我们自己的系统中。当然,我会记录数据的格式。但我的问题是,使用OAuth2实现身份验证是明智之举,还是我最好只使用SSL基本身份验证路由?若然,原因为何?我在谷歌上搜索了大量关于OAuth2的帖子和指南,如果不是他们正在处理的客户端,那就是Spring Security组合,我发现它很难遵循,

  • 我在项目中定义了一个模型类。和往常一样,它有一些私有变量和公共的获取者和设置者 假设在其他类中我使用这个模型,就像 然后person的私有变量保存值“my name”,我使用类的public getter访问变量,如 所以据我所知的人。getMark()返回私有变量名的引用,因此如果我修改局部变量“localMark”,它将影响Person类的私有变量,因此它会破坏变量的私有属性 前任: 我猜大多