Конфигурация Hadoop в Windows через Cygwin

Я пытаюсь настроить Hadoop на моем компьютере с Windows 7. Я могу запустить имя 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 использует разные соглашения для имени пути. Кто-нибудь сталкивался с этой проблемой или знал, что вызывает проблему?

Ответ 1

Краткий обзор:

  • hadoop bash script в (path)/bin/hadoop на самом деле имеет ошибку. script предполагает, что ни один из файлов/путей, в которых нуждаются пользователи, будет содержать пробелы. Что ж, для Windows все они будут иметь место где-то, так как в "Program Files" есть пробел.

Подробнее

Это сложный вопрос... Я столкнулся с той же проблемой, и мне потребовалось некоторое время, чтобы исправить.

Во-первых, проблема: установка переменных среды через скрипты может быть отрывочной, когда пробелы задействованы в путях/именах файлов (что происходит довольно часто в системах non * nix в наши дни).

Далее, есть вероятные два места, где вам нужно исправить проблему:

  • В (path)/conf/hadoop-env.sh script вы должны установить JAVA_HOME script, и ДОЛЖНО выглядеть примерно так:

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

    (Обратите внимание, что в "Программных файлах" есть кавычки, так что он распознается как один элемент. Вы не можете использовать escape-символ \, потому что cygwin делает некоторую оплодотворение Windows для путей UNIX, поэтому \ не может действовать как побег.

  • В вашем (path)/bin/hadoop script строка 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, скорее всего, хранится в разделе "Program Files" или, возможно, в разделе "Program Files (x86)", оба из которых имеют пробелы в пути. Все другие переменные среды, которые нужны Hadoop, не зависят ни от чего в рамках "Программных файлов". Итак, почему вы видите только одну ошибку, помеченную. Все остальные переменные среды, которые не имеют котировок, просто не имеют пробелов внутри них.

Ответ 2

Это фрагменты, ошибка: hadoop.util.Platform команда не найдена

  • "CLASSPATH=cygpath -p "$CLASSPATH", возникла ошибка
  • "CLASSPATH=cygpath -p -w "$CLASSPATH" добавлен флаг флага, возникла ошибка
  • "CLASSPATH=cygpath -wp "$CLASSPATH" проблема решена

Это было на Vista.