Spark是目前大数据生态中比较活跃的一个项目,但Spark是scala语言开发,scala语言语法灵活,能够写出优雅的函数式编程的代码。对于一般初学大数据的朋友来说,有可能大部分都是会java语言的,Spark支持scala,java,python api接口,但是如果使用java7或java6编写Spark应用就有点繁琐了,到处都是匿名类,你再看看scala代码,你会很羡慕,这时你可能要去学scala。对于老司机来讲,学习一门语言应该很快,也能够自由切换状态,但是新手就会比较有压力。如果你是初学者或只是Spark应用开发,而且只会java语言的话,那我建议你使用java8开发spark应用,而不要去从头学习scala,等你成为老司机或者需要深入研究Spark的时候再去学习Scala也可以。重要是你能够快速的用spark解决你的大数据问题,能够先把spark用起来。
我们来几段代码对比一下,经典的wordcount:
scala版:
val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
java7/6版:
JavaRDD<String> textFile = sc.textFile("hdfs://...");
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://...");
这么一个小例子,你就可以发现scala 用3行代码,而java要10几行代码。作为java忠实粉丝有点不甘心,呵呵。
我们用java8 试一试:
JavaRDD<String> textFile = sc.textFile("hdfs://...");
JavaPairRDD<String, Integer> counts = textFile.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
.mapToPair(w -> new Tuple2<String, Integer>(w, 1))
.reduceByKey((x,y) -> x + y);
counts.saveAsTextFile("hdfs://...");
跟scala比还是差点,但也挽回不少颜面。所有说你用java8也可以写出比较优雅的Spark应用。
java8支持lambda表达式和Stream API等新特性,java8 变得更灵活,java7已经停止更新,hadoop社区也在增加java8 的支持,相信不就将来java8将称为主流。如果对java8 感兴趣可以下面两篇文章: