为什么Hadoop hftp会提供目录而不提供文件?

时间:2012-12-18 17:13:52

标签: hadoop filesystems

我正在尝试使用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无法提供文件吗?

1 个答案:

答案 0 :(得分:1)

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

此处详细解释了Everythning: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>