坛子里面有一位朋友提出过这个后面我也遇到了相同的,找了很多方法,都无法解决,最后和同事分析源代码才找到了的原因。
先说一下解决方法吧。
在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