一、Yarn基本架构
yarn是一个资源调度器,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于操作系统上的应用程序。
主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件。
1)ResourceManager作用:
-
- 处理客户端请求
-
- 监控NodeManager
-
- 启动或监控ApplicationMaster
-
- 资源的分配与调度
2)NodeManager作用:
- 1.管理单个节点上的资源
- 2.处理来自ResourceManager的命令
- 3.处理来自ApplicationMaster的命令
- ApplicationMaster作用:
-
- 负责数据的切分
-
- 为应用程序申请资源并分配给内部的任务
-
- 任务的监控与容错
4)Container
- 1.container是yarn的资源抽象,封装了某个节点上的多种资源。例如:内存、cpu、磁盘、网络等
二、yarn工作机制
三、资源调度器
Hadoop作业调度器主要有三种:FIFO、Capacity、Fair
具体的设置配置在yarn-default.xml文件。
FIFO(单队列)
- 所有的作业被统一提交到一个队列中,Hadoop按照提交顺序依次运行这些作业。
- 缺点:对不同作业的多样化需求不能满足,也不能充分利用硬件资源。
Capacity(多队列)
- 用多队列执行,每个队列设置资源占比。
- 可以对同一个用户提交的作业所占资源量限定
- 当一个队列的资源有剩余的时候,可暂时将剩余的资源共享给其他队列。
Fari(多队列)
- 同队列都能平均的获取等同的贡献资源,即如果两个任务,则每个50%,如果四个任务,每个25%。
- 多队列执行,每个队列设置资源占比
四、容器调度器多队列提交案例
4.1 需求
Yarn默认的容量调度器是一条单队列的调度器,在实际使用中会出现单个任务阻塞整个队列的情况,同时,随着业务的增长,公司需要分业务限制集群使用率。这就需要我们按照业务种类配置多余的队列。
4.2 配置多队列的容量调度器
默认的Yarn的配置下,容器调度器只有一条Default队列。在capacity-scheduler.xml 中可以配置多条队列。并降低default队列资源占比。
<!-- 指定多队列 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,hive</value>
</property>
<!-- 指定default队列的额定容量 -->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>40</value>
</property>
<!-- 指定hive队列的额定容量 -->
<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>60</value>
</property>
<!-- 指定default队列允许单用户占用的资源占比 -->
<property>
<name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
<value>1</value>
</property>
<!-- 指定hive队列允许单用户占用的资源占比 -->
<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
</property>
<!-- 指定default队列的最大容量-->
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>60</value>
</property>
<!-- 指定hive队列的最大容量-->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
</property>
<!-- 指定default队列的状态 -->
<property>
<name>yarn.scheduler.capacity.root.default.state</name>
<value>RUNNING</value>
</property>
<!-- 指定hive队列的状态 -->
<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
</property>
<!-- 指定default队列允许哪些用户提交job-->
<property>
<name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
<value>*</value>
</property>
<!-- 指定hive队列允许哪些用户提交job-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
</property>
<!-- 指定default队列允许哪些用户进行管理-->
<property>
<name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
<value>*</value>
</property>
<!-- 指定hive队列允许哪些用户进行管理-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
</property>
<!-- 指定default队列允许哪些用户提交配置优先级的job-->
<property> <name>yarn.scheduler.capacity.root.default.acl_application_max_priority</name>
<value>*</value>
</property>
<!--指定hive队列允许哪些用户提交配置优先级的job -->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
</property>
<!-- 指定default队列允许job运行的最大时间-->
<property>
<name>yarn.scheduler.capacity.root.default.maximum-application-lifetime
</name>
<value>-1</value>
</property>
<!-- 指定hive队列允许job运行的最大时间-->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime
</name>
<value>-1</value>
</property>
<!-- 指定default队列允许job运行的默认时间-->
<property>
<name>yarn.scheduler.capacity.root.default.default-application-lifetime
</name>
<value>-1</value>
</property>
<!-- 指定hive队列允许job运行的最大时间-->
<property>
<name>yarn.scheduler.capacity.root.hive.default-application-lifetime
</name>
<value>-1</value>
</property>
还可以让job提交到指定队列:(在driver中添加)
configuration.set("mapred.job.queue.name", "hive");