MapReduce是一种编程模型,用于大规模数据的并行运算。本文分析Hadoop中的MapReduce的工作原理。
MapReduce分为两个阶段:
- Map阶段
- Reduce阶段
现在以下面原始数据为例,解析MapReduce的运行流程
Welcome to Hadoop Class Hadoop Hadoop
Hadoop is good
Hadoop is bad
Wordcount完整的处理逻辑如下图所示:
- 第一层 Input
- 输入源
- 第二层 Input Splits
- 字符串分割,此时数据还在内存中
- 第三层 Mapping
- Mapper将数据转化为key->vale的形式,输出结果暂时会放在一个环形内存缓冲区中,内存溢出的时候会写入本地文件系统
- 第四层,combine
- Mapper将数据写入磁盘前,会执行sort和combine操作,为了减少写入磁盘的数据和方便reducer排序
- 第五层 Shuffling
- 将分区的数据拷贝给对应的reduce任务
- 第六层 Reducer
- 接收到数据以后,同样对数据进行排序和合并操作,最后再写入磁盘
- 第七层 Output
map->combine->reduce->output
分区相关
默认的分区方式是按key的hash值与int的最大值位(与)运算除以reduce数量的余数来分的
public int getPartition(K key, V value,int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
我们假设reduce的分区数量是4,则各个字段reduce分区如下
- Welcome 2
- to 3
- Hadoop 3
- Class 0
- is 2
- good 1
- bad 1
所以Mapper任务会将【Class】发送到Reduce-0任务,【good、bad】发送到Reduce-1任务,【is、Welcome】发送到Reduce-2任务,【Hadoop、to】发送到Reduce-3任务。当然我们也可以自定义分区方式。
参考网址:
https://www.guru99.com/introduction-to-mapreduce.html
https://blog.csdn.net/Gamer_gyt/article/details/47339755