【操作背景】:给hdfs web页面(hadoop控制台)登录新增账号密码登录,按照现有资料配置后重启namenode失败!
【报错信息】:
2024-08-19 17:08:15,857 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.io.IOException: Unable to initialize WebAppContext
at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:1328)
at org.apache.hadoop.hdfs.server.namenode.NameNodeHttpServer.start(NameNodeHttpServer.java:170)
at org.apache.hadoop.hdfs.server.namenode.NameNode.startHttpServer(NameNode.java:967)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:778)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:1033)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:1008)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1782)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1847)
Caused by: java.lang.ClassNotFoundException: org.mortbay.jetty.webapp.WebAppContext
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:538)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at org.eclipse.jetty.util.Loader.loadClass(Loader.java:64)
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:477)
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:417)
at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:364)
at org.eclipse.jetty.webapp.JettyWebXmlConfiguration.lambda$configure$0(JettyWebXmlConfiguration.java:94)
at org.eclipse.jetty.webapp.WebAppClassLoader.runWithServerClassAccess(WebAppClassLoader.java:138)
【环境版本】hadoop-3.3.6,jdk11(java version "11.0.8" 2020-07-14 LTS)
【解决方案】
原本jetty-web.xml配置
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Get name="securityHandler">
<Set name="userRealm">
<New class="org.mortbay.jetty.security.HashUserRealm">
<Set name="name">jobtrackerRealm</Set>
<Set name="config">
<SystemProperty name="hadoop.home.dir"/>/opt/hadoop-3.3.6/share/hadoop/hdfs/webapps/hdfs/WEB-INF/realm.properties
</Set>
</New>
</Set>
</Get>
</Configure>
修改为
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">jobtrackerRealm</Set>
<Set name="config">
<SystemProperty name="hadoop.home.dir"/>/share/hadoop/hdfs/webapps/hdfs/WEB-INF/realm.properties
</Set>
</New>
</Set>
</Get>
</Configure>
变动提示:
①<Configure class="org.eclipse.jetty.webapp.WebAppContext">
② <Set name="loginService">
③<New class="org.eclipse.jetty.security.HashLoginService">
④<SystemProperty name="hadoop.home.dir"/>/share/hadoop/hdfs/webapps/hdfs/WEB-INF/realm.properties
hadoop.home.dir值的示例:/opt/hadoop-3.3.6,所以后以/开头,因此/share/hadoop/hdfs...并不是绝对路径的写法
【其他】web.xml文件
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<!-- Add this towards the bottom of the xml document. -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>root</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jobtrackerRealm</realm-name>
</login-config>
</web-app>
realm.properties文件
root:rxx3#xxxx,root