Yarn本身也是一个集群,其中有一个resourcemanager,然后有几个nodemanager;
Yarn是资源调度系统,包括:运算程序jar、cpu、配置文件、内存、IO等,这一机制是linux资源管理提供的cgroup实现的,docker就是这个原理做的;
每一个nodemanager就是分配出一部分资源,即一部分cpu、一部分内存等,这样机器中可以跑多个程序,相互之间不会有影响;
Nodemanager中的容器叫做container,一个container就是一定的cpu,加一定的内存,以及运算程序所需要的jar包等资源;
Yarn就是为了管理这个容器的分配的;
Yarn的原理为:
1) client首先提交一个application给到rm,rm接收到application后会查看可以存放文件的路径以及app_id;
2) client接收到这个app_id以及路径,将对应的job.xml文件、jar文件等存放在HDFS中对应的路径下;
3) 存放完成后,client会向rm发送传送完成的指令,rm接收到这个指令后会形成一个task,并将这个task存放在队列中;
4) nodemanager会定时向rm请求,查看task队列中是否存在task,如果存在task,则生成容器container;
5) container容器在形成的时候会将运行所需要的资源:内存、CPU、jar文件(在HDFS中,nodemanager从HDFS中取出数据文件)等全部汇总到container中;
6) container生成的同时还在其中产生一个主管MrAppMaster,这个MrAppMaster会**map中所有的切片,同时生成多个待运行的maptask;
7) MrAppMaster紧接着会向rm提出申请,确定运行这些maptask以及运行所在的服务器,在这些服务器上生成对应个数的container;
8) 将运行这些maptask所需要的资源CPU等存放在container中;
9) 资源协调好后,MrAppMaster会将maptask发送到container中,并通过java -jar XXX启动所有的maptask;
10) 当maptask运行完成后,会在对应的服务器上保留一个结果文件,供reduce调用,同时maptask将运行结果告诉MrAppMaster;
11)MrAppMaster向rm提出申请,申请reduce运行所需要的资源以及运行位置;
12)在NodeManager中形成container,存放reducetask并运行,reducetask运行的时候会向maptask所在的服务器找map的运行结果文件;
13)当reducetask运行完成后,会将运行结果存储在服务器上,并通知MrAppMaster,MrAppMaster会销毁这次的task运行;
14) ResourceManager:
14.1)处理client请求;
14.2)资源分配调度;
14.3)启动/监控ApplicationMaster;
14.4)监控NodeManager;
15) NodeManager:
15.1)管理单个节点资源;
15.2)处理AppMaster的命令;
15.3)处理RM资源;
16) MrAppMaster:
16.1)数据切分;
16.2)申请资源、分配任务;
16.3)任务监控、容错;
17) container:
17.1)对运行环境以及相应的资源进行封装;
17.2)每个任务一个container,不能共用;
举例表示:
1)首先有个wordcount.jar,作为MapReduce中的案例;
将这个文件在某个机器上提交submit;此时程序会获取到一个与yarn通讯的客户端,这个客户端叫做yarnRunner;他负责提交资源;
他会先去找resourcemanager,主要是通过rpc进行远程调用;申请提交一个application,这个方法会返回两个值,一个application资源提交路径hdfs://xxx/xxx/xxx,以及application_id;
2)提交job运行所需要的资源文件,job.split;job.xml等资源,然后告诉resourcemanager,资源调度完成了;
由于公司中有多个人进行调用,则resourcemanager中就会有一个队列,运行时按照队列进行运行;
3)提交资源完毕,resourcemanager中就会将任务封装成一个task,这个任务让nodemanager去产生一个容器,nodemanager会不停的与sourcemanager保持心跳,来领取相应的任务,
领取到任务后,nodemanager就会生成一个相应的容器,这个容器叫做container,产生这个容器的目的就是运行程序,顾程序所需要的文件也会被下载下来,到容器所在的机器上,这部分资源在hdfs中,下载到容器所在机器;
4)在container中就会有一个mrappmaster被启动,他一启动,它对应的切片等内容就会知道,并执行相应的MapReduce程序;
这个主管mrappmaster横空出世,然后查看相应的程序如何运行,对应的切片信息,启动几个maptask,将maptask优先放在数据所在的程序中去;
5)Mrappmaster如果要执行maptask,首先要到resourcemanager中请求资源,找到可以运行的位置和资源,用来运行maptask的容器,进程的名字被称为yarnchild,他们会领取到任务,并进行分配容器;
当各个nodemanager领取到程序后会发一个指令过去到mrappmaster中去,然后mrappmaster就会发送java -jar的指令到nodemanager中,启动maptask,mrappmaster同时会监管每个maptask的运行状态;
6)当maptask执行完成后,在对应的机器上会形成一个结果文件:
7)当maptask执行完了,mrappmaster就会知道,然后再去申请资源,运行新的MapReduce;
8)Mrappmaster向rm申请三个容器运行reducetask,并将资源放在nodemanager中,流程与maptask的运行一样;图形中为简化流程:
Reduce向map端获取相应分区的数据。
9)当全部运行完之后,mrappmaster会向resourcemanager请求,注销自己。
在hadoop1中存在一个不完整的架构:
Hadoop1.x的架构是存在巨大的漏洞的,因此生产中常用hadoop2.x;
在Windows上如何将job提交到本地的yarn上去:
1)首先要将yarn中的路径指定为本地文件系统:
当然如果是本地的话,数据就不用配:(前提是Windows本地环境配完整)
如果要运行集群模式,下面的三个参数就要执行:
2)此时本地环境中缺少一些本地库和util文件,找到Windows版的hadoop,将bin和lib替换成Windows版的:
3)在Windows版的lib中存在一个winutil文件,没有的话就会报空指针异常;
4)另外还有hadoop.dll,这个dll文件如果缺失会报IO native异常:
如果遇到这个异常,即将这个dll文件放到system32中去;
5)然后再将这个目录配到系统变量中——Hadoop_home;
这样环境就搭建好了。
此时,代码就可以运行了。
此时运行代码时需要给出具体的参数:数据集路径,结果输出路径;
出现输入参数的弹窗;
运行时会给出一些日志提示:
此时如果想跑在集群上该怎么办:
即打一个jar包,然后放到linux中即可;
如果想用java -jar来运行mr的文件,需要配置几个地方:
1)打包成runnable文件,会自动导入依赖包;
2)将xml文件导入到固定的文件夹中;
3)在yarn中导入jar包:
案例:
假如有两个文件,如上图,第一个为订单表(id, date, pid, amount),两张表都是以文件的形式存储在hdfs中,需要用MapReduce程序来实现以下sql查询运算:
将两个id相同的记录拼在一起;
以上为需要的代码;
然后编辑文件,用作处理资源:
将其放在服务器上:
将数据放在文件中;
然后vi pd.txt
然后放到hadoop中:
然后再打包jar文件,并在服务器上运行;