MapReduce的原理简言之,是把一些数据通过Map和reduce两个阶段得出我们自己想要的数据,Map阶段主要是把数据分解(split)开来,把复杂的问题分解成若干“简单的任务”,Reduce阶段主要是合并阶段,把求解出来的数据通过某种方式(在工作中主要是“user_id”、“product_id”等等)组合排列起来(groupBy、sortBy等等),在工作中我们需要处理代码的部分是图中黑色部分的“map”和“reduce”,在现有框架下进行工作。
MR的流程
一、环节悉知:
1.file:文件存储在HDFS中,每个文件且分为多个一定大小的Block(默认大小64M,备份3份),存在各个节点上(DataNode),
2.inputformat:MR框架基础类之一,其作用是①数据分割(data split)②记录读取器(record reader)
3.map:记录文档(“今天天气不错”),调用一次map(“今天天气不错”),在内存中增加数据
4.shuffle:partition、sort、split、merge、combiner、copy、memery,disk等(调优的主要部分)
①partition:决定数据以哪个reducer处理,从而分区
②memerybuffer:内存缓存区,每个map的结果和partition处理的key value结果都保存在缓存中,默认大小100M,溢写 80%
③spill:内存缓存区达到阈值时,溢写spill线程锁住80M的缓冲区,开始将数据写到磁盘中,然后释放内存。
④sort:排序
⑤combiner:合并
二、shuffle机制
在这个流程中,比较容易出错的是从map到reduce中间的shuffle过程,shuffle的性能高低直接影响了整个程序的性能和吞吐量。
Shuffle是MapReduce框架中的一个特定的phase,介于Map phase和Reduce phase之间,当Map的输出结果要被Reduce使用时,输出结果需要按key哈希,分发到每一个Reducer上去,这个过程就是shuffle。由于shuffle涉及到了磁盘的读写和网络的传输,因此shuffle性能的高低直接影响到了整个程序的运行效率。
在Hadoop, 在mapper端每次当memory buffer中的数据快满的时候, 先将memory中的数据, 按partition进行划分, 然后各自存成小文件, 这样当buffer不断的spill的时候, 就会产生大量的小文件。
所以Hadoop后面直到reduce之前做的所有的事情其实就是不断的merge, 基于文件的多路并归排序,在map端的将相同partition的merge到一起, 在reduce端, 把从mapper端copy来的数据文件进行merge, 以用于最终的reduce
多路归并排序, 达到两个目的。merge, 把相同key的value都放到一个arraylist里面;sort, 最终的结果是按key排序的。
这个方案扩展性很好, 面对大数据也没有问题, 当然问题在效率, 毕竟需要多次进行基于文件的多路归并排序,多轮的和磁盘进行数据读写。
执行流程