Kirill created ZEPPELIN-6183:
--------------------------------
Summary: ClassNotFoundException
org.apache.hadoop.conf.Configuration when LDAP password is stored in keystore
Key: ZEPPELIN-6183
URL: https://issues.apache.org/jira/browse/ZEPPELIN-6183
Project: Zeppelin
Issue Type: Bug
Components: zeppelin-server
Affects Versions: 0.12.0
Environment: Kubernetes, official {{apache/zeppelin:0.12.0}} docker
image, {{securityManager.realms = org.apache.zeppelin.realm.LdapRealm}} set in
{{shiro.ini}}, {{systemPassword}} is not set directly in config but is
referenced from keystore:
{code}
ldapRealm.hadoopSecurityCredentialPath =
jceks:///opt/zeppelin/conf/keystore/zeppelin.jceks
{code}
Keystore itself has been created by following the example in {{shiro.ini}}
template:
{code}
hadoop credential create ldapRealm.systemPassword -provider
jceks://file/user/zeppelin/conf/zeppelin.jceks
{code}
Just after start zeppelin throws the following error in console:
{noformat}
ERROR [2025-04-25 15:53:45,075] ({main}
EnvironmentLoader.java[initEnvironment]:156) - Shiro environment initialization
failed
java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
at
org.apache.zeppelin.realm.LdapRealm.getSystemPassword(LdapRealm.java:231)
at org.apache.zeppelin.realm.LdapRealm.onInit(LdapRealm.java:223)
at
org.apache.shiro.realm.AuthenticatingRealm.init(AuthenticatingRealm.java:398)
{noformat}
and later:
{noformat}
Caused by: java.lang.ClassNotFoundException:
org.apache.hadoop.conf.Configuration
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:527)
{noformat}
Full log attached.
After that the server responds with 503 to all requests.
If {{ldapRealm.contextFactory.systemPassword}} is directly set in {{shiro.ini}}
and {{ldapRealm.hadoopSecurityCredentialPath}} is commented out, there is no
such issue.
As a *workaround* the following works:
- modify server start command to fetch the libraries. Due to lack of write
permissions to {{/opt/zeppelin/lib}} by user Zeppelin-server runs from,
libraries are downloaded to {{/tmp/libs}}
{code}
command:
- sh
- -c
- mkdir /tmp/libs && wget -O /tmp/libs/hadoop-common-3.4.1.jar
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-common/3.4.1/hadoop-common-3.4.1.jar
&& wget -O /tmp/libs/woodstox-core-7.1.0.jar
https://repo1.maven.org/maven2/com/fasterxml/woodstox/woodstox-core/7.1.0/woodstox-core-7.1.0.jar
&& wget -O /tmp/libs/stax2-api-4.2.2.jar
https://repo1.maven.org/maven2/org/codehaus/woodstox/stax2-api/4.2.2/stax2-api-4.2.2.jar
&& wget -O /tmp/libs/hadoop-client-runtime-3.4.1.jar
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.4.1/hadoop-client-runtime-3.4.1.jar
&& wget -O /tmp/libs/hadoop-auth-3.4.1.jar
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-auth/3.4.1/hadoop-auth-3.4.1.jar
&& $(ZEPPELIN_HOME)/bin/zeppelin.sh
{code}
- Set environment variable to include custom dir into classpath:
{code}
env:
- name: ZEPPELIN_CLASSPATH_OVERRIDES
value: /tmp/libs/*
{code}
I guess the missing libraries should either be included in docker image or
there should be a note in {{shiro.ini}} example about need for these libraries.
Reporter: Kirill
Attachments: trace.log
Zeppelin is deployed in k8s with official 0.12.0 image and provided
k8s-manifests.
LDAP authentication is enabled in {{shiro.ini}} with {{securityManager.realms =
org.apache.zeppelin.realm.LdapRealm}},
{{ldapRealm.hadoopSecurityCredentialPath}} is defined.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)