Hadoop的MapReduce的工作原理

MapReduce是一种编程模型,用于大规模数据的并行运算。本文分析Hadoop中的MapReduce的工作原理。
MapReduce分为两个阶段:

  1. Map阶段
  2. 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

Welcome to Hadoop Class Hadoop Hadoop
Hadoop is good
Hadoop is bad
Welcome to Hadoop Class Hadoop Hadoop
Hadoop is good
Hadoop is bad
Welcome 1
Welcome 1
Welcome 1
to 1
Hadoop 1
Class 1
Hadoop 1
is 1
good 1
Hadoop 1
is 1
bad 1
Welcome 1
to 1
Hadoop 3
Class 1
Hadoop 1
is 1
good 1
Hadoop 1
is 1
bad 1
Class 1
good 1
bad 1
Welcome 1
is 1
is 1
Hadoop 3
Hadoop 1
Hadoop 1
to 1
Reduce-0:
Class 1
Reduce-1:
good 1
bad 1
Reduce-2:
Welcome 1
is 2
Reduce-3:
Hadoop 5
to 1
Class 1
good 1
bad 1
Welcome 1
is 2
Hadoop 3
to 1

分区相关

默认的分区方式是按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

发布了9 篇原创文章 · 获赞 1 · 访问量 3402

猜你喜欢

转载自blog.csdn.net/y1006597541/article/details/103423399