MapReduce
参考资料:
https://www.jianshu.com/p/0f83097c0c9e
https://www.jianshu.com/p/9351f2514f75
https://www.jianshu.com/p/5564ee3c885c
https://www.jianshu.com/p/db9210b6a493
https://www.jianshu.com/p/306745907fa9
现在无论前端还是后端都有很多地方提到了MapReduce。
那么什么是mapReduce?
MapReduce是一种编程模型,"Map(映射)“和"Reduce(归约)”。适用于大数据下分布式并行计算
按照规定完成Map(分发数据)和Reduce(处理数据)两部分工作,就可以快速得出结果。
想象一个场景:
有一个篮球场一样大的果篮,里面有苹果、香蕉、葡萄、圣女果等等。现在要统计出来各水果都有多少颗。如果果篮很小的时候,一个人就可以处理,一个一个数就可以,但是篮球场这么大的果篮(数据量较大,远非一个人就可以处理的)。
map - reduce就是为了处理这种问题的一个解决方案。
MapReduce主要分为2个任务: map reduce
Map任务
key/value
对作为输入,产生另外一系列 key/value
对作为中间输出写入本地 磁盘。这些中间数据按照 key 值进行聚集,且 key 值相同(用户可 设定聚集策略,默认情况下是对 key 值进行哈希取模)的数据被统一交给 reduce() 函数处理。
对应到我们上面的场景就是,把不同的水果都挑出来并且放在一起。这里面我们就是按照水果类型做为key进行水果的聚集。
Reduce任务
以 key 及对应的 value 列表作为输入,经合并 key 相同的 value 值后,产 生另外一系列 key/value 对作为最终输出
三个组件
-
InputFormat:指定输入 文件格式。将输入数据切分成若干个 split,且将每个 split 中的数据解析成一个个 map() 函数 要求的 key/value 对。
-
Partitioner:确定 map() 函数产生的每个 key/value 对发给哪个 Reduce Task 函数处 理。
-
OutputFormat:指定输出文件格式,即每个 key/value 对以何种形式保存到输出文件中。
Map-Reduce 任务过程
-
数据分片过程(input split),数据分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组。每个分片针对一个map任务。
-
map
就是程序员编写好的map函数了,因此map函数效率相对好控制,而且一般map操作都是本地化操作也就是在数据存储节点上进行。 -
combiner
其实也是一种reduce操作,做可以做局部运算、去重等操作。Combiner是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作。当然这个阶段不是一定会执行,是可选的阶段 -
shuffle
这个阶段是对map输出的大量数据排序,这个对内存开销是很大的。map在做输出时候会在内存里开启一个环形内存缓冲区,这个缓冲区专门用来输出的,默认大小是100mb,并且在配置文件里为这个缓冲区设定了一个阀值,默认是0.80,同时map还会为输出操作启动一个守护线程,如果缓冲区的内存达到了阀值的80%时候,这个守护线程就会把内容写到磁盘上,这个过程叫spill,另外的20%内存可以继续写入要写进磁盘的数据,写入磁盘和写入内存操作是互不干扰的,如果缓存区被撑满了,那么map就会阻塞写入内存的操作,让写入磁盘操作完成后再继续执行写入内存操作。外部排序。 -
reduce
输出最终结果。输入 --> map --> shuffle --> reduce -->输出
Partitioner,Combiner,Shuffle分别位于哪个阶段中?
-
Partitioner:数据分组 决定了Map task输出的每条数据交给哪个Reduce Task处理。默认实现:hash(key) mod R R是Reduce Task数目,允许用户自定义,很多情况下需要自定义Partitioner ,比如“hash(hostname(URL)) mod R”确保相同域名的网页交给同一个Reduce Task处理 属于(map)阶段。
-
Combiner:可以看做
local reduce
合并相同的key对应的value,通常与reducer逻辑一样 ,好处是减少map task输出 数量(磁盘IO),见少Reduce-map网络传输数据量(I网络IO) 结果叠加属于(map)阶段。 -
Shuffle:Shuffle描述着数据从map task输出到reduce task输入的这段过程 (完整地从map task端拉取数据到reduce 端。在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。减少磁盘IO对task执行的影响。
) 属于(reduce)阶段。
下面的图片是参考资料里面的MapReduce工作原理原理