现在的 Eclipse OpenJ9 由 IBM 发起,并开源捐赠给了 Eclipse 基金会,这个 JVM 致力于构建一个内存使用更小、启动速度更快且更高吞吐量的 Java 虚拟机,但使用此 JVM 的 JDK 在部署 Hadoop 伪分布式和完全分布式会出现问题
一、初次尝试踩坑
为了节约内存,本狼尝试使用 Eclipse OpenJ9 作为 JVM 的 IBM Semeru Runtime 8 作为 JDK,但启动时却出现了 unable to find LoginModule class: com.ibm.security.auth.module.LinuxLoginModule,的错误
其实要解决也相对比较简单,可以修改 Hadoop 源码,在 Hadoop 启动之前执行
System.setProperty("java.vendor", "International Business Machines Corporation");
二、更为简单的解决方案
除了修改源码,还可以通过 javaagent 在 Hadoop 启动前执行上文的语句,先编写好类,此处的示例类名为 SetVendor
public class SetVendor {
public static void premain(String args) {
System.setProperty("java.vendor", "International Business Machines Corporation");
}
}
自行编译成 javaagent 即可
也可从 Github 中下载现成的 javaagent:
setvendor8.zip
三、配置Hadoop启动参数
先前介绍了使用 Oracle JDK 8 的 Hadoop 伪分布式和完全分布式部署,本文不再过多赘述配置内容
[Hadoop学习笔记 1] Hadoop伪分布式环境部署(OpenSUSE 15.6 + Oracle JDK 8)
[Hadoop学习笔记 2] Hadoop完全分布式环境部署(OpenSUSE 15.6 + Oracle JDK 8 + Docker)
若自行编译或下载 javaagent 则需额外修改配置文件内容,本文将把此 javaagent 放置到 $JAVA_HOME 目录下,请根据自身实际情况调整路径
修改 $HADOOP_HOME/etc/hadoop/hadoop-env.sh
找到行
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
添加 -javaagent:$JAVA_HOME/setvendor8.zip
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -javaagent:$JAVA_HOME/setvendor8.zip"
修改 $HADOOP_HOME/etc/hadoop/yarn-env.sh
找到行
YARN_OPTS="$YARN_OPTS -Dhadoop.log.dir=$YARN_LOG_DIR"
修改为
YARN_OPTS="$YARN_OPTS -javaagent:$JAVA_HOME/setvendor8.zip -Dhadoop.log.dir=$YARN_LOG_DIR"
我的环境变量 $JAVA_HOME 的值为 /opt/softln/java ,请根据实际修改
此时 MapReduce 还不能正常运行,修改 $HADOOP_HOME/etc/hadoop/mapred-site.xml
在 <configuration> 标签中添加
<property>
<name>mapred.child.java.opts</name>
<value>-javaagent:/opt/softln/java/setvendor8.zip</value>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-javaagent:/opt/softln/java/setvendor8.zip</value>
</property>
<property>
<name>yarn.app.mapreduce.am.admin-command-opts</name>
<value>-javaagent:/opt/softln/java/setvendor8.zip</value>
</property>
291

被折叠的 条评论
为什么被折叠?



