MapReduce类型
map:(k1,v1)->(k2,v2)
partition:(K2,V2)->Integer
combine:(K2,list(V2))->(K2,list(V2))
reduce(k2,list(v2))->list(k3,v3)
java接口代码
public interface Mapper<K1,V1,K2,V2> extends JobConfigurable,Closeable{
void map(K1 key,V1 value,OutputCollector<K2,V2> output,Reporter reporter) throws IOException;
}
public interface Reducer<K2,V2,K3,V3> extends JobConfigurable,Closeable{
void reduce(K2 key,Iterator<v2> values,OutputCollector<k3,V3> output,Reporter reporter) throws IOException;
}
默认MapReduce作业
JobConf conf =
conf.setInputFormat(TextInputFormat.class); //LongWritable,Text
conf.setNumMapTask(1);//真正Map任务的数量将取决于输入文件的大小及文件块的大小(split)
conf.setMapperClass(IdentityMapper.class);
conf.setMapOutputRunnerClass(MapRunner.class);//map任务是由MapRunner负责运行的,回调map函数
conf.setMapOutputKeyClass(LongWritable.class);
conf.setMapOutputValueClass(Text.class);
conf.setPartitionerClass(hashPartitioner.class);
conf.setNumReduceTask(1);
conf.setReducerClass(IdentityReducer.class);
conf.setOutputKeyClass(LongWritable.class);
conf.setOutputValueClass(Text.class);
conf.setOutputFormat(TextOutputFormat.class);
JobClient.runJob(conf);
输入格式
InputSplit 长度getLength() 和存储位置getLocations()
长度用来排序分片,以便优先处理最大的分片,从而最小化作业运行时间
存储位置:以便map任务尽量放在分片数据附近。
InputFormat负责产生输入分片并将它们分割成记录
getSplits(JobConf job,int numSplits) 产生分片传递给jobtracker,分配给taskTracker,map任务(MapRunner)把输入分片传递给getRecordReader()方法
RecordReader<K,V> getRecordReader(InputSplit split,JobConf job, Reporter reporter);
MapRunner中部分代码
K key = reader.createKey();
V value = reader.createValue();
while(reader.next(key.value)){
mapper.map(key,value,output,reporter);//回调所写的map函数
}