MapReduce 计算框架
一种分布式计算框架,解决海量数据的计算问题
MapReduce将整个并行计算过程抽象到两个函数
- Map(映射):对一些独立元素组成的列表的每一个元素进行指定的操作,可以高度并行。
- Reduce(化简 归约):对一个列表的元素进行合并。
一个简单的MapReduce程序只需要指定map()、reduce()、input和output,剩下的事由框架完成。
MR的由来
MapReduce最早是有Google公司研究提出的一个种面相大规模数据处理的并行计算模型和方法,设计初 主要是为了解决其公司所提供搜索引擎中大规模网页数据的并行化处理系统,MapReduce和GFS的论文 就发布了,所有就有了我们现在所使用的MapReduce。
MR优点
- MR易于编程,它提供一些简单统一的接口,可以放程序猿完成一个分布式程序,这个分布式程序可以运行 在大量廉价的PC机器上.
- 良好的扩展性:当计算资源不能满足的时候,可以通过简单的增加启动来扩展计算能力
- 高容错性:假如一台机器挂了,它可以上面的计算任务转移到另外一个节点上,不会影响任务导致失败,这 个过程需要人工干涉,后期版本的Hadoop提供自动干预
- MR适合的是PB级以上海量数据的离线数据处理
MR缺点
- MR不适合实时计算,因为内部计算逻辑,所以MR不能以最快的速度得到结果
- MR不适合计算流式,不适合计算实时数据(动态的数据),MR适合计算静态数据(固定数据)
- MR中没有涉及一个逻辑DAG(有向无环图),每个MR作业的输出结果都会写到磁盘,就会造成大量的IO,会 导致性能下降
MR相关概念
Job ,用户的每一个计算请求,称为一个作业。
Task ,每一个作业,都需要拆分开了,交由多个服务器来完成,拆分出来的执行单位,就称为任务。
Task分为MapTask和ReduceTask两种,分别进行Map操作和Reduce操作,依据Job设置的Map类和Reduce类
MR工作流程
map任务处理
- Input Split 分配给Map
- Map过程进行处理,Mapper任务会接收输入的分片,然后不断调用map方法,对记录进行处理,处理完毕 之后,转换为新的<key,value>输出(其中每一个分片对应一个map,一个map可以被调用多次来处理该分 片)
- Map的输出结果会缓存到内存里,当内存中buffer in memory当达到阈(yu)值(默认的80%),就会把记录 溢写到次磁盘文件中,然后用剩余的20%来继续接收数据。ps:优化map时可以调大buffer的阈值,缓存更多数据 特殊情况,当达到100%,此时缓冲就不会接受任何数据,直到缓冲区清空才会开始接受
- 内存中进行Partition(分区),默认是HashPartition ps:此hash采用 hash(key.hashcode() & Integer.MAX_VALUE) % munReduceTasks有多少个分区就会 有多少个reducetask 目的是将map的结果分给不同的reducer,有几个Partition就有几个reduce,partition的数据可以在job启 动的使用通过参数设置,可有让map的通过均匀的分配给不同的机器上的reducer,保证负载均衡
- 内存中partition结束之后,对于不同分区的数据,会按照key进行排序,这里key必须实现 WritableComparable接口,该接受实现了Comparable,因此才可以进行比较排序
- 对于排序之后的<key.value>会按照key进行分组,如果key相同,name相同key的<key,value>就会被分 到一个组中,最终,每个分组会调用一次reduce方法
- 排序分组结束之后,相同的key就在一起组成了一个类表,如果设置过Combiner,就合并数据,减少写入磁盘。ps:combiner本质即使一个reducer
- 当磁盘中的spill文件数目比规定的文件数据多的时候,会多次调用combiner,在不影响结果的情况 下,combiner可以被调用多次
- Map结束的时候会吧把pill出来的多个文件合并成一个,merge过程最多10个文件同时合并成一个文件, 多余的文件就多次调用merge
- Map端的shuffle完毕,数据都有序的存放到磁盘中,等待reducer来获取
reduce任务处理
- reducer的后台会被AppMaster指定的机器上将map的output拷贝到本地,先拷贝到内存,内存,满了就 拷贝磁盘
- Reducer采用Merge sort将来自各个map的数据进行merge,merge成一个有序的更大的文
- reduce端job开始,输入是shuffle sort过程所产生的文件
- reducer的输入文件,不断的merge后,他们会出现最终文件,这个最终文件可能存储在磁盘也可能在内存.
reduce方法就被自动执行当前这个文件的处理最终该处理结果放到HDFS上
Shuffle过程
先对数据进行切片,然后将数据传递给map,map的输出是内存缓冲区(圆形缓冲区),内存缓冲区默认大小 是100M,当 达到80%即0.8的时候将数据溢写到本地,剩余20%用于继续获取数据,在溢写到磁盘的时候会 执行partition(分区)和 sort(排序),然后对文件进行合并操作,合并完成之后 reducetask会启动线程去 mapTask拉取数据,然后进行文件合并, 并进行排序(归并),然后将小文件合并成一个大文件并调用reduce 方法完成最终输出效果