10

我正在尝试在我的 Windows 7 机器上配置 Hadoop。我能够启动名称节点和其他服务,但是当我运行 Hadoop 包(版本 1.0.3)附带的示例时,出现以下错误:

bin/hadoop: line 320 : C:\Program: Command not found. 

我使用以下命令运行示例:

bin/hadoop jar hadoop-examples-1.0.3.jar pi 10

我打开了这个hadoop文件,其中出现了错误,发现在第 320 行正在生成一个路径:

JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`

所以我觉得问题可能出在这个JAVA变量上,因为 Cygwin 对路径名使用了不同的约定。有没有人也遇到过这个问题或知道是什么导致了这个问题?

4

2 回答 2

23

快速总结:

  • 下面的hadoopbash 脚本(path)/bin/hadoop实际上有一个 bug。该脚本假定 hadoop 需要的所有文件/路径中都没有空格。好吧,对于任何 Windows,它们都会在某个地方有一个空间,因为“程序文件”中有一个空间。

细节

这是一个棘手的问题......我遇到了同样的问题,我花了一段时间来解决。

首先,问题是:当文件路径/名称中涉及空格时,通过脚本设置环境变量可能会变得粗略(这在当今的非 *nix 系统中经常发生)。

接下来,可能有两个地方需要解决问题:

  1. 在你的(path)/conf/hadoop-env.sh脚本中,你应该设置JAVA_HOME脚本,它应该看起来像:

    export JAVA_HOME=/cygdrive/c/"Program Files"/Java/jdk1.7.0_06
    

    (请注意,“程序文件”周围有引号,以便将其识别为单个元素。您不能使用\转义字符,因为 cygwin 对 Windows 到 UNIX 路径进行了一些修饰,因此\不能充当转义符。

  2. 在您的(path)/bin/hadoop脚本中,第 320 行可能会写成如下内容:

    JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
    

    您需要将其更改为:

    JAVA_PLATFORM=`CLASSPATH="${CLASSPATH}" "${JAVA}" -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
    

    请注意,我在环境变量${CLASSPATH}${JAVA}. 通过将引号括起来,您是在说“此变量指定的整个字符集应被视为一个字符串对象”。


好的,现在如果您想了解为什么会发生这种情况以及发生了什么,问题是您的 JDK 可能存储在“程序文件”下,或者可能存储在“程序文件(x86)”下,两者都有空格小路。Hadoop 需要的所有其他环境变量不依赖于“程序文件”路径中的任何内容。这就是为什么您只看到一个错误被标记的原因。所有其他缺少引号的环境变量都没有空格。

于 2012-12-04T22:29:57.760 回答
0

这些是片段,错误是: hadoop.util.Platform command not found

  • "CLASSPATH=cygpath -p "$CLASSPATH" 分布,产生错误
  • "CLASSPATH=cygpath -p -w "$CLASSPATH" 添加了 windows 标志,产生了错误
  • "CLASSPATH=cygpath -wp "$CLASSPATH" 问题已解决

这是在 Vista 上。

于 2013-08-14T20:34:00.187 回答