【问题标题】:HadoopRDD error while trying to count lines in a file hosted on local HDFS using spark shell尝试使用 spark shell 计算本地 HDFS 上托管的文件中的行数时出现 HadoopRDD 错误
【发布时间】:2018-12-02 10:58:53
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

    标签: java scala apache-spark hadoop bigdata


    【解决方案1】:

    我是 Apache Spark、Scala 和 Hadoop 的新手

    那么您应该使用每个版本的最新、稳定版本。对于初学者,请下载包含 Hadoop 的最新 Spark。

    hadoop-mapred 是一个已弃用的包,您不应使用两个不同版本的 Hadoop 库。这就解释了为什么你会得到 ClassNotFoundException

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

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

    但是你根本不需要 Hadoop 从 Spark shell 运行 spark.textFile("README.md" ).count

    【讨论】:

    • 这些是我所在的稳定和基础设施支持的版本,不是我控制的。我不认为我在使用两个不同版本的 Hadoop,我下载了没有 Hadoop 的 Spark,并提供了 2.4.0 版本的 Hadoop。是的,我的 HDFS 和 Hadoop 集群单独运行良好,我可以获取 localhost 并且还可以看到上传的文件。在现实世界中,我想访问一个 HDFS 文件并使用 Spark 进行一些转换。因此,我正在尝试使用 spark-shell / Java 来模仿 HDFS 上的示例文件。希望这是有道理的!我该如何继续?
    • 另外,我将 hadoop 和 map-red 添加到我的 pom 依赖项的唯一原因是看它是否解决了问题,但不幸的是它没有。鉴于此,我该如何使用 hadoop-mapred ?如果您需要任何其他详细信息,请告诉我。
    • 我从未在 Hadoop 低于 2.6 的情况下运行 Spark,但您正在使用两个不同的版本。您不能将 0.22 库与 2.4.0 一起使用...无论您从哪里提取这些版本,它们都必须相同。您应该只需要 Hadoop 客户端,其中包括 mapreduce 和 hdfs 依赖项mvnrepository.com/artifact/org.apache.hadoop/hadoop-client/… 除此之外,您甚至没有在文件路径中使用 HDFS 前缀,因此您只是从运行 Spark 的目录中读取文件
    • 就像我说的,根据mvnrepository.com/artifact/org.apache.spark/spark-core_2.11/…,Spark Core 2.2.1 已经包含 Hadoop 2.6.5,所以降级并不是一个好主意
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2020-08-18
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多