首页 > 解决方案 > Hadoop/HDFS 3.1.1(在 Java 11 上)加载文件资源管理器时 Web UI 崩溃?

问题描述

之后start-dfs.sh,我可以导航到http://localhost:9870。NameNode 似乎运行得很好。

然后我点击“Utilities -> Browse the file system”,我在网络浏览器中得到这个提示:

Failed to retrieve data from /webhdfs/v1/?op=LISTSTATUS: Server Error

挖掘日志文件($HADOOP_HOME/logs/hadoop-xxx-namenode-xxx.log),我发现:

2018-11-30 16:47:25,097 WARN org.eclipse.jetty.servlet.ServletHandler: Error for /webhdfs/v1/
java.lang.NoClassDefFoundError: javax/activation/DataSource
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.(RuntimeBuiltinLeafInfoImpl.java:457)
    at com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.(RuntimeTypeInfoSetImpl.java:65)
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:133)

所以缺少一个类。为什么会这样,我该如何解决这个问题?

标签: hdfsnoclassdeffounderrorjava-9java-11hadoop3

解决方案


Java 9 弃用了该java.activation模块。Java 11完全删除了它

Java 9 和 Java 10用户可以将该模块重新添加到 Hadoop 的类路径中。将其放入$HADOOP_CONF_DIR/hadoop-env.sh(未测试):

export HADOOP_OPTS="${HADOOP_OPTS} --add-modules java.activation "

Java 11用户必须首先下载 jar 依赖项并使其在类路径中可用。但它去了吗?

我发现将 jar 放在这些位置中的任何一个位置都会使 Hadoop 自动拾取它,效果是在线文件浏览器开始工作:

$HADOOP_HOME/share/hadoop/common
$HADOOP_HOME/share/hadoop/common/lib
$HADOOP_HOME/share/hadoop/mapreduce
$HADOOP_HOME/share/hadoop/mapreduce/lib

不确定将文件放在一个或另一个文件夹中的确切后果。但是,我喜欢尽可能地限制我的 hack,因为我已经有一个单独的配置目录(即 not $HADOOP_HOME/etc/hadoop),所以我想把它放在那里。将 jar 文件放在任何其他位置也需要我们将此路径添加到HADOOP_CLASSPATH变量中。

所以,复制粘贴到你的终端:

URL=https://jcenter.bintray.com/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar
wget $URL -P $HADOOP_CONF_DIR/lib
echo 'export HADOOP_CLASSPATH+=" $HADOOP_CONF_DIR/lib/*.jar"' >> $HADOOP_CONF_DIR/hadoop-env.sh

最后一点,我认为可以肯定地说,除了真正的旧 Java 版本之外,不能指望 Hadoop 在任何东西上都能很好地工作。谷歌搜索显示Java 9、10 和 11仍然存在未处理的票证。所以本质上,这是一个 Hadoop 问题。话虽如此,虽然我们解决了让在线文件浏览器工作的一个问题,但肯定会有许多其他问题。


推荐阅读