什么是MapReduce
MapReduce是一个分布式计算框架;
它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务;适用于大规模数据处理场景;每个节点处理存储在该节点的数据;每个 job 包含Map和Reduce两部分
MapReduce的设计思想
1、分而治之
- 简化并行计算的编程模型
2、构建抽象模型
- 开发人员专注于实现 Mapper 和 Reduce 函数
3、隐藏系统层细节
- 开发人员专注于业务逻辑实现
MapReduce特点
1、优点
- 易于编程
- 可扩展性
- 高容错性
- 高吞吐量
2、不适用领域
- 难以实时计算
- 不适合流式计算
MapReduce实现WordCount
MapReduce执行过程
1、数据定义格式
- map: (K1,V1) → list (K2,V2)
- reduce: (K2,list(V2)) → list (K3,V3)
2、MapReduce执行过程
- Mapper
- Combiner
- Partitioner
- Shuffle and Sort
- Reducer
Hadoop MR引擎
1、Job Tracker
- 运行在Namenode
- 接受客户端Job请求
- 提交给Task Tracker
2、Task Tracker
- 从Job Tracker接受任务请求
- 执行map、reduce等操作
- 返回心跳给Job Tracker
Hadoop YARN
分布式资源管理系统
- 支持更多的计算引擎,兼容 MapReduce
- 更好的资源管理,减少 Job Tracker 的资源消耗
- 将 Job Tracker 的资源管理分为 ResourceManager
- 将 Job Tracker 的作业调度分为 ApplicationMaster
- NodeManager 成为每个节点的资源和任务管理器
Hadoop及YARN架构
Hadoop2 MR在Yarn上运行流程
InputSplit(输入分片)
1、在map之前,根据输入文件创建inputSplit
- 每个InputSplit对应一个Mapper任务
- 输入分片存储的是分片长度和记录数据位置的数组
2、block和split的区别
- block是数据的物理表示
- split是块中数据的逻辑表示
- split划分是在记录的边界处
- split的数量应不大于block的数量(一般相等)
Shuffle阶段
- 数据从Map输出到Reduce输入的过程
Key&Value类型
1、必须可序列化(serializable)
- 作用:网络传输以及持久化存储
- IntWritable、LongWriteable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等
2、都继承了Writable接口
- 并实现write()和readFields()方法
3、Keys必须实现WritableComparable接口
- Reduce阶段需要sort
- keys需要可比较
MapReduce编程模型
InputFormat接口
1、定义了如何将数据读入Mapper
- InputSplit[] getSplits
- InputSplit表示由单个Mapper处理的数据
- getSplits方法将一个大数据在逻辑上拆分为InputSplit
- RecordReader<K,V> getRecordReader
2、常用InputFormat接口实现类
- TextInputFormat
- FileInputFormat
- KeyValueInputFormat
Mapper类
Mapper主要方法
- void setup(Context context)
org.apache.hadoop.mapreduce.Mapper.Context - void map(KEY key, VALUE value, Context context)
为输入分片中的每个键/值对调用一次 - void cleanup(Context context)
- void run(Context context)
可通过重写该方法对Mapper进行更完整控制
Combiner类
1、Combiner相当于本地化的Reduce操作
- 在shuffle之前进行本地聚合
- 用于性能优化,可选项
- 输入和输出类型一致
2、Reducer可以被用作Combiner的条件
- 符合交换律和结合律
3、实现Combiner
- job.setCombinerClass(WCReducer.class)
Partitioner类
1、用于在Map端对key进行分区
- 默认使用的是HashPartitioner
获取key的哈希值
使用key的哈希值对Reduce任务数求模 - 决定每条记录应该送到哪个Reducer处理
2、自定义Partitioner
- 继承抽象类Partitioner,重写getPartition方法
- job.setPartitionerClass(MyPartitioner.class)
Reducer类
Reducer主要方法
- void setup(Context context)
org.apache.hadoop.mapreduce.Reducer.Context - void reduce(KEY key, Iterable values, Context context)
为每个key调用一次 - void cleanup(Context context)
- void run(Context context)
可通过重写该方法来控制reduce任务的工作方式
OutputFormat接口