1、Yarn基本架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。
2、Yarn工作机制
3、作业提交全过程
4、资源调度器
目前,Hadoop作业调度器主要有三种:FIFO、Capacity Scheduler和Fair Scheduler。Hadoop3.1.3默认的资源调度器是Capacity Scheduler。yarn-default.xml
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
Hadoop集群典型的应用:
- 批处理作业(I/O密集型):这种作业往往耗时较长,对时间完成一般没有严格要求,如数据挖掘、机器学习等方面的应用程序。
- 交互式作业:这种作业期望能及时返回结果,如SQL查询(Hive)等。
- 生产性作业(CPU密集型):这种作业要求有一定量的资源保证,如统计值计算、垃圾数据分析等。
- 先进先出调度器(FIFO):将所有的 Application 按照提交时候的顺序来执行,只有当上一个 Job 执行完成之后后面的 Job 才会按照队列的顺序依次被执行。
- 容量调度器(Capacity Scheduler):1)可有多队列,可设置每个队列的资源占比;2)队列有最低资源保证和使用上限;3)用户可设定资源使用上限;4)队列A空闲资源可以共享给其他队列B,当队列A有新的应用程序提交,队列B归还队列A的资源;5)队列中的任务共享队列资源;6)支持多用户共享集群和多应用同时运行;7)动态更新配置文件;8)使用Hadoop ACL 控制队列訪问权限
- 公平调度器(Fair Scheduler):1)可有多队列,可设置每个队列的资源占比;2)对一个队列的作业按照优先级分享整个队列的资源,并发执行;3)可设置每个作业最小资源值,调度器保证作业获得设定资源;4)时间尺度上,所有作业公平获得资源,调度器优先为缺额(作业应获得资源和实际获取资源的缺额)大的作业分配资源;5)max-min fairness 最大最小公平算法
5、配置多队列的容量调度器
Capacity Scheduler 中 user-limit-factor 参数的理解
Hadoop: Capacity Scheduler
hadoop yarn公平调度配置
Hadoop: Fair Scheduler
在yarn-site.xml中指定调度器类型,默认为容量调度器(Capacity Scheduler),Capacity-scheduler.xml中默认只有default队列,以下为集群多队列配置(hadoop102、hadoop103、hadoop104)。
<!-- 指定多队列,增加hive队列 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,hive</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<!-- 降低default队列资源额定容量为40%,默认100% -->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>40</value>
</property>
<!-- 降低default队列资源最大容量为60%,默认100% -->
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>60</value>
</property>
<!-- 指定hive队列的资源额定容量 -->
<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>60</value>
</property>
<!-- 指定队列中,用户提交job占用集群资源的百分比-->
<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
</property>
<!-- 指定hive队列的资源最大容量 -->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
</property>
<!--指定队列的工作状态-->
<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
</property>
<!--访问权限,设定那些用户可以提交应用,*表示所有用户-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
</property>
<!--访问权限,设定那些用户是管理者,*表示所有用户-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
</property>
<!--访问权限,设定那些用户有优先,*表示所有用户平等-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
</property>
<!--访问权限,设定job的最大存活时间,-1表示没有限定-->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
<value>-1</value>
</property>
<!--访问权限,设定job的默认存活时间,-1表示没有限定-->
<property>
<name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
<value>-1</value>
</property>
6、Yarn运行模式:在集群中启动jar(集群模式),在IDEA中启动jar(客户端模式)
Spark 在yarn上运行模式详解:cluster模式和client模式
Cluster模式与Client模式最大的区别在于Driver启动的位置,Cluster模式下ApplicationMaster(与Driver等价)与executor container交互,Client模式下Driver(与ApplicationMaster不等价)与executor container进行交互。ApplicationMaster、executor都是在Node的container中运行;在container中执行maptask、reducetask、ApplicationMaster;Client提交job给ResourceManager,ResourceManager首先分配一个container运行ApplicationMaster,ApplicationMaster再向ResourceManager申请container先后运行maptask、reducetask。
- Cluster模式:Driver程序在YARN中运行,应用的运行结果不能在客户端显示,所以最好运行那些将结果最终保存在外部存储介质(如HDFS、Redis、Mysql)而非stdout输出的应用程序,客户端的终端显示的仅是作为YARN的job的简单运行状况。
- Client模式:Driver运行在Client上,应用程序运行结果会在客户端显示,所以适合运行结果有输出的应用程序(如spark-shell)
在集群上运行MapReduce程序,以WordCount程序为例
// 声明配置对象
Configuration conf = new Configuration();
// 指定当前job提交的队列的名称
conf.set("mapreduce.job.queuename","hive");
// 以命令行的反射设置参数
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
打包程序上传到HDFS,执行如下命令
[atguigu@hadoop102 program]$ hadoop jar Demo02-1.0-SNAPSHOT.jar com.atguigu.mr.wordcount.WordCountDriver /input /output1