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

1. 原因分析

1.1 hiveserver2.jsp

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

<%

Collection hiveSessions = sessionManager.getSessions();

int sessionCount = 0;

for (HiveSession hiveSession: hiveSessions) {

// Permission check

if (!HttpServer.hasAccess(remoteUser, hiveSession.getUserName(), ctx, request)) {

continue;

}

sessionCount++;

%>

<%= hiveSession.getUserName() %>

<%= hiveSession.getIpAddress() %>

<%= hiveSession.getOpenOperationCount() %>

<%= (currentTime - hiveSession.getCreationTime())/1000 %>

<%= (currentTime - hiveSession.getLastAccessTime())/1000 %>

<%

}

%>

从 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 把判断条件去掉

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: