MapReducer
MapReducer简介
MapReduce是对google提出的分布式并行编程模型MapReduce论文的开源实现,以可靠,容错的方式运行在反不是文件系统HDFS上的并行处理数据的编程模型。MapReduce的优势在于处理大规模数据集。
MapReduce框架由单个主ResourceManager,每个集群节点一个nodeManager和每个应用程序的MRAppMaster组成。
MapReducer的核心思想
分而治之,移动计算、不移动数据。
MapReducer的设计理念是:计算向数据靠拢(移动计算),而不是数据向着计算靠拢(移动数据);因为移动数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以移动计算要比移动数据更加经济。
在一个集群中,只要有可能,MapReduce框架就会将Map程序就近的在HDFS数据所在的节点上运行,即将计算和存储放在一个节点上,从而减少节点之间数据移动的开销。正因为这样,MapReduce可以并行的进行处理,解决计算效率问题。
MapReduce任务过程分为两个阶段:map阶段和reduce阶段,每一个阶段都是以键值对作为输入和输出,其类型认为设定,在每个阶段都需要写一个函数,分别为map函数和reduce函数。
在执行MapReduce任务时,一个大规模的数据集会被划分成许多的独立等长的小数据块,称之为输入分片,简称分片。Hadoop的每一个输入分片分别构建一个map任务,并由该任务来运行用户自定义的map函数,从而处理分片中的每条记录,map任务处理后的数据,会继续作为reduce任务的输入,最终由reduce任务输出最终的结果,并写入分布式文件系统。
在MapReduce中存在数据的扭转:
数据扭转之Map阶段:
MapReduce程序分为两个阶段,第一个阶段为Map阶段,该阶段中有一个map函数,map函数的输入是一个<key,value>对,map函数的输出也是一个<key,value>对,他们的类型可以不同,参考下图:
数据扭转之Reduce阶段:
MapReduce的第二个阶段是Reduce阶段,该阶段的编程模型中,有一个reduce函数reduce函数的输入是一个<key,value>对,reduce函数的输出也是<key,value>对,这里需要注意的是,map阶段的输出作为了reduce阶段的输入,只不过map阶段的输出经过shuffle技术后变成了<key,List>,如下图所示:
MapReduce之WorldCount简要流程图如下:
1、MapReduce默认的情况下,一行数据对应一条记录,即读到"\n\r"才会认为这一条记录结束。
2、每条记录会被解析成<k1,v1>的形式,其中k1是行的偏移量,v1是行数据。
3、k1没用,我们不需要,我们只需要将v1截取成一个个的单词,分别设置为k2,v2设置为1。
4、经过shuffle技术后,转成每个单词作为k2,v2是1的集合,即List<v2>。
5、我们在reduce函数内,将List<v2>中多个1进行累加,再将k2当作k3,累加和作为V3写出去,即为<k3,v3>。
MapReduce之代码实现WordCount
Map
package com.cxl.mapReduce;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] words = value.toString().split(" ");
for(String i : words){
String word = i;