starrycheng 发表于 2013-10-25 10:44:36

解决hadoop 0.21.0 web下载文件失败的BUG

坛子里面有一位朋友提出过这个,详见贴"
后面我也遇到了相同的,找了很多方法,都无法解决,最后和同事分析源代码才找到了的原因。
先说一下解决方法吧。
在hadoop0.21.0的源文件路径下找到这个文件:
/org/apache/hadoop/hdfs/server/namenode/StreamFile.java
找到方法getDFSClient(),把其中的 name.conf 改成 datanode.conf,效果如下:
[*] /** getting a client for connecting to dfs */
[*]protected DFSClient getDFSClient(HttpServletRequest request)
[*]      throws IOException, InterruptedException {
[*]    final Configuration conf =
[*]      (Configuration) getServletContext().getAttribute("datanode.conf");
[*]   
[*]    UserGroupInformation ugi = getUGI(request, conf);
[*]    DFSClient client = ugi.doAs(new PrivilegedExceptionAction() {
[*]      @Override
[*]      public DFSClient run() throws IOException {
[*]      return new DFSClient(nameNodeAddr, conf);
[*]      }
[*]    });
[*]   
[*]    return client;
[*]}
[*]复制代码
然后把这个类重新编译并更新到 $HADOOP_HOME/hadoop-hdfs-0.21.0.jar文件中(注意更新前备份原文件)
然后重新启动集群即可。
原因:
分析异常栈可以发现,是由于StreamFile在取name.conf的时候,取到的是一个空对象。而实际上,我们请求
的是DN,DN在启动的时候其httpserver(变量infoserver)根本没有设置name.conf属性而设置了datanode.conf属性!
查看源码会发现,其实NN和DN加载的conf其实是一样的,我们只需要把name.conf改成datanode.conf即可!

xiaolongwu1987 发表于 2013-10-25 10:44:36

我现在奇怪的是,新部署的hadoop 0.21.0却不报这个错误,完全正常使用,很奇怪。。。

atsky123 发表于 2013-10-25 10:44:36

回复 2# liw_goldgov
我重装过好几次了,一点下载就抛异常~~~
但是为嘛你出现时好时坏我就不清楚了,为毛吗?吗?吗?吗?
页: [1]
查看完整版本: 解决hadoop 0.21.0 web下载文件失败的BUG