生产环境用到的是 HDP 3.1.0 版本的Hadoop(3.3.1),在使用中发现,无论是hdfs还是yarn和jobhistory,它们的web ui的log页面都无法打开,会提示报错,如下图:

hadoop打不开jps hadoop打不开 UI_ui

yarn: 

hadoop打不开jps hadoop打不开 UI_hadoop_02

(这里用开启了knox的代理路径)

摸不着头绪,先看下konx日志:

hadoop打不开jps hadoop打不开 UI_yarn_03

 没报出特殊的异常,说明不是knox的问题,从组件入手进行排查

再看下hadoop的日志吧:

hadoop打不开jps hadoop打不开 UI_hadoop_04

 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打不开jps hadoop打不开 UI_大数据_05

 其中hadoop-policy的若干选项,在官网查阅和尝试改动后,没有效果。

dfs.cluster.administrators 这个配置跟admin.acl 很相关。在官网查下它的内容:

hadoop打不开jps hadoop打不开 UI_ui_06

 大概意思就是通过配置该项,来筛选哪个用户或者用户组对hadoop有admin权限。

环境上已经配置的是hdfs,我们直接修改为 * ,再重启看下:

hadoop打不开jps hadoop打不开 UI_大数据_07

 

可以实现 web ui中log页面的访问了。

同理,yarn和jobhistory应该都是类似的问题。

找下yarn的配置项:

hadoop打不开jps hadoop打不开 UI_大数据_08

 其中的yarn.admin.acl就是要修改的地方,把它也改成 * 号(注:后续在使用中发现,只改成 yarn,konx 就可以了,不用必须改为*号)

重启yarn后:

hadoop打不开jps hadoop打不开 UI_hadoop_09

 

找下jobhistory的配置项,同理改成mapred,knox即可:

hadoop打不开jps hadoop打不开 UI_yarn_10

 重启后,如下:

hadoop打不开jps hadoop打不开 UI_ui_11

至此,log无法访问的问题就解决了,但是还有个遗漏的问题就是,hdfs的administror改成*才可以访问到log,改成hdfs,knox等方式依旧不行,这个还需要再研究一下。