什么是MapReduce
MapReduce是一个分布式计算框架
它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务
起源于Google
适用于大规模数据处理场景
每个job包含Map和Reduce两部分
MapReduce设计思想
分而治之
简化并行计算的编程模型
构建抽象模型:Map和Reduce
开发人员专注与实现Mapper和Reducer函数
隐藏系统层细节
MapReduce特点
优点
易于编程、可拓展性、高容错性、高吞吐量
不适用领域
难以实时计算、不适合流式计算
使用MapReduce实现WordCount
流程图如下
MapReduce执行过程
数据定义格式
map:(K1,V1) -> list(K2,V2)
reduce:(K2,list(V2)) -> list(K3,V3)
MapReduce执行过程
Mapper
Combiner
Partitioner
Shuffle and Sort
Reducer
Hadoop V1 MR引擎
Job Tracker
运行在Namenode
接受客户端Job请求
提交给Task Tracker
Task Tracker
从Job Tracker接受任务请求
执行map、reduce等操作
返回心跳给Job Tracker
Hadoop V2 YARN
YARN的变化
支持更多的计算引擎,兼容MapReduce
更好的资源管理,减少Job Tracker的资源消耗
将Job Tracker的资源管理分为ResourceManager
将Job Tracker的作业调度分为ApplicationMaster
NodeManager称为每个节点的资源和管理任务
Hadoop及YARN架构
Hadoop2 MR在YARN上运行流程
InputSplit(输入分片)
在map之前,根据输入文件创建inputSplit
每个InputSplit对应一个Mapper任务
输入分片存储的是分片长度和记录数据位置的数组
block和split的区别
block是数据的物理表示
split是块中数据的逻辑表示
split划分是在记录的边界处
split的数量应不大于block的数量(绝大多数情况下相等)
Shuffle阶段
数据从Map输出到Reduce输入的过程
Key&Value类型
必须可序列化(serializable)
作用:网络传输以及持久化存储
IntWritable、LongWriteable、FloatWriteable、Text、
DoubleWriteable、BooleanWriteable、NullWriteable等
都继承了Writeable接口
并实现write()和readFiled()方法
Keys必须实现WriteableComparable接口
Reduce阶段需要sort
keys需要可比较
MapReduce编程模型
InputFormat接口
定义了如何将数据读入Mapper
InputSplit[] getSplits
InputSplit表示由单个Mapper处理的数据
getSplits方法将一个大数据在逻辑上拆分为InputSplit
RecordReader<K,V>getRecordReader
常用InputFormat接口实现类
TextInputFormat
FileInputFormat
KeyValueInputFormat
Mapper类
Mapper主要方法
void setup(Context context)
org.apache.hadoop.mapreduce.Mapper.Context
void map(KEY key,VALUE value,Context context)
为输入分片中的每个键/值对调