Spark是一款通用集群计算框架,和Hadoop的MapReduce类似。由于其提供的抽象更简单,性能和功能上比Hadoop强不少。
它已经越来越流行了。
如果是新的项目,或者是为了学习,那么选择Spark完全没问题。
不过对于一些使用了MapReduce的项目来说,迁移就稍微复杂一些了。
Hadoop自身
Hadoop的使用在不断扩大,但同时越来越多的实践证实了MapReduce并不是通用计算范例。
Hadoop的架构本身为其他可能的替代方案提供了场所,比如Impala项目等等。
而对于Hadoop来说,有一部分Hadoop的实现本身和MapReduce本身的抽象并不一致。
- Mapper和Reducer总是使用键值对作为输入输出
- Reducer处理的级别是键
- Mapper和Reducer的对象的生命周期跨越了多个map()和reduce(),同时还支持了setup()和cleanup()
Spark
Spark也是众多替代方案中的一种。
但是对于已经部署在生产环境的项目而言,一句替代方案是不够的,对于一些实时计算的系统更是这样。
好在利用Spark实现类似MapReduce的模型是完全可行的。同时实现本身还可以更简单,并在大部分情况下更快。
对于MapReduce模型本身,使用Spark来实现反而显得更亲近,毕竟Scala的编码风格和API对于本身源于LISP的MapReduce抽象更接近。
键值对和元组
从最基础的例子来看,如果需要计算一个大型文本文件每一行的长度,对于Hadoop MapReduce来说由于输出是键值对,那么就会使用长度作为键,以1为值。
publicclass LineLengthMapper extends Mapper<LongWritable,Text,IntWritable,IntWritable> {
protectedvoidmap(LongWritable lineNumber, Text line, Context context)
throws IOException, InterruptedException {
context.write(new IntWritable(line.getLength()),new IntWritable(1));
}
}
LineLengthMapper…


