Hadoop在Linux中如何进行任务调度
Hadoop在Linux中的任务调度机制与实践
一、Hadoop任务调度的核心组件:YARN
Hadoop在Linux环境中的任务调度主要由**YARN(Yet Another Resource Negotiator)**负责,它是Hadoop 2.0及以上版本的核心资源管理框架,旨在实现集群资源的统一分配与任务的高效调度。YARN通过组件分工完成调度全流程:
- ResourceManager(RM):集群资源管理的“大脑”,负责跟踪集群资源状态(内存、CPU等),并根据调度策略为任务分配资源;
- ApplicationMaster(AM):每个任务的“专属管家”,负责与RM协商资源、启动任务容器(Container)、监控任务进度,并在任务失败时发起重试;
- NodeManager(NM):集群节点的“本地管理员”,负责管理单个节点的资源(如启动/停止容器、监控资源使用),并向RM汇报节点状态;
- Container:YARN调度的最小资源单位,封装了任务运行所需的资源(内存、CPU、磁盘等),是任务执行的隔离环境。
二、YARN的主要调度策略
YARN支持多种调度策略,适配不同场景的资源分配需求:
1. FIFO(先进先出)调度器
- 特点:最简单的调度策略,按照作业提交的顺序依次执行,先提交的作业优先获得资源。
- 优缺点:实现简单,但无法满足多用户共享集群的需求(长作业会阻塞短作业);适用于作业量小、对实时性要求低的场景。
- 配置:YARN默认使用FIFO调度器,无需额外配置。
2. Capacity Scheduler(容量调度器)
- 特点:支持多队列资源分配,每个队列分配固定的集群容量(如队列A占30%、队列B占70%),队列内采用FIFO策略。队列可设置最大/最小容量,允许队列间资源借用(如队列A空闲时,队列B可使用其闲置资源)。
- 优缺点:适合多租户环境(如企业内不同部门共享集群),保证每个队列获得稳定的资源配额;但队列内仍可能存在长作业阻塞问题。
- 配置:修改
yarn-site.xml
设置调度器类,再通过capacity-scheduler.xml
配置队列参数(如队列名称、容量、最大容量)。示例配置:< !-- yarn-site.xml --> < property> < name> yarn.resourcemanager.scheduler.class< /name> < value> org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler< /value> < /property>
3. Fair Scheduler(公平调度器)
- 特点:追求资源公平分配,动态调整作业的资源占比(如两个作业同时提交,各占50%资源;若新作业加入,三者均分资源)。支持资源抢占(若某作业长期占用资源超过其公平份额,RM会抢占其部分资源分配给其他作业)。
- 优缺点:适合需要公平共享资源的场景(如批处理与实时任务混合运行),避免资源饥饿;但资源抢占可能导致任务中断,需应用支持幂等性。
- 配置:修改
yarn-site.xml
设置调度器类,再通过fair-scheduler.xml
配置队列参数(如队列权重、资源分配策略)。示例配置:< !-- yarn-site.xml --> < property> < name> yarn.resourcemanager.scheduler.class< /name> < value> org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler< /value> < /property>
三、Hadoop任务调度的流程
Hadoop任务在Linux中的调度流程可分为以下步骤:
1. 提交任务
使用hadoop jar
命令将MapReduce作业提交至YARN集群,指定输入/输出路径及主类。示例:
hadoop jar my-job.jar com.example.MyJob /input/data /output/result
提交后,作业会进入YARN的作业队列,等待调度。
2. ResourceManager分配资源
RM接收到作业请求后,根据当前集群资源状态(如剩余内存、CPU)及调度策略(如Capacity Scheduler的队列容量),选择一个合适的NodeManager节点,为其分配Container(资源容器)。
3. 启动ApplicationMaster
NodeManager在分配的Container中启动ApplicationMaster(如MapReduce作业的MRAppMaster)。AM启动后,向RM注册自身,并汇报作业的基本信息(如Map/Reduce任务数量)。
4. ApplicationMaster申请资源
AM根据作业的需求(如Map任务需要的内存、CPU),向RM发送资源请求(如申请2个Container,每个Container分配2GB内存、1个CPU核心)。RM根据集群资源状态,分配符合条件的Container。
5. 运行任务
NodeManager在分配的Container中启动任务进程(如MapTask、ReduceTask),执行具体的数据处理逻辑。任务运行过程中,AM会持续监控其进度(如通过心跳机制)。
6. 监控与容错
- AM定期向RM汇报作业状态(如完成百分比、失败任务数);
- 若任务失败(如节点宕机、进程崩溃),AM会向RM申请新的Container,重启失败任务(支持任务重试,次数可通过
mapreduce.map.maxattempts
配置); - 作业完成后,AM向RM报告完成状态,RM释放Container资源。
四、任务调度的监控与管理
1. Web界面监控
通过ResourceManager的Web界面(默认地址:http://<
resourcemanager-host>
:8088
),可查看:
- 集群资源使用情况(总内存、CPU、剩余资源);
- 作业队列状态(各队列的待处理作业数、运行中作业数);
- 单个作业的详细信息(任务进度、资源分配、失败日志)。
2. 命令行工具
YARN提供了一系列命令行工具,用于管理作业:
yarn application -list
:列出所有正在运行或已完成的作业;yarn application -status < application_id>
:查看指定作业的详细状态(如Map/Reduce任务进度);yarn application -kill < application_id>
:杀死指定的作业。
3. 日志分析
YARN会将作业的日志存储在HDFS中(默认路径:/tmp/logs/<
user>
/logs
),可通过yarn logs -applicationId <
application_id>
命令查看日志,用于诊断任务失败原因(如内存不足、数据倾斜)。
五、调优建议
- 合理配置调度器:多用户场景选择Capacity Scheduler,公平共享场景选择Fair Scheduler;
- 调整资源分配:根据作业需求设置Map/Reduce任务的内存(如
mapreduce.map.memory.mb
)、CPU核心数(如mapreduce.map.cpu.vcores
),避免资源浪费或不足; - 启用数据本地化:通过
mapreduce.job.locality.wait
参数调整数据本地化等待时间(如设置为10秒),减少网络传输开销; - 监控队列负载:定期检查各队列的资源使用情况,调整队列容量(如
yarn.scheduler.capacity.< queue-name> .capacity
),避免队列过载。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Hadoop在Linux中如何进行任务调度
本文地址: https://pptw.com/jishu/728402.html