Hadoop / HDFS 3.1.1(在Java 11上)在加载文件资源管理器时Web UI崩溃?

Mar*_*son 3 noclassdeffounderror hdfs java-9 hadoop3 java-11

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

然后单击“实用程序->浏览文件系统”,并在Web浏览器中得到以下提示:

Failed to retrieve data from /webhdfs/v1/?op=LISTSTATUS: Server Error
Run Code Online (Sandbox Code Playgroud)

深入日志文件($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)
Run Code Online (Sandbox Code Playgroud)

因此缺少一堂课。为什么会这样,如何解决该问题?

Mar*_*son 6

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 "
Run Code Online (Sandbox Code Playgroud)

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

我发现将罐子放在这些位置中的任何一个处,都会使Hadoop自动选择它,从而使在线文件浏览器开始工作:

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

不知道将文件放置在一个或另一个文件夹中的后果是什么。但是,我想尽可能地限制自己的黑客,并且由于我已经有一个单独的配置目录(即,没有$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
Run Code Online (Sandbox Code Playgroud)

最后一点,我认为可以肯定地说,除了真正的旧Java版本以外,不能指望Hadoop在任何其他软件上都能正常工作。Googling揭示了Java 9、10和11仍在开放中。所以从本质上讲,这是一个Hadoop问题。话虽如此,尽管我们解决了使在线文件浏览器正常工作的一个问题,但是肯定还会有许多其他问题。