一.作业调度器

  • 容量调度器
  • 公平调度器

二.容量调度器

  • 容量调度器基于“队列”的概念来实现调度策略
  • 队列与容器有些类似,也是在逻辑上定义了一个资源范围,这个范围叫做队列的容量。在一个队列中运行的Job一般不允许使用超过范围的资源,让Job在不同的队列中运行就可以支持Job并行了。所以,队列是跨节点的,容器只在节点内划分资源
  • 队列在配置文件中创建。Job在提交时可以指定队列,如果不指定就使用默认队列。
  • 可能又多个Job提交到一个队列,队列内的Job使用先进先出的调度策略(FIFO),即当前Job运行完下一个Job才能运行
  • 在容量调度策略下,可以通过定义n个队列保证n个Job同时运行。
  • 在Hadoop3中,如果只有一个队列A有Job,而队列B没有Job,那么队列A中的Job可以占用100%的资源
  • 可以指定一个队列中占用资源的最大范围,比如指定队列A最大资源占用不超过80%,此时即使队列B中没有Job,队列A中的Job也不能使用超过80%的资源
  • 队列支持层级结构,也就是队列可以包含子队列,子队列再包含岁队列。没有孩子的队列叫叶子队列,容量调度器支持动态创建叶子节点

三.公平调度器

  • 公平调度器基于队列的概念实现调度策略
  • 理论上讲,公平调度器想让所有Job立即运行而不必等待,这与容量调度器有很大不同(容量调度器只允许运行与队列数量相同的Job)。一般要为公平调度器指定最多运行的Job数量
  • 公平调度器的队列根据占用资源使用比重来分配,而不是对全部资源的比例。默认队列比重相同,可以为每个队列指定不同的比重
  • 可以为队列指定最大和最小资源占用量
  • 公平调度器自动创建队列的两种情况
  • Job提交时指定的队列不存在
  • 开启一个设置后没有Job指定队列名
  • 公平调度器内部调度策略
  • 默认是公平调度(FairSharePolicy)(将内存和CPU作为资源计算)
  • FIFO策略(FifoPolicy)
  • 另一种公平调度(DominantResourceFairnessPolicy)(将内存、CPU、GPU、硬盘等都作为资源用于计算)

四.队列注意事项

  • 队列的配置文件位于\etc\hadoop\capacity-scheduler.xml
  • 队列分层。父子队列都支持分层。一个队列下可创建多个子队列,子队列占用资源的总和不能超过父队列
  • 用户提交Job时,必须指定一个队列,如果不指定,就会被分配到默认队列中,总之必须处于某个队列中。为队列的Job指定优先级可以影响队列内Job执行的先后顺序,也就是说提交早的不一定先执行
  • 两种队列都支持对提交的Job的用户管理,可以设置用户白名单(不在名单中的不能提交Job)、限制用户占用的资源量。如此一来,用户提交多个Job时,这些Job执行时占用的资源就不会超出限制。另外,还可以指定一个用户最多执行的Job数量