Hadoop-----MapReduce 框架原理(重要)

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

在这里插入图片描述
在这里插入图片描述

OutputFormat

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值