MapReduce深入分析
Hadoop中MapReduce提供的主要是离线端的数据分析。根据其原理,可以将其分为两个阶段
1. Map
2. Reduce阶段
Hadoop在MapReduce设计方面主要有两个重要思想:
- 化整为零,分而治之。
- 数据加工终端化。数据在终端加工要比数据传输后再加工节省资源。
输入输出分析
InputFormat
InputSplit是Hadoop定义的用以 传送每个单独的map的数据,InputSplit存储一个分片长度和一个记录数据位置的数组。当数据传送给map时,map 将分片信息传送到InputFormat。InputFormat.RecordReader( )生成RecordReader,RecorderReader.createKey( ).createValue( )生成map可以处理的< k, v >。
InputFormat子类主要有
- BaileyBorweinPlouffe.BbpinputFormat
- ComposableInputFormat
- CompositeInputFormat
- DBInputFormat
- DisSum.Macine.AbstractInputFormat
- FileInputFormat *
其中FileInputFormat是Hadoop默认的输入方式,其子类包括
- CombineFileInputFormat
- KeyValueTextInputFormat
- NLineInputFormat
- SequenceFileInputFormat
- TeraInputFormat
- TextInputFormat
TextInputFormat以及其子类数据记录格式为
OutputFormat
OutputFormat类似于InputFormat,默认为TextOutputFormat,
输出格式为
Mapper 工作方式
Mapper通常用来处理输入格式转化、投影、过滤等。例如在Hadoop-examples.wordcount,Mapper将输入分割之后的TextInputFormat进行本地化的数据清洗和加工。
MapReduce优化
- 任务调度。将任务优先分配给空闲的机器,将map任务分配给InputSplit所在的机器,减少I/O消耗。
- 数据处理和InputSplit。MapReduce擅长处理少量的大数据,处理大量小数据时会消耗较多时间。因此可以在MapReduce任务前对数据进行整合,从而提升MapReduce执行效率。Map任务通常来说,最佳运行时间在1min左右比较合适。可以通过设置Map输入数据的大小调解Map运行时间。FileInputFormat会处理每个block后将其作为一个InputSplit。合理调解block块大小也可以提升执行效率。合理设置Map任务数量也可以提升性能。
- Map和Reduce任务数量。Map/Reduce任务槽是这个集群能同时运行Map/Reduce任务的最大数量。如:一个1200机器集群,每台机器最多同时运行10个map任务,5个reduce任务,这个集群map任务槽为1200,Recue任务槽为600。可以通过设置Reduce任务数量均衡负载,Reduce任务数量提高,资源利用率提高;Reduce任务数量降低,任务响应效率提高。
- combine。MapReduce处理后的文件输出在本地。*combine可以在本地将中间数据*合并,可以极大降低网络I/O消耗。
job.setCombinerClass(combine.class)
- 压缩。计算机处理能力>网络传输效率。可以有效减少网络上数据传输量。
- 自定义Comparator.可以二进制比较,省区数据序列化和反序列化时间。
MapReduce一般用于处理一些较为简单的数据,若处理过程复杂,有必要考虑Pig,Hive或Cascading。