Hadoop 分布式计算框架(MapReduce)。
MapReduce设计理念:
- 分布式计算
- 移动计算,而不是移动数据
MapReduce计算框架
步骤1:split
split切分Block,得到很多数据片段例如图中的split0, split1, split2。
步骤2:map
有多少个片段,就有多少个map,map是一个Java线程。
线程为硬件和对象。
数据按照键值对的形式传给map。
map执行完毕,输出是键值对格式。
步骤3:shuffle
步骤4:reduce
reduce线程
reduce task
在一个MapReduce任务中,默认情况下Reduce task只有一个。
步骤5:
part
MapReduce示例
Mapper
-Map-reduce的思想就是"分而治之"
Mapper负责"分",即把复杂的任务分解为若干个"简单的任务"执行
- "简单的任务"的含义:
数据或者计算规模相对于原任务要大大减小;
就近计算,即会被分配到存放了所需数据的节点进行计算
这些小任务可以并行计算,彼此间几乎没有依赖关系
Reducer
- 对map阶段的结果进行汇总。
- Reduce的数据由mapred-site.xml配置文件里的项目mapred.reduce.tasks决定。缺省值为1,用户可以覆盖。
Shuffler
- 在mapper和reducer中间的一个步骤
- 可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理。
- 可以简化reducer过程
默认的partion算法是,根据每一个数据中的key的hashcode / reduce数量得到分区号。
- 每个map task都有一个内存缓冲区(默认是100MB),存储着map的输出结果
- 当缓冲区快满的时候需要将缓存区的数据以一个临时文件的方式存放到磁盘
- 溢写是单独线程来完成,不影响往缓冲区写map结果的线程(spill.percent,默认是0.8)
- 当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)
– 假如client设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘 的数据量。(reduce1,word1,[8])。
– 当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并(Merge),对于“word1”就是像这样的:{“word1”, [5, 8, 2, …]},假如有Combiner,{word1 [15]},最终产生一个文件。
– reduce 从tasktracker copy数据
– copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置
– merge有三种形式:1)内存到内存 2)内存到磁盘 3)磁盘到磁盘。merge从不同tasktracker上拿到的数据,{word1 [15,17,2]}
MapReduce的Split大小
– max.split(100M)
– min.split(10M)
– block(64M)
– max(min.split,min(max.split,block))
任何一个碎片段的大小不能超过Block。
YARN
由ResourceManager、NodeManager、JobHistoryServer、Containers、Application Master、job、Task、Client组成。
ResourceManager:一个Cluster只有一个,负责资源调度、资源分配等工作。
NodeManager:运行在DataNode节点,负责启动Application和对资源的管理。
JobHistoryServer:负责查询job运行进度及元数据管理。
Containers:Container通过ResourceManager分配。包括容器的CPU、内存等资源。
Application Master:ResourceManager将任务给Application Master,然后Application Master再将任务给NodeManager。每个Application只有一个Application Master,运行在Node Manager节点,Application Master是由ResourceManager指派的。
job:是需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。job也可以叫作Application。
task:一个具体做Mapper或Reducer的独立的工作单元。task运行在NodeManager的Container中。
Client:一个提交给ResourceManager的一个Application程序。
二、一个job运行处理的整体流程
用户向YARN中提交作业,其中包括Application Master启动、Application Master的命令及用户程序等;ResourceManager为作业分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动该作业的Application Master;Application Master首先向ResourceManager注册,这样用户可以直接通过ResourceManager查询作业的运行状态,然后它将为各个任务申请资源并监控任务的运行状态,直到任务结束。Application通过RPC请求想ResourceManager申请和领取资源。
然后ApplicationMaster要求指定的NodeManager节点启动任务。
启动之后,去干ResoucrceManager指定的Map task。
等Map task干完之后,通知Application Master。然后Application Master去告知Resource Manager。接下来Resource Manager分配新的资源给Application Master,让它找人去干其他的活。
接下来Application Master通知NodeManager启动新的Container准备干新的活,该活的输入是Map task的输出。
开始干Reduce task任务。
等各个节点的Reduce task都干好了,将干活的NodeManager的任务结果进行同步。做最后的Reduce任务。
等计算完了,最后将最终的结果输出到HDFS。
任务完成!
YARN参考文章:http://davidbj.blog.51cto.com/4159484/1671064