spring启动hadoop、webhdfs和apacheknox

sqougxex  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(622)

我有一个spring-boot应用程序,它通过webhdfs访问hdfs,webhdfs通过apacheknox保护,kerberos保护。我创造了我自己的 KnoxWebHdfsFileSystem 将自定义方案(swebhdfsknox)作为 WebHdfsFilesystem 它只会更改url以包含knox代理前缀。因此它可以有效地重新Map表单中的请求: http://host:port/webhdfs/v1/... 对诺克斯一号来说: http://host:port/gateway/default/webhdfs/v1/... 为此,我重写了两个方法:
public URI getUri() URL toUrl(Op op, Path fspath, Param<?, ?>... parameters) 到现在为止,一直都还不错。我让Spring Boot创造 FsShell 为我和使用它的各种操作,如列表文件,mkdir等所有工作正常。除了copyfromlocal,它需要两个步骤和重定向。最后一步,当文件系统试图 PUT 在位置标头中接收到的最终url失败,错误为:

org.apache.hadoop.security.AccessControlException: Authentication required
    at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.validateResponse(WebHdfsFileSystem.java:334) ~[hadoop-hdfs-2.6.0.jar:na]
    at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.access$200(WebHdfsFileSystem.java:91) ~[hadoop-hdfs-2.6.0.jar:na]
    at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$FsPathOutputStreamRunner$1.close(WebHdfsFileSystem.java:787) ~[hadoop-hdfs-2.6.0.jar:na]
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:54) ~[hadoop-common-2.6.0.jar:na]
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:112) ~[hadoop-common-2.6.0.jar:na]
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:366) ~[hadoop-common-2.6.0.jar:na]
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:338) ~[hadoop-common-2.6.0.jar:na]
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:302) ~[hadoop-common-2.6.0.jar:na]
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1889) ~[hadoop-common-2.6.0.jar:na]
    at org.springframework.data.hadoop.fs.FsShell.copyFromLocal(FsShell.java:265) ~[spring-data-hadoop-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.data.hadoop.fs.FsShell.copyFromLocal(FsShell.java:254) ~[spring-data-hadoop-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]

我怀疑问题出在重定向上,但不知道这里可能有什么问题。如果我通过curl执行相同的请求,文件将成功上载到hdfs。

yqkkidmi

yqkkidmi1#

这是一个已知的问题,使用现有的hadoop客户机对apacheknox使用hadoopauth provider for kerberos on knox。如果您使用curl或其他rest客户机,它可能会对您有用。现有的hadoopjava客户机不期望来自datanode的spnego质询—这正是发送步骤中的put所说的。datanode期望namenode在第一步中发出的块访问令牌/委派令牌存在。但是,knox网关将要求对该拓扑的每个请求进行spnego身份验证。
这是一个在要解决的路线图上的问题,随着兴趣更多地转移到集群内部,而不仅仅是从外部通过集群访问资源,这个问题可能会变得更加热门。
下面的jira跟踪这个项目,正如您从标题中看到的,它与distcp有关,distcp是一个类似的用例:https://issues.apache.org/jira/browse/knox-482
请随便看一看,并帮助测试或开发-这一切都将是最受欢迎的!
另一种可能是更改hadoopjava客户机,以处理datanode的spnego挑战。

相关问题