gpt4 book ai didi

java - Spring boot Hadoop、Webhdfs 和 Apache Knox

转载 作者:可可西里 更新时间:2023-11-01 16:30:14 28 4
gpt4 key购买 nike

我有一个 Spring 引导应用程序,它通过 Webhdfs 访问 HDFS,该 Webhdfs 由 Kerberos 保护的 Apache Knox 保护。我创建了自己的 KnoxWebHdfsFileSystem使用自定义方案 (swebhdfsknox) 作为 WebHdfsFilesystem 的子类它只会更改 URL 以包含 Knox 代理前缀。所以它有效地重新映射来自表单的请求:

http://host:port/webhdfs/v1/...

诺克斯:

http://host:port/gateway/default/webhdfs/v1/...

我通过覆盖两个方法来做到这一点:

  1. public URI getUri()
  2. URL toUrl(Op op, Path fspath, Param<?, ?>... parameters)

到目前为止一切顺利。我让 spring boot 创建 FsShell对我来说并将它用于各种操作,例如列出文件mkdir 等。一切正常。除了 copyFromLocal 外,如记录的那样需要 2 个步骤和重定向。在文件系统尝试 PUT 的最后一步到在 Location header 中收到的最终 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。

最佳答案

这是使用现有 Hadoop 客户端针对 Apache Knox 使用 Knox 上 kerberos 的 HadoopAuth 提供程序的已知问题。如果您要使用 curl 或其他一些 REST 客户端,它可能适合您。现有的 Hadoop java 客户端不期望来自 DataNode 的 SPNEGO 质询——这是发送步骤中的 PUT 正在与之交谈的内容。 DataNode 期望 NameNode 在第一步中发布的 block 访问 token /委托(delegate) token 存在。然而,Knox 网关将要求对该拓扑的每个请求进行 SPNEGO 身份验证。

这是一个在路线图上要解决的问题,随着兴趣更多地转移到集群内部,而不是仅从外部通过它访问资源,这个问题可能会变得更加热门。

下面的 JIRA 跟踪这个项目,正如你从标题中看到的与 DistCp 相关,这是一个类似的用例: https://issues.apache.org/jira/browse/KNOX-482

随时查看并帮助进行测试或开发 - 我们非常欢迎!

另一种可能性是更改 Hadoop java 客户端以处理 DataNode 的 SPNEGO 挑战。

关于java - Spring boot Hadoop、Webhdfs 和 Apache Knox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003468/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com