通过Cygwin在Windows上配置Hadoop



我正在尝试在我的Windows7机器上配置Hadoop。我可以启动name node和其他服务,但由于我正在运行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对路径名使用了不同的约定。有没有人也遇到过这个问题,或者知道是什么导致了这个问题?

快速摘要:

  • (path)/bin/hadoop下的hadoop-bash脚本实际上有一个错误。该脚本假设hadoop需要的文件/路径中没有空间。好吧,对于任何Windows,它们都会在某个地方有一个空间,因为"程序文件"中有一个空格

详细信息

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

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

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

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

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

    (请注意,"Program Files"周围有引号,因此它被识别为单个元素。您不能使用转义符,因为cygwin会对Windows到UNIX的路径进行一些finaling,因此不能用作转义符。

  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需要的所有其他环境变量都不依赖于"Program Files"路径中的任何内容。所以这就是为什么你只看到一个错误被标记。所有其他缺少引号的环境变量中都没有空格。

这些是片段,错误为:hadoop.util.Platform命令未找到

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

这是在Vista上。

最新更新