Hadoop状态页面的Browse the filesystem链接无效的问题(三)
DataNode节点上
public void redirectToRandomDataNode(NameNode nn, HttpServletResponse resp)
throws IOException
{
String nodeToRedirect;
int redirectPort;
FSNamesystem fsn = nn.getNamesystem();
String datanode = fsn.randomDataNode();
if (datanode != null) {
redirectPort = Integer.parseInt(datanode.substring(datanode.indexOf(58) + 1));
nodeToRedirect = datanode.substring(0, datanode.indexOf(58));
}
else {
nodeToRedirect = nn.getHttpAddress().getHostName();
redirectPort = nn.getHttpAddress().getPort();
}
// 此处是得到服务器的名称(hostname)
String fqdn = InetAddress.getByName(nodeToRedirect).getCanonicalHostName();
String redirectLocation = "http://" + fqdn + ":" + redirectPort + "/browseDirectory.jsp namenodeInfoPort=" + nn.getHttpAddress().getPort() + "&dir=" + URLEncoder.encode("/", "UTF-8");
resp.sendRedirect(redirectLocation);
}
public Object getDependants()
{
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try
{
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
this._jspx_resourceInjector = ((ResourceInjector)application.getAttribute("com.sun.appserv.jsp.resource.injector"));
out.write(10);
out.write("\n\n\n\n \n\n\n");
NameNode nn = (NameNode)application.getAttribute("name.node");
redirectToRandomDataNode(nn, response);
out.println(ServletUtil.htmlFooter());
out.write(10);
} catch (Throwable t) {
if (!(t instanceof SkipPageException)) {
out = _jspx_out;
if ((out != null) && (out.getBufferSize() != 0))
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
从代码可以看出,当我们点击Browse the filesystem 时后台会将请求随机转发到一台DataNode节点,使用的是slaves文件中配置的服务器列表所反解的域名或主机名,而通过局域网IP未能反解出域名和主机名,所以用的是IP,这样就出问题了,解决办法有两个:视redirectToRandomDataNode方法内生成的URL而定,如果反转域名是主机名的话,你只需要修改本地HOSTS映射就可以了(推荐使用Windows Hosts Editor,软件地址:http://yymmiinngg.iteye.com/blog/360779);如果反转出的域名是主机局域网IP的话,那就需要配置slaves和masters使用域名或外网IP