hadoop的组件yarn
YARN分布式资源管理框架:
hadoop1.0
hadoop2.0
Scheduler :调度器(容量调度,公平调度。FIFO)
container:资源容器(抽象概念)
ApplicationsManager(job-submissions)
negotion the frist container for executing the application spectify ApplicationMaster(4次重启(容错),单个任务的管理者,资源申请者,追踪状态,监控任务)
resourcemanager:源码
resourcemanager:nodemanager:心跳告诉resourcemanager资源汇报
nodemanager:负责当前节点的资源,接受appmaster resourcemanager的信息,resourcemanager资源汇报
appmaster:申请资源
container:资源抽象 1个切片 在nodemanager
10%冗余(一个片最多容纳148M数据)
scheduler:
applicationsManager
YARN的通信协议rpc
yarn:
resourcemanager
applicationmanager
applicationmaster(4次分配)
切片对应一个maptask container(资源容器)
reducetask
reduce的数量是由分区决定的
nodemanager
yarn的基本思想是将资源管理和作业调度/监视功能划分为单独的守护进程。其思想是拥有一个全局ResourceManager (RM)和每个应用程序的ApplicationMaster (AM)。应用程序可以是单个作业,也可以是一组作业
ResourceManager和NodeManager构成数据计算框架。ResourceManager是在系统中的所有应用程序之间仲裁资源的最终权威。NodeManager是每台机器的框架代理,负责监视容器的资源使用情况(cpu、内存、磁盘、网络),并向ResourceManager/Scheduler报告相同的情况
每个应用程序ApplicationMaster实际上是一个特定于框架的库,它的任务是与ResourceManager协商资源,并与NodeManager一起执行和监视任务
yarn的提交job的流程
ResourceMangager:管理nodemanger ,管理全局的资源,
Appmaster:对作业的调度做一个追踪,作业的老大
Container:虚拟的管理资源,cpu ,内存,磁盘等。
[外链图片转存失败(img-rfIIS95l-1568966471715)(1568966453289.png)]
1、基本架构
(1)组成:YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成
(2)ResourceManager作用
1)处理客户端请求
2)监控NodeManager
3)启动或监控ApplicationMaster
4)资源的分配与调度
(3)NodeManager作用
1)管理单个节点上的资源
2)处理来自ResourceManager的命令
3)处理来自ApplicationMaster的命令
(4)ApplicationMaster 作用
1)负责数据的切分
2)为应用程序申请资源并分配给内部的任务
3)任务的监控与容错
(5)Container :Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
解析:
第一步:客户端机器,提交作业的机器,查看自己的yarn-site.xml里的yarn-resourceManager.hostname,与ResourceManager通信,用的是RPC的方式。
1.首先客户端机器(程序提交的机器,yarn 的客户端程序)向ResourceMangaer提出申请运行一个mr的job
2.Resourcemanager接收到请求之后,给客户端返回一个jobid,以及提交资源用的stagingdir的文件hdfs://xue01/tmp/hadoop-yarn/stagingdir
3.客户端收到消息后,开始向hdfs://xue01/tmp/hadoop-yarn/stagingdi下提交mr程序的相关资源文件包括
(a)job.jar (b)job.conf(里面有各种组件的配置信息) ©job.split (任务的切片信息)
4.然后客户端再次通知resourceManager,job的资源文件提交完毕
5.RM将用户的请求打包为task,放置调度队列,根据当前yarn的调度模式进行调度(YARN提供的三种任务调度策:FIFO Scheduler,Capacity Scheduler 和 Fair Scheduler)。
6.客户端资源文件提交完毕,向RM申请运行applicationMaster(后续简称AM)。
7.然后ResourceManager得到请求,找了一台nodeManager让它开启开启AppMaster
8.那台nodemanager 在resoucemanger的任务队列中获取到任务task,创建了contianer容器启动Appmaster,然后去hdfs://xue01/tmp/hadoop-yarn/stagingdir下载资源文件
9.Appmaster再向Resourecmanager申请Maptask运算的资源(就是其他节点上运行任务的container)
10.RM将请求再打包为task放置调度队列
11.其它nodeManger获取到maptask后会再创建contianer容器并去hdfs://xue01/tmp/hadoop-yarn/stagingdir下载资源文件,contianer中的mapTask任务由AM负责监控和调度。
12.Appmaster向maptask(就是nodemanager开启的container)发送程序启动命令,
13.除了有Appmaster外的,contianer运行mapTask
14.当各节点mapTask运行完毕后,Appmaster再向ResourceManager申请运行reduceTask容器,resourcemanager将请求再打包为task放置调度队列。
15.其它NM获取到task后会再创建contianer容器并下载资源文件,contianer中的reduceTask任务由AM负责监控和调度。
16.Appmaster向reducetask(就是nodemanager开启的container)发送程序启动命令,先去maptask执行完放结果的地方拉取属于自己的数据,然后再进行运算
17.程序运行完成后,AM向RM注销自己。让RM回收所有的资源。
切片:
(client来执行、inputformat---->getspilts()–>不同输入文件有不同的实现)
10%冗余(文本类型)
数据库中(大概130行一个分片)
查找数据类型:
文件类型:
数据库:
压缩 文件(不可切割的文件)直接添加片
查看源码创建分片信息的集合splits,用于存放分片信息
遍历目录下文件
FileInputFormat.setInputDirRecursive(job,true);//递归遍历
循环取出每一个文件,然后做如下操作
获取文件大小及位置
计算每个分片的大小
FileInputFormat.setMaxInputSplitSize(job,100);
FileInputFormat.setMinInputSplitSize(job,1);
long minSize = Math.max(getFormatMinSplitSize()//1
, getMinSplitSize(job));//配置文件中可设置
long maxSize = getMaxSplitSize(job);//可在运行时指定-D mapreduce.input.fileinputformat.split.maxsize=300M,默认是long的最大值
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
return Math.max(minSize, Math.min(maxSize, blockSize));
判断文件是否可以分片(压缩格式有的可以进行分片,有的不可以,)
剩余文件的大小/分片大小>1.1时,循环执行封装分片信息的方法,具体如下
封装一个分片信息(包含文件的路径,分片的起始偏移量,要处理的大小,分片包含的块的信息,分片中包含的块存在哪儿些机器上)
剩余文件的大小/分片大小<=1.1且 不等于0时,封装一个分片信息(包含文件的路径,分片的起始偏移量,要处理的大小,分片包含的块的信息,分片中包含的块存在哪儿些机器上)
分片的注意事项:1.1倍的冗余。260M文件分几个片?
考虑Hadoop应用处理的数据集比较大,因此需要借助压缩。按照效率从高到低排列的
(1)使用容器格式文件,例如:顺序文件、RCFile、Avro数据格式支持压缩和切分文件。另外在配合使用一些快速压缩工具,例如:LZO、LZ4或者Snappy.
(2)使用支持切分压缩格式,例如gzip2
(3)在应用中将文件切分成块,对每块进行任意格式压缩。这种情况确保压缩后的数据库接近HDFS块大小。
(4)存储未压缩文件,以原始文件存储。
读取分片的细节:如果有多个分片
- 第一个分片读到末尾再多读一行
- 既不是第一个分片也不是最后一个分片第一行数据舍弃,末尾多读一行
- 最后一个分片舍弃第一行,末尾多读一行
client appmaster
MapReduce: setup仅在map函数执行之前执行一次(适用于初始化和表头)
map阶段求总人数(传递,跨节点传递 )
后的数据库接近HDFS块大小。
(4)存储未压缩文件,以原始文件存储。
读取分片的细节:如果有多个分片
- 第一个分片读到末尾再多读一行
- 既不是第一个分片也不是最后一个分片第一行数据舍弃,末尾多读一行
- 最后一个分片舍弃第一行,末尾多读一行
client appmaster
MapReduce: setup仅在map函数执行之前执行一次(适用于初始化和表头)
map阶段求总人数(传递,跨节点传递 )
cleanup仅在所有map函数执行之后执行一次(适用于关闭对象,关闭流)