温馨提示×

Linux中Hadoop任务怎么调度

小樊
43
2025-10-10 03:08:45
栏目: 智能运维

Linux环境下Hadoop任务调度实现指南

一、Hadoop任务调度的核心组件:YARN

YARN(Yet Another Resource Negotiator)是Hadoop 2.x及以上版本的核心资源管理框架,负责集群资源的统一分配与任务调度。其架构包含三个关键角色:

  • ResourceManager(RM):全局资源管理器,负责集群资源的分配与调度,包含调度器(Scheduler)(决策资源分配)和应用程序管理器(ApplicationManager)(接收作业提交、协调ApplicationMaster启动)。
  • NodeManager(NM):每个节点的资源代理,负责监控节点资源(CPU、内存)、管理容器(Container,YARN的计算单元)生命周期,并向RM汇报资源使用情况。
  • Container:YARN中的基本计算资源单位,封装了CPU、内存等资源,用于运行MapReduce任务、Spark作业等具体组件。

二、YARN支持的调度策略

YARN提供三种主流调度策略,适配不同场景需求:

1. FIFO调度器(先进先出)

  • 特点:按照作业提交顺序依次调度,先到先得。
  • 适用场景:简单测试环境或对实时性要求极低的批处理任务。
  • 配置:默认启用,无需额外配置(yarn.resourcemanager.scheduler.class默认值为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler)。

2. 容量调度器(Capacity Scheduler)

  • 特点:支持多租户共享集群,为每个队列分配固定容量(如queue1占30%、queue2占20%),队列内任务按FIFO排序。允许设置队列最大容量(如queue1最大可使用50%资源),应对突发任务需求。
  • 适用场景:企业多团队共享集群,需隔离资源并保证各团队基本资源配额。
  • 配置示例capacity-scheduler.xml):
    <property> <name>yarn.scheduler.capacity.root.queues</name> <value>default,team1,team2</value> </property> <property> <name>yarn.scheduler.capacity.root.team1.capacity</name> <value>30</value> </property> <property> <name>yarn.scheduler.capacity.root.team2.capacity</name> <value>20</value> </property> <property> <name>yarn.scheduler.capacity.root.team1.maximum-capacity</name> <value>50</value> </property> 

3. 公平调度器(Fair Scheduler)

  • 特点:动态分配资源,确保所有作业公平共享集群(如两个作业同时运行时,各占50%资源);支持资源抢占(当高优先级作业提交时,可抢占低优先级作业的资源),保证小作业快速响应。
  • 适用场景:需要公平分配资源的共享集群,尤其是混合批处理与交互式查询的场景。
  • 配置示例fair-scheduler.xml):
    <property> <name>yarn.scheduler.fair.preemption</name> <value>true</value> </property> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/path/to/fair-scheduler.xml</value> </property> <property> <name>queue1.weight</name> <value>1</value> </property> <property> <name>queue2.weight</name> <value>2</value> </property> 

三、Hadoop任务提交与调度流程

  1. 准备作业:编写MapReduce/Spark程序(Java、Python等),打包为JAR文件(如my-job.jar)。
  2. 上传至HDFS:使用hadoop fs -put命令将作业文件上传至HDFS,确保存储路径可访问(如hadoop fs -put my-job.jar /user/hadoop/jobs/)。
  3. 提交作业:通过hadoop jar命令提交作业至YARN,指定队列(可选):
    hadoop jar my-job.jar com.example.MyJobClass input_path output_path -Dmapreduce.job.queuename=team1 
    其中,-Dmapreduce.job.queuename用于指定作业所属队列(需提前在调度器配置中定义)。
  4. 监控作业:通过YARN Web界面(默认http://<resourcemanager-host>:8088)查看作业状态,或使用命令行工具:
    yarn application -list # 列出所有运行中的作业 yarn application -status <app_id> # 查看指定作业的详细状态 

四、任务调度优化技巧

  1. 数据本地化:尽量将任务调度到存储数据的节点(YARN默认优先考虑数据本地化),减少网络传输开销。可通过mapreduce.job.locality.wait参数调整等待时间(默认10秒)。
  2. 资源合理分配:根据作业类型设置Map/Reduce任务的资源需求(如mapreduce.map.memory.mbmapreduce.reduce.memory.mb),避免资源浪费或不足。
  3. 推测执行:启用推测执行(mapreduce.speculative.execution),对运行慢的任务启动备份任务,加快整体作业进度(适用于易出现数据倾斜的场景)。
  4. 压缩中间数据:对MapReduce的中间结果(如map输出)进行压缩(如使用Snappy算法),减少磁盘I/O与网络传输(配置mapreduce.map.output.compresstrue)。

五、自动化调度工具集成

对于周期性或复杂工作流任务,可结合以下工具实现自动化调度:

  • Crontab:Linux系统自带的定时任务工具,适合简单的周期性作业(如每天凌晨执行数据备份)。通过crontab -e编辑定时任务,例如每5分钟执行一次Shell脚本:
    */5 * * * * /path/to/submit_job.sh >> /var/log/hadoop_job.log 2>&1 
  • Oozie:Hadoop工作流调度框架,支持定义复杂的作业依赖关系(如MapReduce→Spark→Hive),通过Web界面或命令行提交工作流。
  • Azkaban:LinkedIn开源的工作流调度工具,支持权限管理、任务重试、依赖触发等功能,适合企业级大规模作业调度。

0