通过Cygwin在Windows上进行Hadoop配置

Man*_*ish 10 cygwin hadoop windows-7

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

bin/hadoop: line 320 : C:\Program: Command not found. 
Run Code Online (Sandbox Code Playgroud)

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

bin/hadoop jar hadoop-examples-1.0.3.jar pi 10
Run Code Online (Sandbox Code Playgroud)

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

JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*son 23

快速摘要:

  • hadoop下bash脚本(path)/bin/hadoop实际上已经存在一个bug.该脚本假定hadoop所需的任何文件/路径都不会包含空格.好吧,对于任何Windows,它们都会在某个地方有空间,因为"Program Files"中有一个空格.

细节

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

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

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

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

    export JAVA_HOME=/cygdrive/c/"Program Files"/Java/jdk1.7.0_06
    
    Run Code Online (Sandbox Code Playgroud)

    (请注意,"Program Files"周围有引号,因此它被识别为单个元素.您不能使用\转义字符,因为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"`
    
    Run Code Online (Sandbox Code Playgroud)

    您需要将其更改为:

    JAVA_PLATFORM=`CLASSPATH="${CLASSPATH}" "${JAVA}" -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,我已经添加引号的环境变量${CLASSPATH}${JAVA}.通过在其周围加上引号,您可以说"此变量指定的整个字符集应被视为一个字符串对象".


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