MapReduce原理及编程
MapReduce简介
MapReduce概念
- 1、MapReduce是一个分布式计算框架
它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务。
起源于Google - 2、适用于大规模数据处理场景
每个节点处理存储在该节点的数据 - 3、每个job包含Map和Reduce两部分
MapReduce的设计思想
- 1、分而治之
简化并行计算的编程模型 - 2、构建抽象模型:Map和Reduce
开发人员专注于实现Mapper和Reducer函数 - 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 V1 MR引擎
- 1、Job Tracker
运行在Namenode
接受客户端Job请求
提交给Task Tracker - 2、ask Tracker
从Job Tracker接受任务请求
执行map、reduce等操作
返回心跳给Job Tracker
Hadoop V2 YARN
Hadoop及YARN架构
Hadoop2 MR在Yarn上运行流程
InputSplit(输入分片)
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接口
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)
OutputFormat接口
分布式缓存机制(Distributed Cache)
- 1、在执行MR时向集群中的任务节点发送只读文件
分发第三方库(jar等)
共享一些可以装载进内存的文件
进行类似join连接时,小表的分发 - 2、符号连接(#)
推测执行
- 1、问题
程序bug或负载不均时,部分任务成为短板
如:100个map任务中的99个完成,剩下1个停留10% - 2、使用推测执行启动备份任务
取最先完成的作为最终结果
利用资源来换取时间的一种优化策略
资源很紧张时不适用