您的位置:首页 > 运维架构

Hadoop学习记录---MapReduce并行计算模型之介绍

2018-01-10 23:04 405 查看

目录:

1、简单说明

2、任务角色

3、任务流程

4、优化

简单说明

MapReduce分为Map和Reduce阶段,一个任务会先将输入的数据切分成独立的小块,被Map任务在DataNode中处理,实现分布处理,然后将Map任务的结果汇总到Reduce任务中做进一步汇总处理,最后输出。因为Hadoop是将计算放在数据节点上,而不是数据放在数据节点,所以计算和存储结点相同。

任务角色

MapReduce任务有两个角色,一个是JobTracker,一个是TaskTracker。JobTracker用于管理和调度工作的,TaskTracker用于执行工作,一个Hadoop集群只有一个JobTracker,JobTracker调度任务给TaskTracker执行,TaskTracker执行返回进度报告,JobTracker记录任务的进行状况,若失败,则交由其他TaskTracke执行。

3、任务流程

每个MapReduce任务被初始化为一个Job,每个Job又分为两个阶段,Map和Reduce,所有的输入和输出都是
<key,value>
,先将数据经由InputFormat进行split处理,然后到Map,Map阶段接收一个
<key,value>
的输入,然后产生同样
<key,value>
形式的中间段输出,这个输出在本地存储,将具有相同key值的数据集合在一起,
<key,{value1,value2...value}>
,传给Reduce阶段,然后处理输出结果,这个结果存到HDFS。

Job的初始过程。调用Job进行初始化,使用setJobName来命名Job,setJarByClass(),设置输入输出路径setInputPath()和setOutputPath(),使用setMapperClass()、setReducerClass()设置两个阶段的函数,使用setOutputKeyClass()、setOutputValueClass来设置输出的键值对的类型。

TextInputFormat是默认的输入格式,每个文件会被单独作为Map的输入,每行数据会生成一条记录。

默认的输出格式是TextOutputFormat,会将每条记录以一行的形式存入文本文件。

Map类继承Mapper接口,接口有四个参数,输入的key和value,输出的key和value,然后实现map方法。

Reduce类继承Reduce接口,也有四个参数。

4、Partition分区处理

分区处理在Mapper之后,Reduce之前,主要是把Mapper的中间输出结果分给Reduce。

HashPartitoner使用hash函数来对Mapper的输出进行分区。

int getPartition(K key,V value,int numReduceTasks){
return (key.hashCode() &
4000
; Integer.MAX_VALUE)% numReduceTasks;
}


使用key的哈希码和Reduce的数量来产生分区号。



BinaryPartitioner二进制分区



这个处理的key是BinaryComparable字节可比较类型的,使用BinaryComparable的key的getBytes()方法可以返回对应数组的的一部分求出对应的分区号(Return representative byte array for this instance)。

5、MapReduce计算模型的优化

1、任务调度

把任务分给空闲的机器,分享系统资源,减少I/O消耗。

2、数据预处理与InputSplit的大小

处理前对数据进行预处理,合并数据,设置Map的输入数据大小调节运行时间。因为一个Block会作为一个InputSplit,所以要控制Block的大小。

3、Map和Reduce任务的数量

任务槽是集群能同时运行MapReduce的最大任务数量,Map数量就看Map运行时间来设置,Reduce数量就基于不同考虑设置,设置0.95或者1.75倍。

4、combine

使用Combine函数来合并本地数据,减少网络传输I/O的数据量以减少消耗,可以使用setCombineClass(xxx.class)来指定combine类。

5、压缩
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐