我是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/