0

Kerberos で保護された Apache Knox を介して保護された Webhdfs を介して HDFS にアクセスする Spring ブート アプリケーションがあります。Knox プロキシ プレフィックスを含むように URL を変更するだけのサブクラスとして、KnoxWebHdfsFileSystemカスタム スキーム ( swebhdfsknox ) を使用して独自のスキームを作成しました。WebHdfsFilesystemしたがって、フォームからのリクエストを効果的に再マッピングします。

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

ノックスのものに:

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

これを行うには、次の 2 つのメソッドをオーバーライドします。

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

ここまでは順調ですね。私はSpring Bootに作成させ、 list filesmkdirFsShellなどのさまざまな操作に使用しました。すべて正常に動作します。文書化されているように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 にアップロードされます。

4

1 に答える 1

2

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

これは対処すべきロードマップにある問題であり、外部からリソースにアクセスするだけでなく、クラスター内で関心が高まることで、より熱くなる可能性があります。

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

気軽に見て、テストや開発に手を貸してください - それは大歓迎です!

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

于 2016-05-05T01:36:24.823 に答える