6.MapReduce(1)

 本章节将分为InputFormat,split,OutputFormat三个小章节来介绍框架原理

1.InputFormat

1.1 切片

        将输入数据分成几份,每份交给一个MapTask去处理(getSplit方法)

        对于MapRedcue,切片发生在客户端,任务提交的时候

        机制:MapTask并行度决定机制

         切了多少片,就开启多少个MapTask

1.2 打碎:

      对于每一个MapTask要处理的那部分数据,InputFormat会将这部分数据打碎成行,从而交给Mapper去处理

     源码细节:

1.3 关于切片的源码剖析:(了解)

   (1)提交任务之前的准备工作:

          driver在向yarn提交任务之前,需要把jar包,切片,配置文件都拷贝到hdfs的临时目录

   (2) 查看切片细节:也就是上文提到的writeSplits()那一步

以上源码包含三个信息

  • 首先每个文件单独切片

  • 切片大小默认等于块大小,也就是128M

这样的话,数据需要通过网络传输到不同容器,占据太多带宽,导致别的任务的shuffle变慢 

  • 切片时按照切片大小的1.1倍判断,避免最后一块切片只有一丁点,浪费开销,所以如果最后剩余的小于12.8M,就会归到前一块处理

  • 切片大小的计算方式

 1.4 InputFormat多种实现类

FileInputFormat常见的接口实现类包括:

(1) TextInputFormat:

     按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量,LongWritable类型。 值是这行的内容,不包括任何行终止符(换行符和回车符) ,Text类型。
 ps.偏移量包括字母以及空格

(2)CombineTextInputFormat

核心:当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)

例子:

(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。

(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。

用途:CombineTextInputFormat用于小文件过多的场景

        如果小文件太多的话,还是用TextInputFormat进行切片,由于一个文件对应一个MapTask,因此会产生大量MapTask,会降低效率

代码:

放到dirver类中

// 如果不设置InputFormat,它默认用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);

//虚拟存储切片最大值设置20m
CombineTextInputFormat.setMaxInputSplitSize(job, 20971520);

2.Shuffle阶段

位置:位于mapper的后半截与reducer的前半截

作用排序和分区(把从map出来的一个切片数据输出成一个有序的K,V集合)

1.关于排序的解释:对于大文件经历的三次排序

关于(环形)缓冲区Buffer:一个高速存储介质,就好比内存可以做硬盘的缓存,就是在缓存区中存够的数据,然后一次性写入硬盘。在缓冲区内将k,v做一个快速排序,然后写到磁盘上。然后多次快排的结果进行一次归并排序,最终形成有序文件

每个mapTask最终都会形成一个有序的文件,最后都汇总给reduceTask,reduce拿文件前会将所有的文件再次归并操作,使得reduce处理之前形成一个完整有序的文件,最终reduce按照排列好的key进行处理

2.关于分区的解释:

         需要对map内部进行分区,分区的个数等于reduce的个数(如果一个reduce归并忙不过来,就开启多个reduce,此时需要把相同区内的key发到同一个reduce)

        需要在缓冲器中就完成分区,在分区中完成快排,然后溢写到磁盘后,把相同分区的归并到一个分区。

3.总结

shuffle有两个作用:

  1. 排序(为了分组):用到了快排与归并(一共三次)

    • 对于其中一个MapTask

      1. 数据经过Mapper处理,写到缓冲区

      2. 缓冲中的数据如果满了,快排后写到磁盘

      3. 多次写到磁盘的文件(全部内部有序),进行归并操作,得到完整的输出文件(MapTask输出)

    • 对于ReduceTask

      1. 将所有MapTask数据全部下载到本地,再次进行归并排序,得到完整的有序文件,给Reducer输入

  2. 分区(为了将数据分给多个ReduceTask)

    • 分区的个数取决于ReduceTask个数

    • MapTask从缓冲区开始就分区,排序是在分区内部排序,归并也对同一个分区进行归并

    • MapTask最终得到的是一个分区且区内按照key有序的输出文件

    • 有几个ReduceTask,就会将数据分成几个区,ReduceTask各自处理对应分区的数据

详细工作流程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值