HDFS 伪分布式模式下 namenode 启动错误

3
我正在尝试在Mac OS X(Java 7)上以伪分布模式启动HDFS。我已经创建了一个包含配置文件的目录,按照各种地方的说明进行操作(例如https://hadoop.apache.org/docs/r1.2.1/single_node_setup.html)。我可以无需密码ssh到本地主机。但是当我尝试启动hdfs时,我会得到以下错误:
$ start-dfs.sh --config ~/hadoop-pseudodistributed
2014-03-12 01:15:14.125 java[84567:1903] Unable to load realm info from SCDynamicStore
Starting namenodes on [2014-03-12 01:15:14,380 WARN  [main] util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(62)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
localhost]
2014-03-12: ssh: Could not resolve hostname 2014-03-12: nodename nor servname provided, or not known
Unable: ssh: Could not resolve hostname Unable: nodename nor servname provided, or not known
[main]: ssh: Could not resolve hostname [main]: nodename nor servname provided, or not known
WARN: ssh: Could not resolve hostname WARN: nodename nor servname provided, or not known
load: ssh: Could not resolve hostname load: nodename nor servname provided, or not known
-: ssh: Could not resolve hostname -: nodename nor servname provided, or not known
for: ssh: Could not resolve hostname for: nodename nor servname provided, or not known
native-hadoop: ssh: Could not resolve hostname native-hadoop: nodename nor servname provided, or not known
where: ssh: Could not resolve hostname where: nodename nor servname provided, or not known
builtin-java: ssh: Could not resolve hostname builtin-java: nodename nor servname provided, or not known
your: ssh: Could not resolve hostname your: nodename nor servname provided, or not known
applicable: ssh: Could not resolve hostname applicable: nodename nor servname provided, or not known
(NativeCodeLoader.java:<clinit>(62)): ssh: Could not resolve hostname (NativeCodeLoader.java:<clinit>(62)): nodename nor servname provided, or not known
using: ssh: Could not resolve hostname using: nodename nor servname provided, or not known
classes: ssh: Could not resolve hostname classes: nodename nor servname provided, or not known
platform...: ssh: Could not resolve hostname platform...: nodename nor servname provided, or not known
library: ssh: Could not resolve hostname library: nodename nor servname provided, or not known
localhost: starting namenode, logging to /usr/local/Cellar/hadoop/2.2.0/libexec/logs/hadoop-terry-namenode-Terrys-MacBook-Pro.local.out
01:15:14,380: ssh: Could not resolve hostname 01:15:14,380: nodename nor servname provided, or not known
to: ssh: connect to host to port 22: Connection refused
localhost: 2014-03-12 01:15:15,150 INFO  [main] namenode.NameNode (StringUtils.java:startupShutdownMessage(601)) - STARTUP_MSG:

有更多输出(我得到类似的投诉,因为它试图启动辅助名称节点),但以上显然是不可取的,我显然希望解决它。

看起来脚本正在运行某些内容以获取名称节点列表,并且该内容正在转储错误(到stdout或stderr),这些错误被捕获并用作节点列表。

我尝试通过向hadoop-env.sh中添加内容(如stackoverflow上其他地方建议的那样)无法清除“无法从SCDynamicStore加载领域信息”的错误。但是,这似乎超出了文档设置步骤的范围,其中不包括将hadoop-env.sh的副本放入我的配置目录中。

我想这应该很容易,但现在已经很晚了,我很累 :-( 任何帮助都将不胜感激。

谢谢!


检查/etc/hosts文件,确保您的主机名引用了您的IP地址。 - iTech
3个回答

3
我对在MacOS上以伪分布模式运行Hadoop遇到的问题有一个非常令人满意的解决方案。
# use hadoop-daemon.sh instead of start-dfs.sh
# because start-dfs.sh relies on native libs not present in MacOS
/platform/hadoop/sbin/hadoop-daemon.sh start namenode
/platform/hadoop/sbin/hadoop-daemon.sh start secondarynamenode
/platform/hadoop/sbin/hadoop-daemon.sh start datanode

# use hadoop-daemon.sh instead of stop-dfs.sh
# because stop-dfs.sh relies on native libs not present in MacOS
/platform/hadoop/sbin/hadoop-daemon.sh stop datanode
/platform/hadoop/sbin/hadoop-daemon.sh stop secondarynamenode
/platform/hadoop/sbin/hadoop-daemon.sh stop namenode

我知道这篇文章已经有三年了,但希望它能够帮助到其他人,避免他们和我一样浪费时间和精力去构建源代码,以获取所需的本地库,并在更改hadoop-env.sh中的设置后使start-dfs.sh和stop-dfs.sh起作用。在查看这个问题并阅读脚本以了解它们正在调用的内容($ HADOOP_PREFIX / bin / hdfs getconf -namenodes),并意识到由于我只对伪分布式模式感兴趣,每种类型只有一个节点,我可以说该‘方便’脚本,并使用hadoop-daemon.sh手动启动和停止。

就我个人而言,我不需要这个,但如果您正在进行某些操作,并且那些脚本被其他东西调用,您甚至可以使用此解决方法覆盖start-dfs.sh和stop-dfs.sh的内容。


0
2014-03-12 01:15:14.125 java[84567:1903] 无法从SCDynamicStore加载领域信息 在[2014-03-12 01:15:14,380 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:(62)) - 无法为您的平台加载本机hadoop库,使用适用的内置Java类localhost]

您的错误中的上述行表示"无法加载本机hadoop库"。这是因为本机库是在32位上编译(构建)的,而您可能正在64位上运行它。我认为这些行应该是警告。如果仍然报错,则应按照{{link1:此链接}}进行操作。

进一步:

2014-03-12:ssh:无法解析主机名2014-03-12:未提供节点名称或服务名称,或未知

我不了解Mac OS,但我会尝试用Ubuntu来进行类比。下面这些行是我在Ubuntu的.bashrc文件中添加的。这意味着我正在在.bashrc中提供本地库的路径,以便操作系统知道它的存在。

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"

以类似的方式,在您的操作系统中设置本地库的路径。希望这能解决您的“无法解析主机名”的问题(我曾遇到过类似的问题,但是在Ubuntu上,这个方法奏效了)。


我添加了最后两行,但仍然无法正常工作...有什么建议吗? - gonephishing
请检查$HADOOP_INSTALL的位置,这是您安装Hadoop的位置。尝试使用您安装Hadoop的位置地址替换“$HADOOP_INSTALL”。 - Rushikesh Garadade
为了使此解决方案起作用,本地库必须实际位于该位置,但对我来说,它们并没有——我尝试通过源代码构建获取它们,但在遇到许多构建问题后放弃了。这是对我有用的方法:https://dev59.com/rH3aa4cB1Zd3GeqPd359#46480330 - ellriley

-1

如果您之前使用hadoop默认配置文件夹运行过应用程序,则Mac上的终端会无法连接到localhost。

请关闭当前终端并在新终端中运行应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接