MapReduce 框架原理
大概数据流向
input ----- mapper ------reducer------------output
*inputFormat 将输入数据变成一行一行
***shuffle :实现从mapper 杂乱—reducer (多个单词合并成一个)分好组过程(把k.v值做整理)
*outputformat :由k,v值到—到output 文件过程
(重点)地图:
一** InputFormat 数据输入
----把文件切片
**把数据写成一行一行(变成K,v)**
1 把文件切片
1—将数据切换----(一个数据太大)切成几块就启动多少maptask 处理他
2—1G----切成8块 每块 128/1KB 切成 1块
数据切片与MapTask 并行度决定机制
yarn-优化策略 :尽量本地启动—在存储第一个节点启动一个mapTask…在存储200~300M 启动MapTask
但是这会出现一个问题,仍产生网络流量传输(网络IO 也是一个资源–抵消性能资源)
===应该128M 切就不会产生(尽量不)网络(流量)资源
概况
1-一个job 的Map 阶段 并行度由客户端在提交job 时的切片数决定
2 每一个split 切片分配一个 MapTask 并行实例处理
3 默认情况下 切片大小=BlockSize
4 切片时不考虑数据集整体,而是逐个针对没一个文件单独切片
FileInputFormat 切片源码解析
2CombineTextInputFormat (小文件切片机制)
框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。
1、应用场景:
CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
2、虚拟存储切片最大值设置
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。
3、切片机制
生成切片过程包括:虚拟存储过程和切片过程二部分
切片机制
(1)虚拟存储过程:
将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。
(2)切片过程:
(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
(c)测试举例:有4个小文件大小分别为1.7M、5.1M、3.4M以及6.8M这四个小文件,则虚拟存储之后形成6个文件块,大小分别为:
1.7M,(2.55M、2.55M),3.4M以及(3.4M、3.4M)
最终会形成3个切片,大小分别为:
(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M
3 自定义inputFormat
4 总结
inputFormat ===切片+切片—>k,v 模式(RecordReader)
默认切片规则 :FileInputFormat
实现切片成k,v 值:TextInputFormat 返回类型 LineRecordReader
二 Shuffle
归并排序:
A,B 对比 谁小放C里 然后放C里的 假如是A里面数 ,A 就下移一位,然后拿下移那位和B 继续比较,最后得出C 就是已经排序好的
1*** Shuffle 机制
概述
Map 方法--------以快排方式进行第一次排序(在环形缓存区内进行100M---->溢出分组,------在从内存到磁盘进行combiner–分组排序组合(快排 在内存中进行)---------第二次排序是在磁盘里进行(归并排序(combiner)–有序的在磁盘里进行)----------按照相同KEY分组------------>REDUCE 方法(3次分组-前两次是启动combiner归并 最后是reducer方法进行合并)---------第二图是在reduer里进行总归并排序
2 Partition 分区
map 并行度 由切片决定
Reduce 并行度 是手设决定–job.setNumReduceTasks(int)
分区与ReduceTasks 之间关系呢???
===>最好等于
分区数据<ReduceTasks ====>浪费资源
反之:-------->丢失数据
分区号不能跳—要么资源浪费,要么数据丢失
默认分区
默认是根据ReduceTasks 数据量分区
Interger.MAX_VALUE : 防止出现负数 (分区没有 -1 )
分区总结
3 排序
把想排序的东西放在key 位置—我们框架是自动帮我们完成排序 ----强制
4 Combiner
**减少map端网络输出量/io (磁盘输出也减小) **
梳理 MapReduce框架
待处理文件200M----submit前根据参数配置形成一个任务分配(切快(2))-----根据切快生成两个MapTasks
默认输入是以TextInputFormat 进行切片,以RecorderReader 每一行读–>K,v(1)--------经过mapper 逻辑运算 -->(K,v(1))----输出写入环形缓存区(内存)-----溢出文件进行【分区】----【分区】快速排序有序(内存)-----在写入磁盘时候进行combiner 合并-------写入磁盘文件再combiner【归并】排序有序(在磁盘进行)(【3次分组】-前两次是启动combiner 最后是reducer方法进行合并)这些都是在mapper 里进行
Combiner 定义
使用前提
1- 不能影响最终业务逻辑
2-用不用combiner 输出kv 要和reducer 输出 k,v 对应起来
反例
Reducer 与Combiner 区分
Reducer ------ 进行全局合并-----合并原理GroupingComparation分组 合并
Combiner ------只对mapper 做合并----只在mapper阶段
5 GroupingComparation 分组归并
在reducer 里执行
分组和读数据是同时进行边读边分组
三 OutputFormat数据输出
让reduce 输出k,v 值是我们想要的 文本文件
Join 多种应用
Reduce Join : join 工作放在reduce 完成 在磁盘中完成
Map Join:一张表/多张表十分小(在内存) ,一张表不一定很小 用在做输出数据
数据清洗:
根因:分区而来,(shuffle 很吃性能,没有shuffle 就没有数据清洗)
四 MapReduce 开放总结
InputFormat
Mapper
Comparable 排序
Combiner 合并
Reduce