9

我正在尝试在 Windows Azure 云上运行 3 节点 Hadoop 集群。我已经完成了配置和测试启动。一切看起来都很好,但是,因为我曾经使用 OpedJDK,根据我的阅读,不推荐将其用作 Hadoop 的 VM,因此我决定将其替换为 Oracle Server JVM。使用 Yum 删除了旧的 java 安装,以及 /usr/lib 中的所有 java 文件夹,安装了最新版本的 Oracle JVM,更新了 PATH 和 JAVA_HOME 变量;但是,现在在发布时,我得到了以下按摩:

sed: -e expression #1, char 6: unknown option to `s'
64-Bit: ssh: Could not resolve hostname 64-Bit: Name or service not known
HotSpot(TM): ssh: Could not resolve hostname HotSpot(TM): Name or service not known
Server: ssh: Could not resolve hostname Server: Name or service not known
VM: ssh: Could not resolve hostname VM: Name or service not known

等(总共大约 20-30 个字符串,其中包含与主机名没有任何共同点的单词)

对我来说,由于启动脚本中 sed 的使用不正确,它似乎正试图将部分代码作为主机名传递:

        if [ "$HADOOP_SLAVE_NAMES" != '' ] ; then
  SLAVE_NAMES=$HADOOP_SLAVE_NAMES
else
  SLAVE_FILE=${HADOOP_SLAVES:-${HADOOP_CONF_DIR}/slaves}
  SLAVE_NAMES=$(cat "$SLAVE_FILE" | sed  's/#.*$//;/^$/d')
fi

# start the daemons
for slave in $SLAVE_NAMES ; do
 ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
   2>&1 | sed "s/^/$slave: /" &
 if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
   sleep $HADOOP_SLAVE_SLEEP
 fi
done

哪个看起来没有变化,所以问题是:JVM 的变化如何影响 sed?我该如何解决?

4

1 回答 1

15

所以我找到了这个问题的答案:我的猜测是错误的,sed 的一切都很好。然而,与 OpenJDK 相比,问题在于 Oracle JVM 如何与外部库一起工作。它确实在脚本没有预料到的地方抛出异常,并且破坏了整个 sed 输入。您可以通过添加以下系统变量来修复它: HADOOP_COMMON_LIB_NATIVE_DIR它应该指向您的 Hadoop 安装的/lib/native文件夹,并将-Djava.library.path=/opt/hadoop/lib 添加到您在HADOOP_OPTS中已有的任何选项中变量(注意 /opt/hadoop 是我的安装文件夹,您可能需要更改它才能使东西正常工作)。我个人将导出命令添加到 hadoop-env.sh 脚本,但将其添加到 .bash 文件或 start-all.sh 应该也可以。

于 2013-11-05T21:04:43.590 回答