生产环境用到的是 HDP 3.1.0 版本的Hadoop(3.3.1),在使用中发现,无论是hdfs还是yarn和jobhistory,它们的web ui的log页面都无法打开,会提示报错,如下图:
yarn:
(这里用开启了knox的代理路径)
摸不着头绪,先看下konx日志:
没报出特殊的异常,说明不是knox的问题,从组件入手进行排查
再看下hadoop的日志吧:
sysadmin用户是生产环境的系统账户,其他的页面都可以显示,为什么就 logs无法显示,
找到一篇相关问题,提供了思路:
大概方向就是权限方面的问题,只是没有一个准确的提示。
从日志入手,看下源码有没有相关的线索:
在hadoop-commen 的 src/main/java/org/apache/hadoop/http/HttpServer2.java 中,可以看到日志中的报错的部分:
/**
* Does the user sending the HttpServletRequest has the administrator ACLs? If
* it isn't the case, response will be modified to send an error to the user.
*
* @param response used to send the error response if user does not have admin access.
* @return true if admin-authorized, false otherwise
* @throws IOException
*/
public static boolean hasAdministratorAccess(
ServletContext servletContext, HttpServletRequest request,
HttpServletResponse response) throws IOException {
Configuration conf =
(Configuration) servletContext.getAttribute(CONF_CONTEXT_ATTRIBUTE);
// If there is no authorization, anybody has administrator access.
if (!conf.getBoolean(
CommonConfigurationKeys.HADOOP_SECURITY_AUTHORIZATION, false)) {
return true;
}
String remoteUser = request.getRemoteUser();
if (remoteUser == null) {
response.sendError(HttpServletResponse.SC_FORBIDDEN,
"Unauthenticated users are not " +
"authorized to access this page.");
return false;
}
if (servletContext.getAttribute(ADMINS_ACL) != null &&
!userHasAdministratorAccess(servletContext, remoteUser)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN,
"Unauthenticated users are not " +
"authorized to access this page.");
LOG.warn("User " + remoteUser + " is unauthorized to access the page "
+ request.getRequestURI() + ".");
return false;
}
return true;
}
推测是我们的这个访问用户sysadmin 跟admin_acl策略不匹配,所以拒绝访问。
到管理界面中找找 admin.acl 相关的配置:
其中hadoop-policy的若干选项,在官网查阅和尝试改动后,没有效果。
而 dfs.cluster.administrators 这个配置跟admin.acl 很相关。在官网查下它的内容:
大概意思就是通过配置该项,来筛选哪个用户或者用户组对hadoop有admin权限。
环境上已经配置的是hdfs,我们直接修改为 * ,再重启看下:
可以实现 web ui中log页面的访问了。
同理,yarn和jobhistory应该都是类似的问题。
找下yarn的配置项:
其中的yarn.admin.acl就是要修改的地方,把它也改成 * 号(注:后续在使用中发现,只改成 yarn,konx 就可以了,不用必须改为*号)
重启yarn后:
找下jobhistory的配置项,同理改成mapred,knox即可:
重启后,如下:
至此,log无法访问的问题就解决了,但是还有个遗漏的问题就是,hdfs的administror改成*才可以访问到log,改成hdfs,knox等方式依旧不行,这个还需要再研究一下。