开启 kerberos 后,HiveServer2 的 webui 没有内容的解决方案

开启 kerberos 后,HiveServer2 的 webui 没有内容。页面如下,可以打开,但是即便已经有会话,也有SQL执行,这里一直这样。

1. 原因分析

1.1 hiveserver2.jsp

以Active Sessions 的内容为例,./service/src/resources/hive-webapps/hiveserver2/hiveserver2.jsp 的内容如下:

<%
Collection<HiveSession> hiveSessions = sessionManager.getSessions();
int sessionCount = 0;
for (HiveSession hiveSession: hiveSessions) {
    // Permission check
    if (!HttpServer.hasAccess(remoteUser, hiveSession.getUserName(), ctx, request)) {
        continue;
    }
    sessionCount++;
%>
    <tr>
        <td><%= hiveSession.getUserName() %></td>
        <td><%= hiveSession.getIpAddress() %></td>
        <td><%= hiveSession.getOpenOperationCount() %></td>
        <td><%= (currentTime - hiveSession.getCreationTime())/1000 %></td>
        <td><%= (currentTime - hiveSession.getLastAccessTime())/1000 %></td>
    </tr>
<%
}
%>

从 sessionManager 获取了所有的 session,每个 session 进行判断 HttpServer.hasAccess 是否为true,如果为 true 则输出一行。

1.2 hasAccess 的代码如下:

先判断是否相等,remoteUser 是浏览器传递的用户,如果浏览器所在的电脑安装并配置 kerberos-client,则能正确的传递用户,否则是 null。
参考文档:
Activating the Hive Web UI
Windows 系统的配置链接

public static boolean hasAccess(String remoteUser, String user,
      ServletContext ctx, HttpServletRequest request) throws IOException {
    return StringUtils.equalsIgnoreCase(remoteUser, user) ||
        HttpServer.hasAdministratorAccess(ctx, request, null);
  }

1.3 hasAdministratorAccess 代码如下:

如果参数 CommonConfigurationKeys.HADOOP_SECURITY_AUTHORIZATION = false,则直接返回 true。否则进行用户判断。

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) {
      if (response != null) {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                           "Unauthenticated users are not " +
                           "authorized to access this page.");
      }
      return false;
    }

    if (servletContext.getAttribute(ADMINS_ACL) != null &&
        !userHasAdministratorAccess(servletContext, remoteUser)) {
      if (response != null) {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "User "
            + remoteUser + " is unauthorized to access this page.");
      }
      return false;
    }

    return true;
  }

2. 解决方案

2.1 hiveserver2-site.xml 配置

hiveserver2-site.xml 配置 hadoop.security.authorization=false
不能改 core-site.xml, 因为 core-site.xml 的配置影响所有的组件。而 hiveserver2-site.xml 仅影响 hiveserver2,并且 hive
authorization 由参数 hive.security.authorization.enabled 控制。

2.2 配置好 web-ui 和客户端的 kerberos

2.3 修改 hiveserver2.jsp 把判断条件去掉

你可能感兴趣的:(hive,hive)