2016-04-07 1 views
0

У нас есть кластер linux hadoop, но по разным причинам некоторые клиенты Windows подключают и перенаправляют данные в кластер linux. В hadoop1 мы смогли запустить hadoop через cygwin Однако в hadoop2, как указано на website, cygwin не требуется или не поддерживается.Клиент Hadoop2 для Windows для кластера Linux

Вопросы

  1. что именно изменилось? почему клиент (только) не работал под cygwin или он мог? Помимо путей, которые играют другие соображения?
  2. Помимо ниже недвижимости для представления рабочих есть что-то другое, что должно рассматриваться для окон/клиент взаимодействует с Linux кластера

    conf.set("mapreduce.app-submission.cross-platform", "true");

  3. извлекая Hadoop-2.6.0-cdh5.5.2 и запускать его из cygwin с правильными конфигурациями в $ HADOOP_HOME/etc дает некоторые классы классов classpath или classpath, не найденные проблемы? Например, следующие запустить

    hdfs dfs -ls 
    Error: Could not find or load main class org.apache.hadoop.fs.FsShell 
    

Затем, глядя на пути к классам выглядит как они содержат Cygwin пути. попытаться преобразовать их в окно путей, так что банку можно посмотреть вверх

in $HADOOP_HOME/etc/hdfs.sh locate the dfs command and change to 
     elif [ "$COMMAND" = "dfs" ] ; then 
     if $cygwin; then 
     CLASSPATH=`cygpath -p -w "$CLASSPATH"` 
     fi 
     CLASS=org.apache.hadoop.fs.FsShell 

Это приводит к следующему:

16/04/07 16:01:05 ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path 
    java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries. 
      at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:378) 
      at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:393) 
      at org.apache.hadoop.util.Shell.<clinit>(Shell.java:386) 
      at org.apache.hadoop.util.GenericOptionsParser.preProcessForWindows(GenericOptionsParser.java:438) 
      at org.apache.hadoop.util.GenericOptionsParser.parseGeneralOptions(GenericOptionsParser.java:484) 
      at org.apache.hadoop.util.GenericOptionsParser.<init>(GenericOptionsParser.java:170) 
      at org.apache.hadoop.util.GenericOptionsParser.<init>(GenericOptionsParser.java:153) 
      at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:64) 
      at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
      at org.apache.hadoop.fs.FsShell.main(FsShell.java:362) 
    16/04/07 16:01:13 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
    Warning: fs.defaultFs is not set when running "ls" command. 
    Found 15 items 
    -ls: Fatal internal error 
    java.lang.NullPointerException 
      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010) 
      at org.apache.hadoop.util.Shell.runCommand(Shell.java:505) 
      at org.apache.hadoop.util.Shell.run(Shell.java:478) 
      at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:738) 
      at org.apache.hadoop.util.Shell.execCommand(Shell.java:831) 
      at org.apache.hadoop.util.Shell.execCommand(Shell.java:814) 
      at org.apache.hadoop.fs.FileUtil.execCommand(FileUtil.java:1100) 
      at org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus.loadPermissionInfo(RawLocalFileSystem.java:582) 
      at org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus.getOwner(RawLocalFileSystem.java:565) 
      at org.apache.hadoop.fs.shell.Ls.adjustColumnWidths(Ls.java:139) 
      at org.apache.hadoop.fs.shell.Ls.processPaths(Ls.java:110) 
      at org.apache.hadoop.fs.shell.Command.recursePath(Command.java:373) 
      at org.apache.hadoop.fs.shell.Ls.processPathArgument(Ls.java:98) 
      at org.apache.hadoop.fs.shell.Command.processArgument(Command.java:271) 
      at org.apache.hadoop.fs.shell.Command.processArguments(Command.java:255) 
      at org.apache.hadoop.fs.shell.FsCommand.processRawArguments(FsCommand.java:118) 
      at org.apache.hadoop.fs.shell.Command.run(Command.java:165) 
      at org.apache.hadoop.fs.FsShell.run(FsShell.java:305) 
      at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
      at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
      at org.apache.hadoop.fs.FsShell.main(FsShell.java:362) 

Для выше моего вопроса я должен идти дальше, чтобы попытаться это исправить так что я могу повторно использовать существующие клиентские скрипты .sh или просто конвертировать их .bat?

+0

преобразование клиента .sh к .bat становится кошмаром со всеми ограничениями, связанными с длинами команд; classpath и т.д. – sunny

ответ

0

проблема заключается в том, что cygwin должен возвращать пути Windows, а не пути cygwin. Также winutils.exe должен быть установлен на пути, как описано here

Просто исправить скрипты, чтобы вернуть реальные пути выигрыша и отключить несколько команд, которые не работают под Cygwin

#!/bin/bash 
# fix $HADOOP_HOME/bin/hdfs 
sed -i -e "s/bin=/#bin=/g" $HADOOP_HOME/bin/hdfs 
sed -i -e "s#DEFAULT_LIBEXEC_DIR=\"\$bin\"/../libexec#DEFAULT_LIBEXEC_DIR=\"\$HADOOP_HOME\\\libexec\"#g" $HADOOP_HOME/bin/hdfs 
sed -i "/export CLASSPATH=$CLASSPATH/i CLASSPATH=\`cygpath -p -w \"\$CLASSPATH\"\`" $HADOOP_HOME/bin/hdfs 

# fix $HADOOP_HOME/libexec/hdfs-config.sh 
sed -i -e "s/bin=/#bin=/g" $HADOOP_HOME/libexec/hdfs-config.sh 
sed -i -e "s#DEFAULT_LIBEXEC_DIR=\"\$bin\"/../libexec#DEFAULT_LIBEXEC_DIR=\"\$HADOOP_HOME\\\libexec\"#g" $HADOOP_HOME/libexec/hdfs-config.sh 

# fix $HADOOP_HOME/libexec/hadoop-config.sh 
sed -i "/HADOOP_DEFAULT_PREFIX=/a HADOOP_PREFIX=" $HADOOP_HOME/libexec/hadoop-config.sh 
sed -i "/export HADOOP_PREFIX/i HADOOP_PREFIX=\`cygpath -p -w \"\$HADOOP_PREFIX\"\`" $HADOOP_HOME/libexec/hadoop-config.sh 

# fix $HADOOP_HOME/bin/hadoop 
sed -i -e "s/bin=/#bin=/g" $HADOOP_HOME/bin/hadoop 
sed -i -e "s#DEFAULT_LIBEXEC_DIR=\"\$bin\"/../libexec#DEFAULT_LIBEXEC_DIR=\"\$HADOOP_HOME\\\libexec\"#g" $HADOOP_HOME/bin/hadoop 
sed -i "/export CLASSPATH=$CLASSPATH/i CLASSPATH=\`cygpath -p -w \"\$CLASSPATH\"\`" $HADOOP_HOME/bin/hadoop