Ubuntu Hadoop 任务调度如何操作
小樊
41
2025-12-22 17:30:44
Ubuntu 上 Hadoop 任务调度实操指南
一 核心概念与架构
- Hadoop 2.x/3.x 将计算与存储解耦:由 YARN 负责资源管理与任务调度,由 MapReduce 作为计算框架在 YARN 上运行。核心角色包括:
- ResourceManager:集群唯一,负责全局资源分配与调度。
- NodeManager:每个工作节点一个,管理本机资源并运行容器(Container)。
- ApplicationMaster(AM):每个作业一个,向 RM 申请资源并与 NM 协作运行任务。
- HDFS:提供作业输入/输出与中间数据的持久化存储。
- 调度器类型:
- FIFO Scheduler:先进先出,简单但不适合多队列与多用户。
- Capacity Scheduler:多队列、容量隔离与弹性,适合多团队共享集群。
- Fair Scheduler:按权重公平分配,适合多用户按需共享。
- 常用端口(便于排障与访问):
- 8088:ResourceManager Web UI
- 9870:HDFS NameNode Web UI(Hadoop 3.x)
- 8032/8030/8031:RM 的 address/scheduler/resource-tracker 服务端口(可选,用于直连或脚本监控)
二 环境准备与最小配置
- 前置要求
- 操作系统:Ubuntu 18.04/20.04/22.04
- Java:OpenJDK 8 或 11(Hadoop 3.x 推荐 8/11;部分环境在 JDK 11+ 需设置模块参数)
- Hadoop:3.3.x/3.4.x(二进制包解压部署即可)
- 关键配置($HADOOP_HOME/etc/hadoop)
- core-site.xml
- 指定默认文件系统(示例为本地伪分布):
- fs.defaultFShdfs://localhost:9000
- hdfs-site.xml
- mapred-site.xml
- 使用 YARN 作为执行框架:
- mapreduce.framework.nameyarn
- yarn-site.xml
- 启用 Shuffle 服务并指定 RM 主机(伪分布用 localhost):
- yarn.nodemanager.aux-servicesmapreduce_shuffle
- yarn.resourcemanager.hostnamelocalhost
- 环境变量(示例)
- 在 hadoop-env.sh / yarn-env.sh / mapred-env.sh 中设置 JAVA_HOME(如:/usr/lib/jvm/java-8-openjdk-amd64)
- 如使用 JDK 11+ 且启动异常,可在 yarn-env.sh 增加:
- export YARN_RESOURCEMANAGER_OPTS=“–add-opens java.base/java.lang=ALL-UNNAMED”
- export YARN_NODEMANAGER_OPTS=“–add-opens java.base/java.lang=ALL-UNNAMED”
三 启动集群与提交作业
- 启动 HDFS 与 YARN
- 格式化 NameNode(首次):hdfs namenode -format
- 启动 HDFS:start-dfs.sh
- 启动 YARN:start-yarn.sh
- 启动 MapReduce 历史服务器(便于查看已完成作业日志):mapred --daemon start historyserver
- 提交示例作业(WordCount)
- 准备输入数据到 HDFS:
- hdfs dfs -mkdir -p /user/$USER/input
- hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /user/$USER/input
- 提交 MapReduce 作业(示例 JAR 位于 $HADOOP_HOME/share/hadoop/mapreduce/):
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount
/user/$USER/input /user/$USER/output
- 常用运维命令
- 查看应用列表:yarn application -list
- 查看应用详情:yarn application -status
- 终止应用:yarn application -kill
- Web 界面
- ResourceManager:http://<RM_HOST>:8088
- NameNode(Hadoop 3.x):http://<NN_HOST>:9870
- 历史服务器:http://<RM_HOST>:19888(若已启动)
四 调度器配置与队列实践
- 选择调度器(在 yarn-site.xml 设置)
- Capacity Scheduler(多队列、容量隔离,生产常用)
- yarn.scheduler.classorg.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
- 在 $HADOOP_HOME/etc/hadoop/capacity-scheduler.xml 中定义队列与容量(如:default 队列 capacity=100,或 root 下分 dev/test 各 50)
- Fair Scheduler(按权重公平共享)
- yarn.scheduler.classorg.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
- 在 $HADOOP_HOME/etc/hadoop/fair-scheduler.xml 中定义队列与权重/最小资源
- 提交到指定队列
- 命令行:yarn jar your-job.jar YourMainClass -Dmapreduce.job.queuename=dev input output
- 或在代码中通过 Configuration 设置:conf.set(“mapreduce.job.queuename”, “dev”)
- 队列与权限建议
- 为团队划分队列,设置 capacity/minimum-resource/maximum-resource,避免资源争抢
- 结合 ACL 控制队列提交与查看权限(capacity-scheduler.xml 中配置)
- 验证
- 在 8088 页面查看作业详情中的 Queue 字段,确认调度到目标队列
- 观察各队列的 Apps Running/Resources Used 是否符合预期
五 常见问题与排查
- 无法访问 8088/9870
- 检查对应进程是否在(jps 查看 ResourceManager/NameNode)
- 核对 yarn-site.xml / core-site.xml 中主机名与端口(伪分布用 localhost 或 127.0.0.1)
- 开放防火墙端口(如 ufw/iptables),或在本机测试
- 启动 YARN 后 ResourceManager/NM 未起来
- 查看 $HADOOP_HOME/logs/ 下对应日志(resourcemanager.log / nodemanager.log)
- 常见原因:JDK 版本不兼容(切换到 JDK 8)、JAVA_HOME 配置错误、端口被占用、主机名解析问题
- 作业卡在 ACCEPTED
- 常见原因:队列无可用资源、集群资源不足、AM 申请容器失败
- 排查:yarn application -status 、查看日志、核对队列容量与用户配额
- 历史任务日志不可见
- 确认已启动历史服务器:mapred --daemon start historyserver
- 访问 19888 并检查作业是否写入日志聚合(yarn.log-aggregation-enable 为 true 时)