我是Apache Spark,Scala和Hadoop工具的新手。

我已经设置了一个新的本地单节点Hadoop集群(如here所述),还设置了spark,以提供对该Hadoop环境的引用,如here所示。

我能够验证spark-shell,spark UI是否已启动并正在运行。另外,我可以使用localhost查看HDFS。

为了更进一步,我将示例文件上传到HDFS,并使用Hadoop localhost验证了该文件是否可用。

现在,我尝试使用Java和spark-shell(Scala)计算文件中的行数,但是两次调用均因此堆栈跟踪而失败。

Exception in thread "dag-scheduler-event-loop" java.lang.NoClassDefFoundError: org/apache/hadoop/mapred/InputSplitWithLocationInfo
at org.apache.spark.rdd.HadoopRDD.getPreferredLocations(HadoopRDD.scala:329)
at org.apache.spark.rdd.RDD$$anonfun$preferredLocations$2.apply(RDD.scala:274)
at org.apache.spark.rdd.RDD$$anonfun$preferredLocations$2.apply(RDD.scala:274)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.preferredLocations(RDD.scala:273)
... removed ...

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapred.InputSplitWithLocationInfo
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 32 more

Java代码(我正在使用spark-submit来指定包含此代码的jar)
public static void main(final String... args) {
SparkConf conf = new SparkConf().setAppName("hello spark");

JavaSparkContext ctx = new JavaSparkContext(conf);

JavaRDD<String> textload = ctx.textFile("README.md" );

System.out.println(textload.count());
}

pom.xml依赖项
<dependencies>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.2.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.4.0</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapred</artifactId>
    <version>0.22.0</version>
</dependency>


</dependencies>

通过Spark Shell在命令行上使用Scala代码
sc.textFile("README.md").count

版本详细信息
Hadoop 2.4.0
斯卡拉2.11.8
Java 1.8
Apache Spark 2.2.1

我在这里想念什么?

最佳答案



然后,您应该使用每种的最新,稳定版本。首先,请下载包含Hadoop的最新Spark。
hadoop-mapred是已弃用的软件包,您不应使用两个不同版本的Hadoop库。这就解释了为什么您会收到ClassNotFoundException

如果从第二个链接下载了Spark,则它包含大于2.4的Hadoop版本,并且这些库包含在Spark类路径中,因此无论如何您都不应将它们添加到POM中。找到Java quickstart POM

我还将指出,在尝试对其运行Spark之前,您应该实际上应该使HDFS正常工作(假设您需要使用Hadoop而不是独立的Spark)。

但是您完全不需要Hadoop从Spark shell运行spark.textFile("README.md" ).count

关于java - 尝试使用Spark Shell对本地HDFS上托管的文件中的行进行计数时出现HadoopRDD错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50996848/

10-09 17:06
查看更多