坛子里面有一位朋友提出过这个后面我也遇到了相同的,找了很多方法,都无法解决,最后和同事分析源代码才找到了的原因。
先说一下解决方法吧。
在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即可!
该贴被蜀山战纪编辑于2015-12-4 9:51:49