2

我正在尝试使用 distcp 将文件从一个集群移动到另一个集群,使用他们的说明中指定的 hftp 协议。

我可以通过 hftp 读取目录,但是当我尝试获取文件时,我得到 500(内部服务器错误)。为了消除网络和防火墙问题的可能性,我在源服务器上使用了 hadoop fs -ls 和 hadoop fs -cat 命令来试图找出这个问题。

这提供了文件的目录:

hadoop fs -ls logfiles/day_id=19991231/hour_id=1999123123
-rw-r--r--   3 username supergroup        812 2012-12-16 17:21 logfiles/day_id=19991231/hour_id=1999123123/000008_0

这给了我一个“找不到文件”错误,它应该是因为文件不存在:

hadoop fs -cat hftp://hserver.domain.com:50070/user/username/logfiles/day_id=19991231/hour_id=1999123123/000008_0x
cat: `hftp://hserver.domain.com:50070/user/username/logfiles/day_id=19991231/hour_id=1999123123/000008_0x': No such file or directory

这一行给了我一个 500 内部服务器错误。该文件在服务器上得到确认。

hadoop fs -cat hftp://hserver.domain.com:50070/user/username/logfiles/day_id=19991231/hour_id=1999123123/000008_0
cat: HTTP_OK expected, received 500

这是我尝试执行此操作时 distcp 记录的堆栈跟踪:

java.io.IOException: HTTP_OK expected, received 500
    at org.apache.hadoop.hdfs.HftpFileSystem$RangeHeaderUrlOpener.connect(HftpFileSystem.java:365)
    at org.apache.hadoop.hdfs.ByteRangeInputStream.openInputStream(ByteRangeInputStream.java:119)
    at org.apache.hadoop.hdfs.ByteRangeInputStream.getInputStream(ByteRangeInputStream.java:103)
    at org.apache.hadoop.hdfs.ByteRangeInputStream.read(ByteRangeInputStream.java:187)
    at java.io.DataInputStream.read(DataInputStream.java:83)
    at org.apache.hadoop.tools.DistCp$CopyFilesMapper.copy(DistCp.java:424)
    at org.apache.hadoop.tools.DistCp$CopyFilesMapper.map(DistCp.java:547)
    at org.apache.hadoop.tools.DistCp$CopyFilesMapper.map(DistCp.java:314)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:393)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:327)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.mapred.Child.main(Child.java:262)

有人能告诉我为什么 hftp 无法提供文件吗?

4

1 回答 1

1

我遇到了同样的问题,最终找到了解决方案。

一切都在这里详细解释:http ://www.swiss-scalability.com/2015/01/hadoop-hftp-returns-error-httpok.html

但简而言之,我们可能将 NameNode RPC 绑定到通配符地址(即 dfs.namenode.rpc-address 指向接口的 IP,而不是 0.0.0.0)。

不适用于 HFTP:

<property>
    <name>dfs.namenode.rpc-address</name>
    <value>0.0.0.0:8020</value>
</property>

与 HFTP 一起使用:

<property>
    <name>dfs.namenode.rpc-address</name>
    <value>10.0.1.2:8020</value>
</property>
于 2015-01-06T14:18:11.940 回答