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

Posted

技术标签:

【中文标题】执行 spark-shell 时出现 NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream【英文标题】:NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream when execute spark-shell 【发布时间】:2015-06-18 04:24:18 【问题描述】:

我已经下载了不带 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

我在网上搜了一下,据说spark-env.cmd中还没有设置HADOOP_HOME。但我在 spark 安装文件夹中找不到 spark-env.cmd。 我跟踪了 spark-shell 命令,似乎那里没有 HADOOP_CONFIG。我尝试在环境变量上添加 HADOOP_HOME,但它仍然给出相同的异常。

其实我并没有真正使用 hadoop。我按照this question中的建议下载了hadoop作为解决方法

我使用的是 Windows 8 和 Scala 2.10。

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

【问题讨论】:

我遇到了同样的问题,然后我安装了 hadoop-2 并且它工作正常。 【参考方案1】:

Spark 的构建名称中的“无 Hadoop”具有误导性:这意味着构建不依赖于特定的 Hadoop 发行版,而不是意味着在没有它的情况下运行:用户应该指出在哪里可以找到 Hadoop(参见 @ 987654321@)

解决此问题的一种干净方法是:

    获取 Hadoop Windows 二进制文件。理想情况下构建它们,但这很痛苦(有关一些提示,请参阅:Hadoop on Windows Building/ Installation Error)。否则谷歌一些,例如目前你可以从这里下载 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 放在与 Spark 基本文件夹位于同一级别的 conf 文件夹中(可能看起来很奇怪),或者放在由 SPARK_CONF_DIR 环境变量指示的文件夹中。

【讨论】:

我按照spark.apache.org/docs/latest/hadoop-provided.html 中描述的步骤选择了第一种情况,“hadoop”二进制文件在您的路径上,但我仍然遇到同样的问题。我已经在我的环境变量中添加了 HADOOP_HOME,这就是为什么我看不出有任何理由在脚本中设置这个变量。能给我一些想法为什么这个问题仍然出现? 我理解我的问题,但我有一个问题:是否可以像在 linux bash 文件中一样在 windows cmd 文件 $(hadoop classpath) 中调用? @Ray 希望我能提供帮助,但我不是专家,我只能说上面的方法对我有用......我确信有一种方法可以自动调用“hadoop 类路径” spark-env.cmd 以避免手动复制/粘贴,但我没有调查它。祝你好运! 它应该可以工作,类路径在这里定义:github.com/apache/spark/blob/…【参考方案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)

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

1- 如果你的 PATH 上有 hadoop

2- 你想显式显示 hadoop 二进制文件

3-你也可以显示hadoop配置文件夹

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

【讨论】:

【参考方案3】:

我也有这个问题,

export SPARK_DIST_CLASSPATH=`hadoop classpath`

解决了这个问题。

【讨论】:

完全有帮助【参考方案4】:

我在尝试熟悉 spark 时遇到了同样的错误。我对错误消息的理解是,虽然 spark 不需要运行 hadoop 集群,但它确实需要一些 hadoop 类。因为我只是在玩 spark 并且不在乎使用什么版本的 hadoop 库,所以我只是下载了一个使用 hadoop (2.6) 版本预先构建的 spark 二进制文件,一切都开始正常了。

【讨论】:

【参考方案5】:

进入SPARK_HOME -> conf

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

【讨论】:

感谢您的回复.. 知道我应该修改哪个变量吗?我也将其重命名为 spark-env.cmd,因为我使用的是 Windows 并添加了“set HADOOP_CONF_DIR=*path”,但它给出了相同的异常.. 首先,尝试在 spark-env.cmd 中设置 HADOOP_HOME 并重新运行它,但如果同样的问题仍然存在,则将 hadoop-common jar 文件导出到同一配置文件中的 spark 类路径中。 我已经设置了 HADOOP_HOME 并将 hadoop-common.jar 复制到 lib 和 conf 文件夹.. 但仍然没有运气:( 不要只是复制传递他们的类路径 - 例如。导出 SPARK_CLASSPATH=$SPARK_CLASSPATH:hadoop-common.jar【参考方案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】:

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

到:

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

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

【讨论】:

【参考方案9】:

您应该在代码中添加这些 jar:

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

【讨论】:

【参考方案10】:

非常感谢。效果很好,但是我还必须将 spark jar 添加到类路径中: ;c:\spark\lib* 此外,cmd文件的最后一行缺少“echo”这个词;所以它应该说: 回声 %SPARK_CMD%

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

我的情况

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

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

dos2unix file_name

【讨论】:

【参考方案15】:

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

【讨论】:

以上是关于执行 spark-shell 时出现 NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 spark-shell 错误 - 如果不使用 hadoop,可以忽略它吗?

在 Mac 上本地启动 spark-shell 时出错

执行 try 块时出现缩进错误

尝试执行存储过程时出现意外错误

执行 Terraform 执行计划时出现凭据失败

执行impdp时出现的各种问题