Kerberos で保護された Apache Knox を介して保護された Webhdfs を介して HDFS にアクセスする Spring ブート アプリケーションがあります。Knox プロキシ プレフィックスを含むように URL を変更するだけのサブクラスとして、KnoxWebHdfsFileSystem
カスタム スキーム ( swebhdfsknox ) を使用して独自のスキームを作成しました。WebHdfsFilesystem
したがって、フォームからのリクエストを効果的に再マッピングします。
http://host:port/webhdfs/v1/...
ノックスのものに:
http://host:port/gateway/default/webhdfs/v1/...
これを行うには、次の 2 つのメソッドをオーバーライドします。
public URI getUri()
URL toUrl(Op op, Path fspath, Param<?, ?>... parameters)
ここまでは順調ですね。私はSpring Bootに作成させ、 list files、mkdirFsShell
などのさまざまな操作に使用しました。すべて正常に動作します。文書化されているように2つのステップとリダイレクトが必要なcopyFromLocalを除きます。そして、ファイルシステムがLocationヘッダーで受信した最終 URL にアクセスしようとする最後のステップで、次のエラーで失敗します。PUT
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 にアップロードされます。