NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream при выполнении искровой оболочки
Я загрузил версию предварительной версии spark 1.4.0 без hadoop (с предоставленным пользователем Haddop). Когда я запустил команду искровой оболочки, я получил эту ошибку:
> Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/
FSDataInputStream
at org.apache.spark.deploy.SparkSubmitArguments$$anonfun$mergeDefaultSpa
rkProperties$1.apply(SparkSubmitArguments.scala:111)
at org.apache.spark.deploy.SparkSubmitArguments$$anonfun$mergeDefaultSpa
rkProperties$1.apply(SparkSubmitArguments.scala:111)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.deploy.SparkSubmitArguments.mergeDefaultSparkPropert
ies(SparkSubmitArguments.scala:111)
at org.apache.spark.deploy.SparkSubmitArguments.<init>(SparkSubmitArgume
nts.scala:97)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:106)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStr
eam
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 7 more
Я искал в Интернете, говорят, что HADOOP_HOME еще не установлен в spark-env.cmd. Но я не могу найти spark-env.cmd в папке с искровой установкой.
Я проследил команду искровой оболочки, и кажется, что там нет HADOOP_CONFIG. Я попытался добавить HADOOP_HOME в переменную окружения, но все равно дает то же исключение.
На самом деле я не использую хаоп. Я скачал hadoop как обходное решение, как предлагалось в этом вопросе
Я использую окна 8 и scala 2.10.
Любая помощь будет оценена. Спасибо.
Ответы
Ответ 1
"Без Hadoop" в имени сборки Spark вводит в заблуждение: это означает, что сборка не привязана к конкретному дистрибутиву Hadoop, а не то, что она предназначена для запуска без него: пользователь должен указать, где найти Hadoop (см. Https://spark.apache.org/docs/latest/hadoop-provided.html)
Один из простых способов решить эту проблему:
- Получить двоичные файлы Hadoop для Windows. В идеале постройте их, но это болезненно (некоторые советы смотрите: Hadoop в Windows Building/Installation Error). В противном случае Google некоторые вверх, например, в настоящее время вы можете скачать 2.6.0 отсюда: http://www.barik.net/archive/2015/01/19/172716/
- Создайте файл
spark-env.cmd
который выглядит следующим образом (измените путь Hadoop, чтобы он соответствовал вашей установке): @echo off set HADOOP_HOME=D:\Utils\hadoop-2.7.1 set PATH=%HADOOP_HOME%\bin;%PATH% set SPARK_DIST_CLASSPATH=<paste here the output of %HADOOP_HOME%\bin\hadoop classpath>
- Поместите этот
spark-env.cmd
либо в папку conf
расположенную на том же уровне, что и базовая папка Spark (которая может выглядеть странно), либо в папку, указанную в переменной среды SPARK_CONF_DIR
.
Ответ 2
У меня была такая же проблема, на самом деле она упоминала на странице "Начало работы" Spark, как ее обрабатывать:
### in conf/spark-env.sh ###
# If 'hadoop' binary is on your PATH
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
# With explicit path to 'hadoop' binary
export SPARK_DIST_CLASSPATH=$(/path/to/hadoop/bin/hadoop classpath)
# Passing a Hadoop configuration directory
export SPARK_DIST_CLASSPATH=$(hadoop --config /path/to/configs classpath)
Если вы хотите использовать свой собственный хаоп, следуйте одному из трех вариантов, скопируйте и вставьте его в файл spark-env.sh
:
1, если у вас есть хаоп на вашем PATH
2- вы хотите явно указать двоичный файл hadoop
3- вы также можете указать конфигурационную папку hadoop
http://spark.apache.org/docs/latest/hadoop-provided.html
Ответ 3
У меня тоже была проблема,
export SPARK_DIST_CLASSPATH=`hadoop classpath`
разрешил проблему.
Ответ 4
Я столкнулся с той же ошибкой, когда пытался познакомиться с искру. Мое понимание сообщения об ошибке состоит в том, что, хотя для искры не требуется кластер hadoop для запуска, ему нужны некоторые классы hadoop. Поскольку я просто играл вокруг с искровым светом, и мне все равно, какая версия библиотек для использования, я только что загрузил искровую бинарную версию, предварительно построенную с версией hadoop (2.6), и все стало нормально работать.
Ответ 5
Введите в SPARK_HOME → conf
скопируйте файл spark-env.sh.template и переименуйте его в spark-env.sh
Внутри этого файла вы можете установить параметры для искры.
Ответ 6
Linux
ENV SPARK_DIST_CLASSPATH="$HADOOP_HOME/etc/hadoop/*:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/hdfs/lib/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/yarn/lib/*:$HADOOP_HOME/share/hadoop/yarn/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*:$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/tools/lib/*"
окна
set SPARK_DIST_CLASSPATH=%HADOOP_HOME%\etc\hadoop\*;%HADOOP_HOME%\share\hadoop\common\lib\*;%HADOOP_HOME%\share\hadoop\common\*;%HADOOP_HOME%\share\hadoop\hdfs\*;%HADOOP_HOME%\share\hadoop\hdfs\lib\*;%HADOOP_HOME%\share\hadoop\hdfs\*;%HADOOP_HOME%\share\hadoop\yarn\lib\*;%HADOOP_HOME%\share\hadoop\yarn\*;%HADOOP_HOME%\share\hadoop\mapreduce\lib\*;%HADOOP_HOME%\share\hadoop\mapreduce\*;%HADOOP_HOME%\share\hadoop\tools\lib\*
Ответ 7
Запустите ниже из вашего пакета dir непосредственно перед запуском spark-submit -
export SPARK_DIST_CLASSPATH='hadoop classpath'
Ответ 8
Наконец, я нашел решение для удаления исключения.
В spark-class2.cmd добавьте:
set HADOOP_CLASS1=%HADOOP_HOME%\share\hadoop\common\*
set HADOOP_CLASS2=%HADOOP_HOME%\share\hadoop\common\lib\*
set HADOOP_CLASS3=%HADOOP_HOME%\share\hadoop\mapreduce\*
set HADOOP_CLASS4=%HADOOP_HOME%\share\hadoop\mapreduce\lib\*
set HADOOP_CLASS5=%HADOOP_HOME%\share\hadoop\yarn\*
set HADOOP_CLASS6=%HADOOP_HOME%\share\hadoop\yarn\lib\*
set HADOOP_CLASS7=%HADOOP_HOME%\share\hadoop\hdfs\*
set HADOOP_CLASS8=%HADOOP_HOME%\share\hadoop\hdfs\lib\*
set CLASSPATH=%HADOOP_CLASS1%;%HADOOP_CLASS2%;%HADOOP_CLASS3%;%HADOOP_CLASS4%;%HADOOP_CLASS5%;%HADOOP_CLASS6%;%HADOOP_CLASS7%;%HADOOP_CLASS8%;%LAUNCH_CLASSPATH%
Затем измените:
"%RUNNER%" -cp %CLASSPATH%;%LAUNCH_CLASSPATH% org.apache.spark.launcher.Main %* > %LAUNCHER_OUTPUT%
to:
"%RUNNER%" -Dhadoop.home.dir=*hadoop-installation-folder* -cp %CLASSPATH% %JAVA_OPTS% %*
Он отлично работает со мной, но я не уверен, что это лучшее решение.
Ответ 9
Большое вам спасибо. Это отлично поработало, но мне пришлось добавить искровые банки в классный путь:; C:\искра\Lib *
Кроме того, в последней строке cmd файла отсутствует слово "echo"; поэтому он должен сказать: echo% SPARK_CMD%
Ответ 10
У меня была такая же проблема... Исключение в потоке "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/
FSDataInputStream at org.apache.spark.deploy.SparkSubmitArguments $$ anonfun $mergeDefaultSpa
rkProperties $1.Apply(SparkSubmitArguments.scala: 111)...
Затем я понял, что я установил версию искры без хаоса. Я установил версию "with-hadoop", проблема исчезла.
Ответ 11
для моего случая
Исходное искрообразование локально отличается от запуска его на кластере. в кластере у вас может быть другая зависимость/контекст. так что по существу в вашем pom.xml у вас могут быть зависимости, объявленные как provided
.
при локальном запуске вам не нужны эти зависимости provided
. просто расколите их и снова восстановите.
Ответ 12
Я столкнулся с той же ошибкой. Я хотел установить искру на моем ПК с Windows и, следовательно, загрузить без искупительной версии искры, но, оказывается, вам нужны библиотеки хаопов! поэтому загрузите любую версию искробезопасности и установите переменные среды.
Ответ 13
Я получил эту ошибку, потому что файл был скопирован из Windows. Разрешите это, используя
dos2unix file_name
Ответ 14
Вы должны добавить эти банки в ваш код:
- общего кли-1.2.jar
- Hadoop-синфазного 2.7.2.jar