4、yarn与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式运算程序(mapreduce只是其中的一种),比如mapreduce、storm程序,spark程序...只要他们各自的框架中有符合yarn规范的资源请求机制即可。
6、Yarn是一个通用的资源调度平台,企业中存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享。
7、Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序。
MapReduce与Yarn客户端的配置信息mapreduce.framework.name为yarn时,客户端会启动YarnRunner(yarn的客户端程序),并将mapreduce作业提交给yarn平台处理。
1.向ResourceManager请求运行一个mapreduce程序。
2.ResourceManager返回hdfs地址,告诉客户端将作业运行相关的资源文件上传到hdfs。
3.客户端提交mr程序运行所需的文件(包括作业的jar包,作业的配置文件,分片信息等)到hdfs上。
4.作业相关信息提交完成后,客户端用过调用ResourcrManager的submitApplication()方法提交作业。
5.ResourceManager将作业传递给调度器,调度器的默认调度策略是先进先出。
6.调度器寻找一台空闲的节点,并在该节点隔离出一个容器(container),容器中分配了cpu,内存等资源,并启动MRAppmaster进程。
7.MRAppmaster根据需要运行多少个map任务,多少个reduce任务向ResourceManager请求资源。
8.ResourceManager分配相应数量的容器,并告知MRAppmaster容器在哪。
9.MRAppmaster启动maptask。
10.maptask从HDFS获取分片数据执行map逻辑。
11.map逻辑执行结束后,MRAppmaster启动reducetask。
12.reducetask从maptask获取属于自己的分区数据执行reduce逻辑。
13.reduce逻辑结束后将结果数据保存到HDFS上。
14.mapreduce作业结束后,MRAppmaster通知ResourceManager结束自己,让ResourceManager回收所有资源。
数据本地化优化在第7步,MRAppmaster向ResourceManager请求容器用于运行maptask时,在请求信息中有map所需要处理的分片数据所在的主机和相应的机架信息(即告诉MRAppmaster需要处理的数据在哪里),调度器根据这些信息做出调度决策。
1、最理想的情况是将任务分配到数据本地化的节点上,这样一来map的输入数据不需要从其他节点通过网络传输过来,大大提高了性能。
2、如果存储所需处理的三个HDFS数据块备份的三个节点都在运行其他map任务,处于忙碌状态,资源不足以再开辟一个容器来运行maptask。此时调度器会选择一个与数据所在节点同机架的节点来开辟容器,运行maptask。
3、如果在同一机架上的节点都处于忙碌状态,调度器才会选择跨机架的节点,这会导致机架与机架之间的数据传输,是三种方式中性能最低的。
map和reduce的输出结果存放位置map任务将其输出写到本地硬盘而不是HDFS,因为map任务的输出结果是中间结果,并不是最终结果,在mr程序结束后,map的输出结果就可以被删除,将其存在可靠的HDFS上一来是没必要浪费HDFS集群的空间,二来是没有存在本地硬盘的速度快。
reduce任务的输出是最终的输出结果,将其存在HDFS上可保证数据的安全。
map,reduce任务分配默认情况下小于10个mapper且只有1个reducer且所需处理的数据总大小小于1个HDFS块的作业是小作业(可通过mapreduce.job.ubertask.maxmaps,mapreduce.job.ubertask.maxreduces,mapreduce.job.ubertask.maxbytes改变一个作业的默认配置),对于小作业,MRAppmaster会选择在与它同一个容器里运行任务(顺序运行),而不会去向ResourceManager请求资源。(mapreduce.job.ubertask.enable设为false将关闭小作业这一性质)。
作业不是小作业的情况下,MRAppmaster会向ResourceManager请求资源,ResourceManager根据数据本地化优化原则分配相应的容器。在默认情况下map任务和reduce任务都分配到1024MB的内存(可通过mapreduce.map.memory.mb和mapreduce.map.memory.mb来设置map任务和reduce任务的使用内存空间)。
调度器在分配容器时有两个参数,yarn.schedule.capacity.minimum-allocation-mb和yarn.schedule.capacity.minimum-allocation-mb,分别表示容器的最小可分配内存和最大可分配内存,默认值分别是1024MB和10240MB,手动给map,reduce任务分配内存空间时,应设置为容器最小可分配内存的整数倍且不大于最大可分配内存。在不设置map和reduce任务的使用内存情况下,调度器会自己根据任务的需要分配最接近的倍数的内存给容器。
map,reduce任务的并行