产生的原因:抛出java.lang.ClassNotFoundException:org.apache.hadoop.fs.CanSetDropBehind问题ecllipse
我有下面的火花字计数程序:产生的原因:抛出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>
在eclipse中运行时,引用的jar文件是程序运行的唯一源代码。所以这个jar hadoop-core(即CanSetDropBehind存在的地方),由于某些原因,在你的eclipse中从本地存储库中没有正确添加。如果它是一个代理问题,或者使用pom,则需要识别此问题。
从终端运行jar时,运行的原因可能是由于引用的classpath中存在jar。同时,从终端运行时,您也可以选择将这些罐子作为胖罐(将hadoop核心包含在您的罐子中)。我希望你在创建你的jar时不使用这个选项。然后,引用将从您的jar中取出,而不依赖于类路径。
验证每一步,它将帮助您找出原因。快乐编码
发现这是造成的,因为在版本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
感谢Ramzy为您的输入。我使用“提取所需的库到生成的jar”选项,可能会创建一个胖罐子。 – ragesh
很酷,如果您满意,请接受答案,或者等待更多答案。快乐编码 – Ramzy
“代理问题”是什么意思? – ragesh