MapReduce处理流程一
我试图着搞明白MapReduce的处理流程--或者叫运行流程。
1、先从单机的角度 粗粒度的看
数据处理程序 读入数据,进而进行数据处理,处理完成后写数据。
整体上看很简单,就三步:从源头读入数据、处理数据、写数据到目的地。
2、更细化的图
从1中的图我们大体能明白总体的流程,这是最简单模型。实际运行中并不是单机运行的,而是在分布式的多台机器上并行执行的。
2.1 多个机器并行执行: 问题就来了,分布式环境下多个机器如何访问共享文件。当然我们已经知道
Hadoop下是使用 HDFS处理的。所以我们看到 2 中的图的左边画出了 HDFS
的一个框。多个机器读取的源数据都是存在于 HDFS上的。
2.2 并行执行之切分 :并行执行 肯定要切分任务--- 把源数据切分为多个小块--也就是图中画的 data split
这个切分是由 InputFormat完成的。
2.3 并行执行的多个map: 这里的多个map处理--是多个进程。
Hadoop采用都是多进程模型。spark采用的是多线程模型。
多进程更容易控制资源占用,而多线程不太容易控制资源占用。
2.4 shuffle & sort : 多map产生的多个 中间结果进行进一步的处理。shuffle 意思为 洗牌---很形象。
2.5 进行reduce处理:对map的结果进行汇总操作。根据key 使用哈希算法 ,把不同的key的数据发送给
不同的reduce进行处理。
2.6 上面图中的一个问题: 应当是一个 split 对应一个 map 的。
3、显示更多细节
3.1 每个map处理时 都有自己的 内存缓冲区,默认大小是100M ,就是上图画的buffer in memory
部分。buffer--缓冲,缓冲一般是临时存储的,快要满时是要写到磁盘上的。占用的80%时会把
这占用的80%的数据写入磁盘。
3.2 map一直运行 就会一直往 buffer写放数据,buffer就会写到磁盘多个小文件。就是上面buffer
后面 画出来的 一摞三个框的 东西。我们看 每个框好像还有自己的结构。一个框中被竖线分
割成了多个 “区”。这里的区就是partition。相对于数钱的例子的话,这里的 一个partition就一
一沓相同面值的钱--10块的一沓 50 的一沓 100 的一沓,这三沓摞一块就是图中的一个小文
件。 为什么他们会整齐的分沓摞起来呢?--- 原来 buffer在向磁盘写文件时 并不是简单的原
样的把内容的中数据写入磁盘文件,而是写的时候有一个排序的过程。正式这个排序的处理
才是10块的汇聚到一沓里。
3.3 产生的多个 小文件并不会直接发送给 reduce处理,而是要再合并处理。同样这次合并也不是
原样的append。而是有一个归并排序的处理。把 各个一小沓10块的 汇聚成一大沓。
然后合并后产生的文件就是一个大的有序的文件。
3.4 多个map最终会产生多个merge后的文件。然后从 这多个merge后的文件中 取出相同 一沓10
块的发送( 实际上就是copy到reduce节点机器上)给 处理10块的钱的 reduce。