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

目录:

1、简单说明
2、任务角色
3、任务流程
4、优化

  1. 简单说明

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

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

3、任务流程

每个MapReduce任务被初始化为一个Job,每个Job又分为两个阶段,Map和Reduce,所有的输入和输出都是,先将数据经由InputFormat进行split处理,然后到Map,Map阶段接收一个的输入,然后产生同样形式的中间段输出,这个输出在本地存储,将具有相同key值的数据集合在一起,,传给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() & Integer.MAX_VALUE)% numReduceTasks;
    }

使用key的哈希码和Reduce的数量来产生分区号。
Hadoop学习记录---MapReduce并行计算模型之介绍_第1张图片

BinaryPartitioner二进制分区
Hadoop学习记录---MapReduce并行计算模型之介绍_第2张图片
这个处理的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、压缩

你可能感兴趣的:(hadoop)