执行spark-shell时的NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream

时间:2015-06-18 04:24:18

标签: apache-spark

我已经下载了没有hadoop的spark 1.4.0的预构建版本(使用用户提供的Haddop)。当我运行spark-shell命令时,我收到了这个错误:

> 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安装文件夹中找不到spark-env.cmd。 我已经跟踪了spark-shell命令,似乎那里没有HADOOP_CONFIG。我已尝试在环境变量上添加HADOOP_HOME,但它仍然提供相同的异常。

实际上我并没有真正使用hadoop。我按照this question

中的建议下载了hadoop作为解决方法

我使用的是Windows 8和scala 2.10。

任何帮助将不胜感激。感谢。

15 个答案:

答案 0 :(得分:40)

Spark的构建名称中的“without Hadoop”具有误导性:它意味着构建不依赖于特定的Hadoop发行版,而不是没有它的情况下运行:用户应指明在哪里找到Hadoop(参见{ {3}})

解决此问题的一种简洁方法是:

  1. 获取Hadoop Windows二进制文件。理想情况下构建它们,但这很痛苦(对于一些提示,请参阅:https://spark.apache.org/docs/latest/hadoop-provided.html)。否则谷歌一些,例如目前你可以从这里下载2.6.0:Hadoop on Windows Building/ Installation Error
  2. 创建一个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>
  3. 将此spark-env.cmd放在位于与Spark基本文件夹相同级别的conf文件夹中(可能看起来很奇怪),或放在SPARK_CONF_DIR环境变量指示的文件夹中

答案 1 :(得分:18)

我遇到了同样的问题,事实上它在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)

如果您想使用自己的hadoop,请按照以下3个选项中的一个选项,将其复制并粘贴到spark-env.sh文件中:

1-如果你的PATH上有hadoop

2-你想明确地显示hadoop二进制文件

3-您还可以显示hadoop配置文件夹

http://spark.apache.org/docs/latest/hadoop-provided.html

答案 2 :(得分:14)

我也有这个问题,

export SPARK_DIST_CLASSPATH=`hadoop classpath`

解决了这个问题。

答案 3 :(得分:5)

我在尝试熟悉火花时遇到了同样的错误。我对错误信息的理解是,虽然spark不需要运行hadoop集群,但它确实需要一些hadoop类。由于我只是在玩火花并且不关心使用什么版本的hadoop库,我刚刚下载了一个预先构建的带有hadoop(2.6)版本的spark二进制文件,并且开始工作正常。

答案 4 :(得分:3)

输入SPARK_HOME - &gt; CONF

复制spark-env.sh.template文件并将其重命名为spark-env.sh 在此文件中,您可以设置spark的参数。

答案 5 :(得分:2)

的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\*

答案 6 :(得分:1)

在运行spark-submit之前,从软件包目录中运行以下内容-

export SPARK_DIST_CLASSPATH=`hadoop classpath`

答案 7 :(得分:0)

我终于找到了一个删除异常的解决方案。

在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%

到:

"%RUNNER%" -Dhadoop.home.dir=*hadoop-installation-folder* -cp %CLASSPATH% %JAVA_OPTS% %*

它对我很好,但我不确定这是最好的解决方案。

答案 8 :(得分:0)

非常感谢你。这很好用,但我不得不将火花罐添加到类路径中:   ; C:\火花\ lib中* 此外,cmd文件的最后一行缺少单词&#34; echo&#34 ;;所以它应该说:   echo%SPARK_CMD%

答案 9 :(得分:0)

我有同样的问题....线程“main”中的异常java.lang.NoClassDefFoundError:org / apache / hadoop / fs / FSDataInputStream         在org.apache.spark.deploy.SparkSubmitArguments $$ anonfun $ mergeDefaultSpa rkProperties $ 1.适用(SparkSubmitArguments.scala:111)... 然后我意识到我已经安装了没有hadoop的火花版本。我安装了“with-hadoop”版本问题就消失了。

答案 10 :(得分:0)

我的案例

本地运行spark作业与在集群上运行它不同。在群集上,您可能需要遵循不同的依赖关系/上下文。所以基本上在你的pom.xml中你可能有依赖声明为provided

在本地运行时,您不需要这些provided依赖项。只是取消注释并再次重建。

答案 11 :(得分:0)

我遇到了同样的错误。我想在我的Windows PC上安装spark,因此下载了没有hadoop版本的spark,但事实证明你需要hadoop库!所以下载任何hadoop spark版本并设置环境变量。

答案 12 :(得分:0)

我收到此错误,因为该文件是从Windows复制的。 使用

解决它
dos2unix file_name

答案 13 :(得分:0)

您应该在代码中添加以下jar:

  1. common-cli-1.2.jar
  2. hadoop-common-2.7.2.jar

答案 14 :(得分:0)

我认为你需要 maven 的 spark-core 依赖。对我来说效果很好。