转载请注明出处:http://blog.csdn.net/c602273091/article/details/70854487
MapReduce优化小结
一般来说有结构上的优化和算法上的优化。结构上的优化【1】【2】就比如修改调度器(scheduler),修改key-value pairs,这样来减少key的数量进行shuffle,这样的优化就是使用诸如MapWritable进行存储,这样就可以减少key的存储数量。进行shuffle和sort的时候就更快。MapReduce的基本介绍【9】【3】【6】【12】。Hadoop的Context的基本使用【4】Context是MapReduce里面的数据流模型,比如我们把数据写入mapper,经过shuffle和sort以后,在reducer里面就可以对mapper写入的数据进行使用。在最后context的内容会写入输出文件。Text【14】(hadoop中的string API)
另外一种呢就是算法的优化,算法的优化可以使得精度降低,但是速度大大提高。我跑的程序在aws上花了90分钟,使用结构上的优化可以到达60分钟,但是算法上的优化最后在aws上跑了8分钟,真正跑的时间那就更少了。所以可以看出优化还是使用算法优化见效更快。
MapWritable的使用
【5】【7】【8】
在Writable这里,我举一个我最近写的计算hashtag similarity的例子。包含了mapper、combiner、reduce。
Mapper的写法:
package mapred.hashtagsim;
import java.io.IOException;
import java.util.*;
import java.lang.*;
import mapred.util.Tokenizer;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.MapWritable;
import org.apache.hadoop.mapreduce.Mapper;
public class HashtagMapper extends Mapper<LongWritable, Text, Text, MapWritable> {
@Override
protected void map(LongWritable key, Text value,
Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] words = Tokenizer.tokenize(line);
MapWritable tags_map = new MapW