Hadoop中的任务调度是如何实现的?代码举例讲解

在Hadoop中实现任务调度的主要方式是:
1、 通过Hadoop自带的调度器实现:

  • FIFO(先进先出)调度器:默认调度器,按提交顺序执行作业。
  • Capacity调度器:按队列分配资源,支持多用户和资源管理。
  • Fair调度器:尽量保证所有作业获取公平的资源,按用户和资源管理。

2、 也可以实现自定义调度器:

  • 继承Scheduler基类,实现allocate()dequeue()等方法。
  • 在mapred-site.xml中配置mapred.jobtracker.taskScheduler为自定义调度器的类名。

3、 Capacity调度器示例:

  • 在mapred-site.xml中配置:
<property>  
  <name>mapred.jobtracker.taskScheduler</name>  
  <value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
</property>
  • 创建两个队列:
<property>   
  <name>mapred.capacity-scheduler.queue.queue1.capacity</name>  
  <value>50</value>
</property>
<property>  
  <name>mapred.capacity-scheduler.queue.queue2.capacity</name>  
  <value>50</value>
</property>
  • 作业提交时设置队列:
job.setQueueName("queue1");

4、 Fair调度器示例:

  • 在mapred-site.xml中配置:
<property>
  <name>mapred.jobtracker.taskScheduler</name>
  <value>org.apache.hadoop.mapred.FairScheduler</value> 
</property>
  • 作业提交时设置USER:
job.setUser("user1"); 

任务调度的主要作用是:

1、 资源管理和队列隔离。
2、 防止占用集群大部分资源的”大作业”漫延。
3、 为不同的用户分配和管控资源。

来看一些简单示例:

1、 FIFO调度器(默认)

  • mapred-site.xml中无特殊配置
  • 作业按提交顺序执行

2、 Capacity调度器:

  • mapred-site.xml配置及队列设置如上
  • 作业提交时job.setQueueName("queue1")指定队列
  • 资源按队列比例分配

3、 Fair调度器:

  • mapred-site.xml配置如上
  • 作业提交时job.setUser("user1")指定用户
  • 资源尽量平均分配给不同用户

所以Hadoop通过默认的和可插拔的调度器,可以实现丰富的资源管理和调度功能。