Linux系统Hadoop作业如何调度
小樊
42
2026-01-03 04:58:52
Linux上Hadoop作业调度全指南
一 核心架构与调度器选型
- 在 YARN 架构中,ResourceManager 负责全局资源管理与调度,NodeManager 管理单节点资源与容器生命周期,作业通过 ApplicationMaster 向 RM 申请 Container 并在 NM 上运行。调度器只负责“把资源分配给谁”,不负责作业容错与重启。常见调度器有三种:
- FIFO Scheduler:按提交顺序执行,简单但不适合多用户共享,容易出现“大作业阻塞小作业”。
- Capacity Scheduler:按队列划分容量,适合多租户与资源隔离,队列内默认 FIFO。
- Fair Scheduler:按“池/队列”动态均衡资源,兼顾小作业响应与大作业吞吐,支持抢占与权重。
选型建议:单团队/轻量场景可用 FIFO;多用户共享且强调隔离用 Capacity;强调公平与弹性用 Fair。
二 配置调度器与队列
- 选择调度器(示例为启用 Fair Scheduler):在 $HADOOP_HOME/etc/hadoop/yarn-site.xml 设置
yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
指定分配文件路径:yarn.scheduler.fair.allocation.file=/etc/hadoop/fair-scheduler.xml。
- Fair Scheduler 队列示例(fair-scheduler.xml):
- 定义队列与权重:root 下分 prod(weight=2)、dev(weight=1);队列内调度策略为 fair。
- 队列放置策略:优先使用用户指定的队列;未指定时按 primaryGroup 映射;否则落到 default。
- 可设置最小/最大资源、最大运行应用数、AM 资源占比、抢占等。示例:
fair
fair
- Capacity Scheduler 队列示例(capacity-scheduler.xml):
- 定义队列:root.queues=prod,dev
- 设置容量:root.prod.capacity=70;root.dev.capacity=30
- 可继续配置最大容量、ACL、队列内应用上限等。
- 使配置生效:分发到所有节点并重启 ResourceManager 与 NodeManager。
三 提交与运行时控制
- 提交作业(MapReduce 示例):
- 使用 YARN 提交:yarn jar /path/to/your-job.jar com.example.YourJobClass input output
- 指定队列:在命令行加入 -Dmapreduce.job.queuename=dev
- 设置优先级(可选):-Dmapreduce.job.priority=HIGH
- 运行时常用命令:
- 查看应用:yarn application -list
- 查看/修改应用优先级:yarn application -appId -updatePriority HIGH(部分发行版支持)
- 查看日志:yarn logs -applicationId
- 资源与容器:合理设置 mapreduce.map.memory.mb、mapreduce.reduce.memory.mb、容器虚拟核数等,避免 OOM 与过度申请。
四 定时与跨作业编排
- 使用 Oozie 管理工作流与定时调度(适合复杂依赖与多作业串联)。
- 使用 Apache Airflow 编排数据管道(DAG、依赖、重试、监控完善)。
- 简单周期任务可用 Cron 调用脚本提交作业(轻量、易维护)。
- 选择建议:复杂依赖与 SLA 要求高选 Oozie/Airflow;简单周期任务选 Cron。
五 监控与性能优化要点
- 监控与诊断:
- YARN Web UI(RM 8088)查看队列/应用/容器;命令行 yarn application -list/-status/-logs。
- 结合 Ganglia、Ambari/Cloudera Manager 做容量与性能趋势分析。
- 性能优化:
- 提升数据本地性,合理设置 HDFS 块大小 与 副本因子。
- 合理设置 Map/Reduce 内存与并发,减少 Shuffle 压力;中间与输出数据启用 压缩(Snappy/LZO)。
- 开启 推测执行 缓解慢节点;必要时考虑 Tez/Spark 替代 MR 以提升迭代/交互性能。
- 持续基于监控数据调参与重构作业逻辑。