我在aws上有一个hadoop集群,我试图通过hadoop客户端从集群外部访问它。我可以成功hdfs dfs -ls
并查看所有内容,但当我尝试put
或get
文件时,我收到此错误:
Exception in thread "main" java.lang.NullPointerException
at org.apache.hadoop.fs.FsShell.displayError(FsShell.java:304)
at org.apache.hadoop.fs.FsShell.run(FsShell.java:289)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at org.apache.hadoop.fs.FsShell.main(FsShell.java:340)
我的群集和本地计算机都安装了hadoop 2.6.0。我已将群集的conf文件复制到本地计算机,并在hdfs-site.xml中提供了这些选项(以及其他一些选项)。
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
我的core-site.xml在群集和客户端中都包含一个属性:
<property>
<name>fs.defaultFS</name>
<value>hdfs://public-dns:9000</value>
<description>NameNode URI</description>
</property>
我发现了类似的问题,但无法找到解决方案。
答案 0 :(得分:0)
你怎么用SSH连接到那台机器?
我知道这是一个非常糟糕的想法,但为了完成工作,您可以先使用scp
在计算机上复制该文件,然后通过SSH连接到该群集/主服务器并执行{ {1}}复制了本地文件。
您也可以通过脚本自动执行此操作,但这只是为了让您现在完成工作。
等待别人回答才知道正确的方法!
答案 1 :(得分:0)
运行hadoop fs -get时,我的群集出现了类似的问题,我可以解决它。只需使用本地主机的FQDN(完全限定域名)检查所有数据节点是否可解析。在我的情况下,nc命令成功使用数据节点的IP地址但不使用主机名。
在命令下运行:
我在cat /<host list file>
;做nc -vz $ i 50010; DONE
50010是默认的datanode端口
当你运行任何hadoop命令时,它会尝试使用FQDN连接到数据节点,那就是它给出了这个奇怪的NPE。
执行以下导出并运行hadoop命令 export HADOOP_ROOT_LOGGER = DEBUG,console
当您尝试连接到任何数据节点进行数据传输时,您会看到此NPE。
我有一个java代码,它也使用API做hadoop fs -get,在那里,异常更清晰
java.lang.Exception:java.nio.channels.UnresolvedAddressException
如果这有助于您,请告诉我。