在 Debian 上的 Hadoop 任务调度实践
一 调度层级与总体架构
- 在 YARN 层,资源与任务调度由 ResourceManager 与 NodeManager 协同完成:RM 负责全局资源分配与调度策略(如 FIFO、Capacity Scheduler、Fair Scheduler),NM 负责单节点资源供给与隔离。常用端口包括 8088(ResourceManager Web UI)、8032(客户端提交)、8030(AM-RM 调度通信)、8031(NM-RM 心跳)。调度器选择通过 yarn-site.xml 的 yarn.resourcemanager.scheduler.class 指定。
- 在作业编排与定时层,常见方案包括 Oozie(功能全面、适合大型项目)、Azkaban(轻量、适合中小型)、以及 Linux cron / Apache Airflow / Kubernetes CronJob 等,用于定时触发与依赖编排。
- 在监控层,可通过 ResourceManager Web UI(http://RM-Host:8088) 查看应用与队列资源;必要时结合 Ganglia、Ambari 等工具做更细粒度监控。
二 配置 YARN 调度器
- 选择调度器(yarn-site.xml)
- 使用 Capacity Scheduler(多队列、容量保证、资源共享):
- 设置:yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
- 使用 Fair Scheduler(按缺额公平分配、支持多队列与策略配置):
- 设置:yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
- 使用 FIFO(单队列、先来先服务,生产环境较少使用)。
- 关键资源边界(yarn-site.xml)
- 容器可申请范围:yarn.scheduler.minimum-allocation-mb / maximum-allocation-mb(如 1024 / 8192 MB)
- 虚拟 CPU 范围:yarn.scheduler.minimum-allocation-vcores / maximum-allocation-vcores(如 1 / 32)
- 节点可供给资源:yarn.nodemanager.resource.memory-mb(如 16384 MB)、yarn.nodemanager.resource.cpu-vcores(如 16)
- 运行 MapReduce 需启用 Shuffle 服务:yarn.nodemanager.aux-services=mapreduce_shuffle
- 说明:不同 Hadoop 发行版/版本的默认值可能不同,部分版本中 Capacity Scheduler 为默认调度器(如 Hadoop 3.x),请以实际环境为准。
- 生效与验证
- 分发配置到所有节点后,重启 ResourceManager 与 NodeManager
- 访问 http://RM-Host:8088/cluster/scheduler 查看调度器类型与队列/应用状态。
三 提交与监控作业
- 提交作业(示例)
- MapReduce 作业:hadoop jar your-job.jar your.main.Class -D mapreduce.map.memory.mb=2048 -D mapreduce.reduce.memory.mb=4096
- 动态内存/并发等也可通过提交参数覆盖(如 mapreduce.{map|reduce}.memory.mb 等)
- 监控与排错
- ResourceManager Web UI(8088):查看应用列表、队列资源、诊断失败原因
- 常见错误与处理:出现 “Container is running beyond physical memory limits” 时,适当增大容器内存或检查应用内存参数与数据倾斜。
四 定时与编排方案
- Linux cron:适合简单周期任务
- 示例(每 5 分钟执行 ETL):*/5 * * * * /opt/hadoop/bin/hadoop jar /opt/jars/etl.jar com.example.ETLMain
- Apache Airflow:复杂依赖与数据工作流编排
- 安装与配置后,用 DAG 定义任务依赖与调度策略,适合多系统协同与可视化运维
- Apache Oozie / Azkaban:Hadoop 生态原生工作流调度
- Oozie:支持复杂依赖、定时与回滚,适合大型项目
- Azkaban:上手简单、界面友好,适合中小型项目
- Kubernetes CronJob:容器化场景的定时作业
- 示例(每 5 分钟):创建 CronJob 资源,容器镜像内置 Hadoop 客户端或提交脚本,失败可自动重试。
五 快速排错与最佳实践
- 调度器与队列
- 多用户/多队列共享优先选用 Capacity Scheduler 或 Fair Scheduler;在 8088 页面核对队列容量、已用与缺额
- 资源与隔离
- 合理设置 minimum/maximum-allocation-mb、minimum/maximum-allocation-vcores 与 yarn.nodemanager.resource.{memory-mb,cpu-vcores},避免资源碎片与 OOM
- 确认 yarn.nodemanager.aux-services=mapreduce_shuffle 已启用,否则 MapReduce 任务无法拉取 Shuffle 数据
- 黑白名单与维护
- 使用 yarn.resourcemanager.nodes.include-path / exclude-path 做节点维护与灰度,变更可通过刷新命令动态生效,减少停机时间。