Yarn本身也是一个集群,其中有一个resourcemanager,然后有几个nodemanager;

Yarn是资源调度系统,包括:运算程序jar、cpu、配置文件、内存、IO等,这一机制是linux资源管理提供的cgroup实现的,docker就是这个原理做的;

每一个nodemanager就是分配出一部分资源,即一部分cpu、一部分内存等,这样机器中可以跑多个程序,相互之间不会有影响;

Nodemanager中的容器叫做container,一个container就是一定的cpu,加一定的内存,以及运算程序所需要的jar包等资源;

Yarn就是为了管理这个容器的分配的;

Yarn的原理为:

Hadoop学习(九)——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,资源调度完成了;

Hadoop学习(九)——Yarn调度

由于公司中有多个人进行调用,则resourcemanager中就会有一个队列,运行时按照队列进行运行;

3)提交资源完毕,resourcemanager中就会将任务封装成一个task,这个任务让nodemanager去产生一个容器,nodemanager会不停的与sourcemanager保持心跳,来领取相应的任务,

 Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

领取到任务后,nodemanager就会生成一个相应的容器,这个容器叫做container,产生这个容器的目的就是运行程序,顾程序所需要的文件也会被下载下来,到容器所在的机器上,这部分资源在hdfs中,下载到容器所在机器;

4)在container中就会有一个mrappmaster被启动,他一启动,它对应的切片等内容就会知道,并执行相应的MapReduce程序;

这个主管mrappmaster横空出世,然后查看相应的程序如何运行,对应的切片信息,启动几个maptask,将maptask优先放在数据所在的程序中去;

5)Mrappmaster如果要执行maptask,首先要到resourcemanager中请求资源,找到可以运行的位置和资源,用来运行maptask的容器,进程的名字被称为yarnchild,他们会领取到任务,并进行分配容器;

Hadoop学习(九)——Yarn调度

当各个nodemanager领取到程序后会发一个指令过去到mrappmaster中去,然后mrappmaster就会发送java -jar的指令到nodemanager中,启动maptask,mrappmaster同时会监管每个maptask的运行状态;

6)当maptask执行完成后,在对应的机器上会形成一个结果文件:

Hadoop学习(九)——Yarn调度

7)当maptask执行完了,mrappmaster就会知道,然后再去申请资源,运行新的MapReduce;

8)Mrappmaster向rm申请三个容器运行reducetask,并将资源放在nodemanager中,流程与maptask的运行一样;图形中为简化流程:

Hadoop学习(九)——Yarn调度

Reduce向map端获取相应分区的数据。

9)当全部运行完之后,mrappmaster会向resourcemanager请求,注销自己。

在hadoop1中存在一个不完整的架构:

Hadoop学习(九)——Yarn调度Hadoop学习(九)——Yarn调度

Hadoop1.x的架构是存在巨大的漏洞的,因此生产中常用hadoop2.x;

在Windows上如何将job提交到本地的yarn上去:

1)首先要将yarn中的路径指定为本地文件系统:

Hadoop学习(九)——Yarn调度

当然如果是本地的话,数据就不用配:(前提是Windows本地环境配完整)

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

如果要运行集群模式,下面的三个参数就要执行:

Hadoop学习(九)——Yarn调度

2)此时本地环境中缺少一些本地库和util文件,找到Windows版的hadoop,将bin和lib替换成Windows版的:

Hadoop学习(九)——Yarn调度

3)在Windows版的lib中存在一个winutil文件,没有的话就会报空指针异常;

Hadoop学习(九)——Yarn调度

4)另外还有hadoop.dll,这个dll文件如果缺失会报IO native异常:

Hadoop学习(九)——Yarn调度

如果遇到这个异常,即将这个dll文件放到system32中去;

5)然后再将这个目录配到系统变量中——Hadoop_home;

Hadoop学习(九)——Yarn调度

这样环境就搭建好了。

此时,代码就可以运行了。

此时运行代码时需要给出具体的参数:数据集路径,结果输出路径;

Hadoop学习(九)——Yarn调度

出现输入参数的弹窗;

Hadoop学习(九)——Yarn调度

运行时会给出一些日志提示:

此时如果想跑在集群上该怎么办:

即打一个jar包,然后放到linux中即可;

如果想用java -jar来运行mr的文件,需要配置几个地方:

1)打包成runnable文件,会自动导入依赖包;

2)将xml文件导入到固定的文件夹中;

3)在yarn中导入jar包:

Hadoop学习(九)——Yarn调度

 案例:

Hadoop学习(九)——Yarn调度

假如有两个文件,如上图,第一个为订单表(id, date, pid, amount),两张表都是以文件的形式存储在hdfs中,需要用MapReduce程序来实现以下sql查询运算:

Hadoop学习(九)——Yarn调度        

将两个id相同的记录拼在一起;

Hadoop学习(九)——Yarn调度        

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

Hadoop学习(九)——Yarn调度

以上为需要的代码;

然后编辑文件,用作处理资源:

Hadoop学习(九)——Yarn调度

将其放在服务器上:

Hadoop学习(九)——Yarn调度

将数据放在文件中;

然后vi pd.txt

Hadoop学习(九)——Yarn调度

然后放到hadoop中:

Hadoop学习(九)——Yarn调度

然后再打包jar文件,并在服务器上运行;

 

相关文章:

  • 2021-09-07
  • 2021-05-18
  • 2021-07-13
  • 2022-12-23
  • 2021-05-26
  • 2021-06-15
  • 2021-10-04
  • 2022-12-23
猜你喜欢
  • 2021-10-31
  • 2022-12-23
  • 2021-12-25
  • 2021-10-30
  • 2021-10-23
  • 2021-08-03
  • 2021-09-01
相关资源
相似解决方案