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任务肯那个产生千万个
可以选择对Map的输出或最终的输出进行压缩
6、自定义comparator
实现自定义类型时,自定义comparator来进行二进制流的比较,省去数据的反序列化
3.4 Hadoop流
通过流的方式Hadoop可以支持任何语言编写Map/Reduce函数
P49
3.5 Hadoop Pipes
在Hadoop上运行C++程序的方法, Hadoop的流使用的是标准的输入/输出,Pipes使用的是Sockets