2016-12-20 2 views
0

をlocalhostに接続しますは、Java APIを使用してリモートHDFSにローカルファイルをアップロードするが、私は1ノードhdp2.5クラスタにファイルをアップロードするには、この非常に簡単なアップロード方法を持っている

Configuration conf = new Configuration(); 
FileSystem fs = FileSystem.get(new URI("webhdfs://hdsfhost:50070", conf); 
fs.copyFromLocalFile(false, true, new Path(localFilePath), new Path(hdfsPath)); 

は何が起こるかをトレース流れが正常に起動します:

  • はhdfshostに接続:50070、
  • ファイルが既に存在する場合は、チェック(なし)、
  • は、データノードに接続します。

これは失敗します.hdfshost:50075の代わりにdatanodeがlocalhost:50075であるため、「java.net.ConnectException:Connection refused」という結果に終わります。

私はHDPで以下の関連する設定があります。

  • dfs.client.use.datanode.hostname =>真
  • dfs.datanode.http.address => 0.0.0.0:50075
  • dfs.namenode.httpアドレス=> 0.0.0.0:50070

私はlocalhostの代わりにhdfshostのに使用されない理由を見つけることができなかった(および/ etc/hostsに、どちらのローカルにはオーバーライドがありませんクラスタ上でもマシンでもない)。どんな助けでも大歓迎です。

+0

データノードのマシン名は、localhost行の '/ etc/hosts'ファイルに表示されますか?その場合は、実際のマシンのアドレスを持つ行に移動してみてください。 – RealSkeptic

+1

0.0.0.0からマシンのローカルIPに変更しようとしましたか?定期的に変更されない静的IPがマシンにある場合は、問題を解決できますか? – Nico

+0

@Nico私はあなたの提案を試みましたが、実際には助けになるとは考えていませんでした(どうしてlocalhostを返すのでしょうか?)。私は間違っていると思います。コマンドhostnameがlocalhostではなく予期しているホスト名を返すと、なぜlocalhostが返されるのか不思議です。 – Guillaume

答えて

1

http-addressの設定を0.0.0.0ではなくローカルIPアドレスに変更する必要があります。 0.0.0.0はlocalhostに解決され、dfs.client.use.datanode.hostname => trueによって使用されますが、ローカルIPアドレスはDNS名に解決されてから再度hostnameによって使用されます。

私は答えとしてこれを掲示するので、解決策の理由が正しいかどうかわかりません。誰かが正確な理由を知っている場合は、コメントとして追加したり、自分の答えを編集してください。

関連する問題