2015-06-20 49 views
0

我有下面的火花字计数程序:产生的原因:抛出java.lang.ClassNotFoundException:org.apache.hadoop.fs.CanSetDropBehind问题ecllipse

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"); 

     } 


    } 

我得到的产生的原因:java.lang中。 ClassNotFoundException的:

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

Maven的POM样子:当我从ecllipse运行代码但是如果我导出为可运行罐子,从终端运行如下它的工作原理org.apache.hadoop.fs.CanSetDropBehind例外

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

回答

1

在eclipse中运行时,引用的jar文件是程序运行的唯一源代码。所以这个jar hadoop-core(即CanSetDropBehind存在的地方),由于某些原因,在你的eclipse中从本地存储库中没有正确添加。如果它是一个代理问题,或者使用pom,则需要识别此问题。

从终端运行jar时,运行的原因可能是由于引用的classpath中存在jar。同时,从终端运行时,您也可以选择将这些罐子作为胖罐(将hadoop核心包含在您的罐子中)。我希望你在创建你的jar时不使用这个选项。然后,引用将从您的jar中取出,而不依赖于类路径。

验证每一步,它将帮助您找出原因。快乐编码

+0

感谢Ramzy为您的输入。我使用“提取所需的库到生成的jar”选项,可能会创建一个胖罐子。 – ragesh

+0

很酷,如果您满意,请接受答案,或者等待更多答案。快乐编码 – Ramzy

+0

“代理问题”是什么意思? – ragesh

1

发现这是造成的,因为在版本0.23.11类Hadoop共同罐子没有阶级,改变了版本2.7.0,并还增加了以下的依赖:

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

了摆脱了错误,但仍然看到下面的错误:

线程“主”异常java.io.EOFException:文件结束本地主机之间的异常是:“mbr-xxxx.local/127.0.0.1”;目的地主机是:“localhost”:54310; :java.io.EOFException;欲了解更多详情,请参阅:http://wiki.apache.org/hadoop/EOFException

相关问题