Amazon Elastic MapReduce上的Spark Java错误NoClassDefFoundError

时间:2014-06-16 13:56:54

标签: java mapreduce apache-spark emr

我正在尝试在Amazon的Elastic MapReduce(EMR)上实现并运行Spark应用程序。到目前为止,我已经能够使用" Spark安装"来部署和运行集群。使用以下链接进行引导操作:

  

S3://elasticmapreduce/samples/spark/0.8.1/install-spark-shark.sh

可以从this互联网方向访问该脚本。

为了将.jar应用程序上传到集群,我创建了一个步骤配置如下:

 HadoopJarStepConfig customConfig = new HadoopJarStepConfig()
                 .withJar("s3://mybucket/SparkApp.jar")
                 .withMainClass("SparkApp.java");

 StepConfig customJarStep = new StepConfig()
                 .withName("Run custom jar")                                                                                    
                 .withActionOnFailure(ActionOnFailure.CONTINUE)
                 .withHadoopJarStep(customConfig);

最后,以下代码显示了从Spark团队提供的wordcount示例中提取的实际Spark应用程序(适用于0.8.1版本)。您可能会注意到,代码导入了不同的spark库以便能够运行应用程序。这些库是:

  

火花core_2.9.3-0.8.1-incubating.jar    (和)   阶库-2.9.3.jar

import scala.Tuple2;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;

import java.util.Arrays;
import java.util.List;

public class SparkApp {
  public static void main(String[] args) throws Exception {

    JavaSparkContext ctx = new JavaSparkContext("local", "JavaWordCount",
        System.getenv("SPARK_HOME"), System.getenv("SPARK_EXAMPLES_JAR"));
    JavaRDD<String> lines = ctx.textFile("c3://murquiabucket/wordcount.txt", 1);

    JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
      public Iterable<String> call(String s) {
        return Arrays.asList(s.split(" "));
      }
    });

    JavaPairRDD<String, Integer> ones = words.map(new PairFunction<String, String, Integer>() {
      public Tuple2<String, Integer> call(String s) {
        return new Tuple2<String, Integer>(s, 1);
      }
    });

    JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
      public Integer call(Integer i1, Integer i2) {
        return i1 + i2;
      }
    });

    List<Tuple2<String, Integer>> output = counts.collect();
    for (Tuple2 tuple : output) {
      System.out.println(tuple._1 + ": " + tuple._2);
    }
    System.exit(0);
  }
}

当我尝试在EMR集群中执行jar(我制作了一个胖jar来嵌入必要的库)时,问题出现了。由于以下错误,应用程序终止失败:

  

线程中的异常&#34; main&#34; java.lang.NoClassDefFoundError:   org / apache / mesos / Scheduler at   java.lang.ClassLoader.defineClass1(原生方法)......

根据我的理解,Mesos存在一个问题,我无法理解。如果此信息有帮助,则这是EMR群集的信息:

  • AMI版本:2.4.2
  • Hadoop发布:亚马逊1.0.3
  • Spark Version:0.8.1
  • Scala版本:2.9.3

1 个答案:

答案 0 :(得分:0)

正如@samthebest在上述评论中指出的那样,错误实际上是由于EMR和我的应用程序上Spark版本的错误不匹配。

我从这个错误中学到的是,检查自定义应用程序执行中使用的所有库和应用程序使用与集群相同的版本是非常重要的。