从集群外部访问 hdfs

Access hdfs from outside the cluster

我在 aws 上有一个 hadoop 集群,我试图通过 hadoop 客户端从集群外部访问它。我可以成功 hdfs dfs -ls 并查看所有内容,但是当我尝试 putget 文件时,我收到此错误:

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>

我发现了类似的问题,但找不到解决方案。

你通过 SSH 连接到那台机器怎么样?

我知道这是一个非常糟糕的想法,但要完成工作,您可以先使用scp将该文件复制到机器上,然后通过 SSH 进入 cluster/master 并在复制的本地文件上执行 hdfs dfs -put

您也可以通过脚本自动执行此操作,但同样,这只是暂时完成工作。

等别人回答才知道正确方法!

运行ning hadoop fs -get 时我的集群遇到了类似的问题,我可以解决它。只需使用本地主机的 FQDN(完全限定域名)检查您的所有数据节点是否可解析。在我的例子中,nc 命令成功地使用了数据节点的 IP 地址,但没有使用主机名。 运行 下面的命令: 因为我在 cat /<host list file>;执行 nc -vz $i 50010;完毕 50010 是默认数据节点端口

当你 运行 任何 hadoop 命令时,它会尝试使用 FQDN 连接到数据节点,这就是它给出这个奇怪的 NPE 的地方。

执行下面的导出和 运行 你的 hadoop 命令 导出 HADOOP_ROOT_LOGGER=调试,控制台

当它试图连接到任何数据节点进行数据传输时,你会看到这个 NPE。

我有一个 java 代码,它也在使用 API 执行 hadoop fs -get,异常更清晰

java.lang.Exception: java.nio.channels.UnresolvedAddressException

如果这对您有帮助,请告诉我。