2016-05-03 4 views
0

Kerberosで保護されたApache Knoxでセキュリティ保護されたWebhdfsでHDFSにアクセスするSpringブートアプリケーションがあります。カスタムスキーム(swebhdfsknox)を持つ自分自身のKnoxWebHdfsFileSystemを、WebHdfsFilesystemのサブクラスとして作成しました.Nooxプロキシプレフィックスを含むようにURLを変更するだけです。ノックス1へ春のブートHadoop、Webhdfs、Apache 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)

これまでのところとても良いです。私は春のブートは私のためにFsShellを作成し、リストファイル,mkdirなどのような様々な操作のためにそれを使用してください。 copyFromLocalを除き、文書化されているので2ステップが必要であり、リダイレクトします。そして、ファイルシステムが場所で、それはエラーで失敗しヘッダを受け、最終的な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にアップロードされます。

答えて

2

これはKnoxのkerberos用HadoopAuthプロバイダを使用してApache Knoxに対して既存のHadoopクライアントを使用する際の既知の問題です。あなたがカールや他のいくつかのRESTクライアントを使用するなら、おそらくあなたのために働くでしょう。既存のHadoop Javaクライアントは、送信ステップのPUTと通信しているDataNodeからのSPNEGOチャレンジを期待していません。 DataNodeは、最初のステップでNameNodeによって発行されたブロックアクセストークン/委任トークンが存在することを期待しています。ただし、Knoxゲートウェイは、そのトポロジへのすべての要求に対してSPNEGO認証を要求します。

これはロードマップ上の問題であり、外部からリソースにアクセスするのではなく、クラスタ内でより多くの関心が寄せられるようになってきています。

次JIRAこのアイテムを追跡し、あなたが同様のユースケースであるDistCpに関連しているタイトルからもわかるとおり https://issues.apache.org/jira/browse/KNOX-482

を見て、テストまたは開発に手を貸す気軽に - それはすべてが大歓迎です!

もう1つの可能性は、Hadoop Javaクライアントを変更してDataNodeのSPNEGOチャレンジを処理することです。

+0

非常に同じ結論になっています。洞察に感謝します! –

関連する問題