MapReduce
什么是MapReduce
Hadoop MapReduce is a software framework for easily writing applications which process vast amounts of data (multi-terabyte data-sets) in-parallel on large clusters (thousands of nodes) of commodity hardware in a reliable, fault-tolerant manner.
MapReduce是一个软件框架,用于简单地书写并行处理海量数据(数TB的数据)的应用,在标准服务器搭建的大型的集群(数千个节点)上,以一种可靠的,容错的方式。
MR的主要思想
MR主要思想:分久必合
MapReduce是由两个阶段组成:
Map端
Reduce端
MR核心思想:“相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算
MR分布式计算原理
处理流程
map task
- 假设需要处理的文件存在HDFS中(以block的形式)
- 文件以split切片的形式输入进map函数进行处理
split默认和block同样大小,是一种逻辑上的存储结构。实际在划分时,一条数据可能被切分在两个block中,split会将这条数据在下一个block中的部分抽取出来补充完整,所以实际的split大小可能略大或略小于block。一个split对应一个map。 - map一条一条的读取数据(以(偏移量,值)KV对的形式)
偏移量,即索引号,从0开始,若第一条数据所占字节数N,则下一行的偏移量即key从N+1开始,以此类推 - map将处理后的结果输出到memory的buffer中(自定义的key,处理后的value),并在输出时为每一条记录打上标签,即分区号
目的:为了让这条数据知道将来被哪一个reduce处理
分区是由分区器进行的,默认的分区器是HashPartitioner
分区的策略:根据key的hashcode与reduce的个数取模,根据取模结果分组 - 数据一条一条的写入buffer,一旦写入到80M,就会将数据溢写到磁盘上
到80M时,内存会将这80M封锁,对内存中的数据进行combiner(小聚合),并根据分区号、key进行排序,写到磁盘上的是一个文件内分好区,区内有序的小文件。
封锁内存时由剩余的20M内存继续接收map的输出
每一次溢写会产生一个小文件 - map task全部计算完毕后,会将磁盘上的小文件合并为一个大文件
合并的时候会进行combiner,并采用归并排序的算法,将众多小文件合成一个内部分区且分区内有序的大文件
reduce task
- reduce task从map端读取对应分区的数据,写入到内存中,内存写满就溢写到磁盘上
写策略与map端相同,默认情况下内存为660M,封锁后可用内存为40M 。溢写前也会进行排序,当把所有的数据取过来后,会将溢写产生的小文件归并排序并合并。 - 每一组数据(key相同)调用一次reduce函数计算产生结果
总结
- 共执行两次combiner,四次排序,目的都是为了最后提高分组的效率
- 数据从Map出到进入Reduce的过程称为Shuffle
Shuffle内包含combiner(小聚合)、spill(溢写)、merge(合并) - 在map task的阶段称为shuffle write,在reduce task的阶段称为shuffle read
即Map ==> Shuffle write | | Shuffle read ==> Reduce
MR应用的执行流程
MapReduce框架 ⇒ Application ⇒ 资源调度器 ⇒ 任务调度器 ⇒ 分布式并行计算
Hadoop 1.x
在hadoop 1.x版本,MapReduce自带资源管理器JobTracker,同时担任任务调度器
流程图
角色
- JobTracker
核心,主,单点
调度所有的作业
监控整个集群的资源负载 - TaskTracker
从,自身节点资源管理
和JobTracker心跳,汇报资源,获取Task - Client
作业为单位
最终提交作业到JobTracker
弊端:
JobTracker:负载过重,单点故障
资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
不同框架对资源不能全局管理,会出现资源抢夺问题
Hadoop 2.x
Hadoop 2.0新引入的资源管理系统YARN(Yet Another Resource Negotiator)
YARN的引入,使得多个计算框架可运行在一个集群中,其他框架应用程序只需实现yarn的ApplicationMaster
目前多个计算框架可以运行在YARN上,比如MapReduce、Spark、Storm等
核心思想:
将MRv1中JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现
流程图
- client会获取到每一个block的(三个)位置,此时若判断这三个位置上资源不够,则获取同机架上一个节点,若同机架上没有空闲节点,则获取一台随机节点。
- yarn-child会向AM返回任务进度信息,再返回给客户端展示实时进度
- map task运行完产生大文件传输到reduce中,reduce应在同一个节点上
角色
- ResourceManager
负责整个集群的资源管理和调度 - ApplicationMaster
负责应用程序相关的事务,比如任务调度、任务监控和容错等
每个MapRduce作业对应一个AppMaster
YARN将资源分配给AppMaster
AppMaster进一步将资源分配给内部的任务 - NodeManager
与RM汇报资源
管理Container生命周期 - Container
是申请的资源,不是进程
由NodeManager启动线程监控Container大小 - Client
请求资源创建AM
与AM交互
容错机制
AppMaster失败后,由YARN重新启动
任务失败后,AppMaster重新申请资源