我正在尝试在Amazon的Elastic MapReduce (EMR)上实现和运行Spark应用程序。到目前为止,我已经能够使用以下链接部署和运行一个带有"Spark Installation"引导操作的集群:
s3://elasticmapreduce/样本/火花/0.8.1 install-spark-shark.sh
脚本可以从这个internet方向访问。
为了将.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库来运行应用程序。这些库是:
spark-core_2.9.3-0.8.1-incubating.jar(和)scala-library-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来嵌入必要的库)时,问题就出现了。由于以下错误,应用程序终止失败:
main线程异常java.lang.NoClassDefFoundError:org/apache/mesos/Scheduler在java.lang.ClassLoader.defineClass1(Native Method)…
据我所知,Mesos有一个问题,我无法理解。如果这些信息有帮助,下面是EMR集群的信息:
- AMI版本:2.4.2 Hadoop发行版:Amazon 1.0.3
- Spark版本:0.8.1
- Scala版本:2.9.3
正如@samthebest在上面的评论中指出的那样,这个错误实际上是由于EMR上的Spark版本和我的应用程序不匹配。
我从这个错误中学到的是,检查在执行自定义应用程序时使用的所有库和应用程序是否与集群使用相同的版本是非常重要的。