Я хочу настроить аутентификацию spark web ui на EMR в соответствии с документом spark, добавив фильтр интерфейса spark. После того, как я настроил config и .jar, я не могу запустить сервер истории искров.
Как я могу включить аутентификацию или сказать спарку найти класс, который я предоставил? Я также попытался добавить путь в spark.driver.extraClassPath.
Я скомпилировал файл .jar из https://gist.github.com/neolitec/8953607, и поместил его в / usr / lib / spark / jars:
BasicAuthenticationFilter.java
package com.neolitec.examples;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.StringTokenizer;
/**
* Created by kemanson on 12/02/14.
*/
public class BasicAuthenticationFilter implements Filter {
/** Logger */
private static final Logger LOG = LoggerFactory.getLogger(BasicAuthenticationFilter.class);
private String username = "";
private String password = "";
private String realm = "Protected";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
username = filterConfig.getInitParameter("username");
password = filterConfig.getInitParameter("password");
String paramRealm = filterConfig.getInitParameter("realm");
if (StringUtils.isNotBlank(paramRealm)) {
realm = paramRealm;
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String authHeader = request.getHeader("Authorization");
if (authHeader != null) {
StringTokenizer st = new StringTokenizer(authHeader);
if (st.hasMoreTokens()) {
String basic = st.nextToken();
if (basic.equalsIgnoreCase("Basic")) {
try {
String credentials = new String(Base64.decodeBase64(st.nextToken()), "UTF-8");
LOG.debug("Credentials: " + credentials);
int p = credentials.indexOf(":");
if (p != -1) {
String _username = credentials.substring(0, p).trim();
String _password = credentials.substring(p + 1).trim();
if (!username.equals(_username) || !password.equals(_password)) {
unauthorized(response, "Bad credentials");
}
filterChain.doFilter(servletRequest, servletResponse);
} else {
unauthorized(response, "Invalid authentication token");
}
} catch (UnsupportedEncodingException e) {
throw new Error("Couldn't retrieve authentication", e);
}
}
}
} else {
unauthorized(response);
}
}
@Override
public void destroy() {
}
private void unauthorized(HttpServletResponse response, String message) throws IOException {
response.setHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\"");
response.sendError(401, message);
}
private void unauthorized(HttpServletResponse response) throws IOException {
unauthorized(response, "Unauthorized");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>basicAuthenticationFilter</filter-name>
<filter-class>com.neolitec.examples.BasicAuthenticationFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>motdepasse</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>basicAuthenticationFilter</filter-name>
<url-pattern>/admin.jsp</url-pattern>
</filter-mapping>
</web-app>
Я также добавил конфигурацию в / etc/spark/conf/spark-defaults.conf для spark.ui.filters com.neolitec.examples.BasicAuthenticationFilter spark.com.neolitec.examples.BasicAuthenticationFilter.params user = user, password = abcd1234, realm = some
Ниже приведен журнал сообщений об ошибках после перезапуска сервера spark-history
19/10/31 09:31:42 WARN BaseHolder:
java.lang.ClassNotFoundException: com.bdp.BasicAuthenticationFilter
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.spark_project.jetty.util.Loader.loadClass(Loader.java:86)
at org.spark_project.jetty.servlet.BaseHolder.doStart(BaseHolder.java:95)
at org.spark_project.jetty.servlet.FilterHolder.doStart(FilterHolder.java:92)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.servlet.ServletHandler.initialize(ServletHandler.java:872)
at org.spark_project.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:349)
at org.spark_project.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778)
at org.spark_project.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
at org.spark_project.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105)
at org.spark_project.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at org.spark_project.jetty.server.handler.gzip.GzipHandler.doStart(GzipHandler.java:253)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.apache.spark.ui.JettyUtils$$anonfun$startJettyServer$1.apply(JettyUtils.scala:408)
at org.apache.spark.ui.JettyUtils$$anonfun$startJettyServer$1.apply(JettyUtils.scala:403)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at org.apache.spark.ui.JettyUtils$.startJettyServer(JettyUtils.scala:403)
at org.apache.spark.ui.WebUI.bind(WebUI.scala:132)
at org.apache.spark.deploy.history.HistoryServer.bind(HistoryServer.scala:137)
at org.apache.spark.deploy.history.HistoryServer$.main(HistoryServer.scala:286)
at org.apache.spark.deploy.history.HistoryServer.main(HistoryServer.scala)
19/10/31 09:31:42 WARN BaseHolder:
java.lang.ClassNotFoundException: com.bdp.BasicAuthenticationFilter
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.spark_project.jetty.util.Loader.loadClass(Loader.java:86)
at org.spark_project.jetty.servlet.BaseHolder.doStart(BaseHolder.java:95)
at org.spark_project.jetty.servlet.FilterHolder.doStart(FilterHolder.java:92)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.servlet.ServletHandler.initialize(ServletHandler.java:909)
at org.spark_project.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:349)
at org.spark_project.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778)
at org.spark_project.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
at org.spark_project.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105)
at org.spark_project.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at org.spark_project.jetty.server.handler.gzip.GzipHandler.doStart(GzipHandler.java:253)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.apache.spark.ui.JettyUtils$$anonfun$startJettyServer$1.apply(JettyUtils.scala:408)
at org.apache.spark.ui.JettyUtils$$anonfun$startJettyServer$1.apply(JettyUtils.scala:403)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at org.apache.spark.ui.JettyUtils$.startJettyServer(JettyUtils.scala:403)
at org.apache.spark.ui.WebUI.bind(WebUI.scala:132)
at org.apache.spark.deploy.history.HistoryServer.bind(HistoryServer.scala:137)
at org.apache.spark.deploy.history.HistoryServer$.main(HistoryServer.scala:286)
at org.apache.spark.deploy.history.HistoryServer.main(HistoryServer.scala)
19/10/31 09:31:42 ERROR HistoryServer: Failed to bind HistoryServer
MultiException[javax.servlet.UnavailableException: Class loading error for holder com.bdp.BasicAuthenticationFilter-56b78e55, javax.servlet.UnavailableException: Class loading error for holder com.bdp.BasicAuthenticationFilter-56b78e55]
at org.spark_project.jetty.servlet.ServletHandler.initialize(ServletHandler.java:863)
at org.spark_project.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:349)
at org.spark_project.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778)
at org.spark_project.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
at org.spark_project.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105)
at org.spark_project.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at org.spark_project.jetty.server.handler.gzip.GzipHandler.doStart(GzipHandler.java:253)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.apache.spark.ui.JettyUtils$$anonfun$startJettyServer$1.apply(JettyUtils.scala:408)
at org.apache.spark.ui.JettyUtils$$anonfun$startJettyServer$1.apply(JettyUtils.scala:403)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at org.apache.spark.ui.JettyUtils$.startJettyServer(JettyUtils.scala:403)
at org.apache.spark.ui.WebUI.bind(WebUI.scala:132)
at org.apache.spark.deploy.history.HistoryServer.bind(HistoryServer.scala:137)
at org.apache.spark.deploy.history.HistoryServer$.main(HistoryServer.scala:286)
at org.apache.spark.deploy.history.HistoryServer.main(HistoryServer.scala)
Suppressed: javax.servlet.UnavailableException: Class loading error for holder com.bdp.BasicAuthenticationFilter-56b78e55
at org.spark_project.jetty.servlet.BaseHolder.doStart(BaseHolder.java:102)
at org.spark_project.jetty.servlet.FilterHolder.doStart(FilterHolder.java:92)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.servlet.ServletHandler.initialize(ServletHandler.java:909)
... 18 more
Caused by: javax.servlet.UnavailableException: Class loading error for holder com.bdp.BasicAuthenticationFilter-56b78e55
at org.spark_project.jetty.servlet.BaseHolder.doStart(BaseHolder.java:102)
at org.spark_project.jetty.servlet.FilterHolder.doStart(FilterHolder.java:92)
at org.spark_project.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.spark_project.jetty.servlet.ServletHandler.initialize(ServletHandler.java:872)
... 18 more