MR中常用组件的介绍
- Mapper:map阶段核心的处理逻辑
- Reducer:reduce阶段核心的处理逻辑
- InputFormat:输入格式
- MR程序必须指定一个输入目录和一个输出目录
- InputFormat代表输入目录中的文件格式
– 如果是普通文件,可以用FileInputFormat
– 如果是SequenceFile(hadoop提供的一种序列化文件格式),可以使用SequenceFileInputFormat
– 如果是数据库中的数据,需要使用DBInputFormat
– 也可以自定义InputFormat
- RecordReader:记录读取器
- RR负责从输入目录中读取数据,然后封装为一组记录。
- RR对象一般由InputFormat创建
- OutputFormat:输出格式
- OutputFormat代表MR处理后的结果,以什么样的文件格式写出
– 将结果写出到一个普通文件中,可以使用FileOutputFormat
– 将结果写出到数据库中,可以使用DBOutputFormat
– 将结果写出到SequenceFile,可以使用SequenceFileOutputFormatS
– 也可以自定义OutputFormat
- OutputFormat代表MR处理后的结果,以什么样的文件格式写出
- RecordWriter:记录写出器
- RW负责将处理的数据以指定的格式写出到输出文件中
- Partitioner:分区器
- 负责在Mapper将数据写出,将输出的k-v对打上标记,进行分区
- 便于一个ReduceTask只处理一个分区的数据
MR中的数据处理流程
- InputFormat调用RecordReader,从输出目录的文件中,读取一组数据,封装为输入的k-v对对应的对象
- 将封装好的k-v对交给mapper的map方法,将处理的结果写出到map输出的k-v对中
- ReducerTask启动Reducer,使用Reducer的reduce方法处理Mapper写出的k-v
- OutputFormat调用RecordWriter,将reduce处理后的数据写出到文件中
MR数据处理流程举例
-
假设有两个文件:
./a.txt 200MB
./b.txt 100MB
-
Map阶段运行mapTask,将一个大的任务切分为若干个小的任务处理输出的结果
切片:默认的切片方式以文件为单位,切片大小即为块大小(128M)进行切片,故上述文件可以切分为以下三片:
split0:128M a.txt 0M-128M
split1:72M a.txt 128M-200M
split2:100M b.txt 0M-100M
-
运行mapTask进程,每个MapTask负责一个切片数据
split0:MT1
split1:MT2
split2:MT3
-
读取数据阶段
在MR中,所有的数据都必须被封装为k-v对的形式
- mapTask的1,2,3都会初始化一个InputFormat(默认为TextInputFormat),每个InputFormat对象负责创建一个RecordReader(默认为LineRecordReader)对象
- RecordReader负责从每个切片的数据中读取数据封装为k-v对
- LineRecordReader将偏移量作为key,将行的内容作为value
-
进入Maooer的map阶段
- 将数据依据map方法中的代码逻辑处理,输出k_out-v_out
-
针对不同的数据,分区器会将数据进行分区,有几个分区就有几个ReduceTask
-
在reduceTask阶段
1)copy:启动shuffle进程,从mapTask中拷贝相应分区的数据
2)sort:只负责为每个对应的分区数据进行归并排序
3)合并数据
4)调用OutputFormat中的RecordWriter将reducer输出的记录写出到文件中
-
-
至此,完成一次MR任务的数据处理流程