1.MapReduce
1.1工作流程
按照时间顺序包括:
输入分片(input split)、
map阶段、
combiner阶段、
shuffle阶段
和 reduce阶段。
①输入分片阶段
在进行map计算之前,mapreduce会根据输入文件计算输入分片(input split),每个输入分片(input split)针对一个map任务 输入分片(input split)存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组,输入分片(input split)往往和hdfs的block(块)关系很密切。
②map阶段
程序员编写好的map函数了,因此map函数效率相对好控制,而且一般map操作都是本地化操作也就是在数据存储节点上进行。
③Combiner阶段
是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作。
例如我们对文件里的单词频率做统计,map计算时候如果碰到一个hadoop的单词就会记录为1,但是这篇文章里hadoop可能会出现n多次,那么map输出文件冗余就会很多,因此在reduce计算前对相同的key做一个合并操作,那么文件会变小,这样就提高了宽带的传输效率,毕竟hadoop计算力宽带资源往往是计算的瓶颈也是最为宝贵的资源,但是combiner操作是有风险的,使用它的原则是combiner的输入不会影响到reduce计算的最终输入。
④shuffle阶段
将map的输出作为reduce的输入的过程就是shuffle了。
⑤reduce阶段
和map函数一样也是程序员编写的,最终结果是存储在hdfs上的。
</br></br>
1.2参数意义
map的方法
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {…} 这里有三个参数, 前面两个Object key, Text value就是输入的key和value, 第三个参数Context context这是可以记录输入的key和value。
reduce函数的方法
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {…} reduce函数的输入也是一个key/value的形式, 不过它的value是一个迭代器的形式Iterable<IntWritable> values, 也就是说reduce的输入是一个key对应一组的值的value,reduce也有context和map的context作用一致。
</br>
2.FileInputFormat
FileInputFormat和FileOutputFormat可以设置输入输出文件路径,mapreduce计算时候,输入文件必须存在,要不直Mr任务直接退出。输出一般是一个文件夹,而且该文件夹不能存在。
</br>
3.InputSplit
InputSplit是在map端,在InputSplit中含有DataNode中的数据,每一个InputSplit都会分配一个Mapper任务,Mapper任务结束后产生<K2,V2>的输出,这些输出先存放在缓存中,每个map有一个环形内存缓冲区,用于存储任务的输出。默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spil l.percent),一个后台线程就把内容写到(spill)Linux本地磁盘中的指定目录(mapred.local.dir)下的新建的一个溢出写文件。
4.sort去重算法
①Map
②Reduce