第三章 MapReduce计算模型

3.1 为什么用MapReduce

分布式+海量数据

3.2 MapReduce计算模型

JobTracker,用户管理和调度工作

TaskTracker,用于执行工作

Job,每个个MapReduce任务被初始化为一个Job,每个Job又分为两个阶段,分别用Map函数和Reduce函数表示这两个阶段

InputSplit,存储的不是数据本身,而是一个分片长度和一个记录数据位置的数据

新的API包为org.appache.hadoop.mapreduce,旧API包为org.appache.hadoop.mapred

新/旧版API区别:

1、新,Mapper/Reducer为类,方便扩展,旧,Mapper/Reduce为接口

2、新API中广泛使用Context对象,并使用MapContext进行MapReduce间的通信

3、Job的配置统一由Configuration完成

4、Job类负责Job的控制,JobClient类被删除

WordCount程序执行流程图

1、按照TextInputFormat被处理成两个InputSplit,然后输入到两个Map中,Map程序会读取InputSplit指定位置的数据,然后交由Map函数处理

2、处理后的数据写入到本地磁盘,而不是HDFS,Map的数据在Job完成后可以删除

3、Reduce读取Map的输出作为自己的输入,合并value然后写入HDFS 

参照图3-2来对照图3-3WordCount程序


 

简单控制流:JobTracker调度任务给TaskTracker,TaskTracker执行任务时会把进度返回给JobTracker,JobTracker会记录进度的进行状况,如果某个TaskTracker上任务失败,JobTracker会把这个任务分配给另一个TaskTracker,知道任务完成。

3.3 MapReduce任务的优化

1、任务调度

优先将任务分配给空闲的机器,尽量将Map任务分配给InputSplit所在的机器,减少网络I/O消耗

2、数据预处理与InputSplit大小

MapReduce擅长处理少量大数据,不擅长处理大量小数据。在提交MapRedcue任务前可以先对数据进行一次预处理,将数据合并为少量大数据。一个block作为一个InputSplit,合理的设置block块大小。一个Map任务在一分钟左右比较合适

3、Map和Reduce任务的数量

Map/Reduce任务槽,是这个集群能够同时运行Map/Reduce任务的最大数量。例如:1200台的集群,设置每台机器可以运行10个Map任务,5个Reduce任务,这个集群的Map任务槽书为12000,Reduce任务槽为6000。一般Reduce任务数量是Reduce任务槽数的0.95或1.75倍,0.95时,如果一个Reduce任务失败,可以迅速找到一台空闲的机器重新运行这个任务,1.75时,执行速度快的机器可以获得更多的Reduce任务。

4、Combine函数

这是一个本地合并函数,WordCount程序中,词频最高的可能是“the”,每个Map任务肯那个产生千万个<the,1>记录,这些记录如果一一的传递给Reduce任务将会很耗时。可以通过Combine函数合并这些数据,减少网络I/O操作。可以使用Combine函数计算出这个block块中“the”的数量。



 5、压缩

可以选择对Map的输出或最终的输出进行压缩

6、自定义comparator

实现自定义类型时,自定义comparator来进行二进制流的比较,省去数据的反序列化

3.4 Hadoop流

 通过流的方式Hadoop可以支持任何语言编写Map/Reduce函数

P49

3.5 Hadoop Pipes

在Hadoop上运行C++程序的方法, Hadoop的流使用的是标准的输入/输出,Pipes使用的是Sockets

猜你喜欢

转载自mvplee.iteye.com/blog/2224480