hadoop之MapReduce

MR核心编程思想:

MR一般需要分成两个阶段,Map和reduce,map阶段,map task完全并行运行,互不干扰,reduce阶段,reduce task 完全不互相干,但是他们的数据依赖于上一个阶段的所有的map task输出的结果,

MR进程:

MrAppMaster:负责整个程序的过程调度,计算Maptask的个数
Maptask:负责map阶段的数据处理
Reducetask:负责reduce阶段的数据处理

【注】maptask的数目与切片的个数有关,一个切片就会生成一个maptask进程。切片时不考虑数据整体,逐个文件进行切片。


1.png

2.png

shuffle机制:


3.png

Partition分区:

默认是根据key的哈希值和reducetask的个数来返回一个分区号,key.hashCode()%reducetask的个数;

【注】
Reducetask的数目 > 分区个数 》》产生空文件
Reducetask的数目 < 分区个数 》》抛出异常 (一部分数据无处安放)
Reducetask的数目 = 1 》》 只有一个文件

排序:

部分排序:保证输出的每个文件内部有序
全排序:最终输出的结果文件只有一个,且内部有序,只设置一个reducetask
辅助排序(分组):在reduce端对key进行分组,应用于:在接受的key为bean对象时,想让一个或者几个字段的key进入到同一个reduce方法中。
二次排序:判断的条件有两个。

Combiner合并:

Combiner的父类是reduce,combiner和reduce的区别是运行的位置不同,combiner是在每一个maptask所在的节点运行,reduce是接收全局所有的mapper结果,combiner是对每一个maptask的输出进行局部汇总,以减少网络传输量。

【reducetask数目】
Reducetask = 0,表示没有reduce阶段,输出文件个数和maptask个数相同
Reducetask默认值是1,所以输出文件个数为一个
如果数据分布不均匀,可能在reduce阶段产生数据倾斜
如果分区的个数不是1,但是reducetask的个数是1,是否执行分区过程。答案是:不执行分区过程。因为在maptask的源码中执行分区的前提是先判断reducetask的个数是否大于1,不大于1是不会执行的。

OutputFormat:

textOutputFormat:把每条记录写为文本行,他的键和值可以是任意类型的。
SequenceFileOutputFormat:输出作为后续MapReduce任务的输入,输出格式紧凑,很容易被压缩。
自定义OutputFormat:实现控制最终文件的输出路径和输出格式。

InputFormat接口:

TextInputFormat:默认使用的实现类,一次读取一行,行的起始偏移量作为key,行内容作为value。
KeyValueTextInputFormat:每一行均为一条记录,被分隔符分隔开key和value,默认的分隔符是tab
NlineInputFormat:按照指定的行数N来划分切片。
CombineTextInputFormat:可以把多个小文件合并成一个切片进行处理
自定义InputFormat;

压缩技术:

采用压缩会减少磁盘I/O,但是同时增加了CPU的运算负担,可以提高性能也可以降低性能,原则:I/O密集型的任务多用压缩,运算密集型的任务少用压缩。

你可能感兴趣的:(hadoop之MapReduce)