Hadoop在Linux上的任务调度概览
在Linux环境中,Hadoop通过YARN(Yet Another Resource Negotiator)统一管理集群资源与作业调度。核心组件包括:全局的ResourceManager(负责资源分配与调度)、各节点的NodeManager(管理本机容器与任务)、以及每个应用独有的ApplicationMaster(AM)(与RM协商资源、调度内部任务、监控容错)。作业的资源抽象为Container(封装CPU、内存等),调度器决定“哪个应用/队列在何时获得哪些Container”。这一模型适用于MapReduce、Spark、Tez等多种计算框架。
调度器类型与适用场景
- FIFO Scheduler(先进先出):按提交顺序执行,简单但不利于长作业与多用户并发,易出现“队头阻塞”。
- Capacity Scheduler(容量调度器):支持多队列与层级配额,按“保障容量+弹性上限”分配,适合多租户/多团队共享集群,强调资源隔离与可预测性。
- Fair Scheduler(公平调度器):按“池/应用”动态均衡资源份额,兼顾小作业快速响应与大作业服务水平,支持抢占以避免饥饿。
- 版本提示:部分版本(如Hadoop 2.9.2)默认启用Capacity Scheduler;实际以集群配置为准。
提交与监控作业的常用操作
- 提交作业(以MapReduce为例):使用命令
hadoop jar my-job.jar com.example.MyJob
提交后由ResourceManager分配首个容器启动ApplicationMaster,再由AM申请更多容器运行Map/Reduce任务。
- 查看与监控:
- 命令行:yarn application -list、yarn application -status <app_id>
- Web界面:访问ResourceManager Web UI(默认8088端口)查看应用列表、资源使用、日志与诊断信息。
配置调度器的关键步骤
- 选择调度器(在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
- 队列与配额示例(Capacity Scheduler,核心参数):
- 定义队列:yarn.scheduler.capacity.root.queues=default,analytics
- 设置容量:yarn.scheduler.capacity.root.default.capacity=70
- 设置最大容量:yarn.scheduler.capacity.root.default.maximum-capacity=80
- Fair Scheduler:通过分配文件(如fair-scheduler.xml)定义池与权重/配额,并可开启抢占:
- yarn.scheduler.fair.allocation.file=/etc/hadoop/fair-scheduler.xml
- yarn.scheduler.fair.preemption=true
- 提示:修改配置后需同步到集群并重启相关服务;不同发行版/版本的参数路径与默认值可能略有差异。
性能优化与常见实践
- 数据本地化优先:尽量让任务在数据所在节点执行,减少网络开销;合理设置HDFS块大小与副本因子以平衡吞吐与成本。
- 合理申请资源:根据任务特性设置mapreduce.map.memory.mb、mapreduce.reduce.memory.mb等,避免过配/欠配导致排队或OOM。
- 优化Shuffle与中间数据:使用Combiner、合理设置Shuffle内存缓冲、对中间/输出数据启用**压缩(如Snappy、LZO)**以降低I/O与网络传输。
- 提升稳定性与吞吐:启用推测执行(Speculative Execution)缓解慢节点;结合动态资源扩展与监控工具(如Ganglia、Ambari)持续调参。
- 工作流与定时调度:对存在依赖与周期性的作业,可叠加Oozie或Azkaban进行工作流编排与定时执行。