【问题标题】:Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.CanSetDropBehind issue in ecllipse引起:java.lang.ClassNotFoundException: org.apache.hadoop.fs.CanSetDropBehind 在 ecllipse 中的问题
【发布时间】:2015-09-06 12:54:43
【问题描述】:

我有以下火花字数统计程序:

    package com.sample.spark;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import org.apache.spark.SparkConf;
    import org.apache.spark.api.java.*;
    import org.apache.spark.api.java.function.FlatMapFunction;
    import org.apache.spark.api.java.function.Function;
    import org.apache.spark.api.java.function.Function2;
    import org.apache.spark.api.java.function.PairFlatMapFunction;
    import org.apache.spark.api.java.function.PairFunction;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import scala.Tuple2;


    public class SparkWordCount {

        public static void main(String[] args) {
            SparkConf conf = new SparkConf().setAppName("wordcountspark").setMaster("local").setSparkHome("/Users/hadoop/spark-1.4.0-bin-hadoop1");
            JavaSparkContext sc = new JavaSparkContext(conf);
            //SparkConf conf = new SparkConf();
            //JavaSparkContext sc = new JavaSparkContext("hdfs", "Simple App","/Users/hadoop/spark-1.4.0-bin-hadoop1", new String[]{"target/simple-project-1.0.jar"});
            JavaRDD<String> textFile = sc.textFile("hdfs://localhost:54310/data/wordcount");
            JavaRDD<String> words = textFile.flatMap(new FlatMapFunction<String, String>() {
              public Iterable<String> call(String s) { return Arrays.asList(s.split(" ")); }
            });
            JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
                public Tuple2<String, Integer> call(String s) { return new Tuple2<String, Integer>(s, 1); }

            });

            JavaPairRDD<String, Integer> counts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
                  public Integer call(Integer a, Integer b) { return a + b; }
                });  
            counts.saveAsTextFile("hdfs://localhost:54310/data/output/spark/outfile");

        }


    }

当我从 ecllipse 运行代码时,我得到 Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.CanSetDropBehind 异常,但是如果我导出为可运行 jar 并从终端运行,如下所示:

      bin/spark-submit --class com.sample.spark.SparkWordCount --master local  /Users/hadoop/spark-1.4.0-bin-hadoop1/finalJars/SparkJar-v2.jar

maven pom 看起来像:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.sample.spark</groupId>
        <artifactId>SparkRags</artifactId>
        <packaging>jar</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>SparkRags</name>
        <url>http://maven.apache.org</url>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
            <dependency> <!-- Spark dependency -->
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.10</artifactId>
                <version>1.4.0</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>0.23.11</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-core</artifactId>
                <version>1.2.1</version>
                <scope>compile</scope>
            </dependency>
    </dependencies>
    </project>

【问题讨论】:

    标签: maven hadoop apache-spark word-count


    【解决方案1】:

    当您在 Eclipse 中运行时,引用的 jar 是您的程序运行的唯一来源。因此,由于某些原因,jar hadoop-core(即存在 CanSetDropBehind 的地方)没有从本地存储库中正确添加到您的 Eclipse 中。如果它是代理问题或任何其他与 pom.xml 相关的问题,您需要确定这一点。

    当您从终端运行 jar 时,运行的原因可能是由于引用的类路径中存在 jar。此外,在从终端运行时,您还可以选择将这些 jar 作为胖 jar(包括 hadoop-core)放在您的 jar 中。我希望您在创建 jar 时不要使用此选项。然后将从您的 jar 中选择引用,而不依赖于类路径。

    验证每个步骤,它将帮助您确定原因。快乐编码

    【讨论】:

    • 感谢 Ramzy 的输入。我使用“将所需库提取到生成的 jar”选项,这可能会创建一个胖 jar。
    • 酷,满意就采纳答案,或者可以等待更多答案。快乐编码
    • “代理问题”是什么意思。
    • 如果您在防火墙内,并且 maven 正在尝试从 Internet 获取 jar,您可能会遇到问题,因为它没有获取。所以你需要在 settings.xml 中添加允许获取 jars 的代理
    【解决方案2】:

    发现这是因为0.23.11版本的hadoop-common jar没有类,将版本更改为2.7.0并添加了以下依赖:

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.7.0</version>
        </dependency>
    

    然后摆脱了错误,但仍然看到以下错误:

    线程“main”中的异常 java.io.EOFException:本地主机之间的文件结束异常是:“mbr-xxxx.local/127.0.0.1”;目标主机是:“localhost”:54310; : java.io.EOFException;更多详情见:http://wiki.apache.org/hadoop/EOFException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多