Ubuntu上HDFS资源调度的正确认知与总体架构
- HDFS 负责分布式存储,不直接做资源调度;计算任务的资源调度由 YARN 完成。
- 典型组件分工:NameNode/DataNode(HDFS存储)、ResourceManager/NodeManager(YARN资源管理与调度)、MapReduce/Spark 等应用(向YARN申请容器运行)。
- 因此,在 Ubuntu 上谈“HDFS资源调度”,实质是配置与调优 YARN 的调度器与资源参数,并配合 HDFS 的存储参数(如副本数)共同影响作业性能与稳定性。
在Ubuntu上启用与配置YARN调度
- 基础配置(均为 $HADOOP_HOME/etc/hadoop/ 下的 XML):
- mapred-site.xml:设置计算框架为 YARN
- mapreduce.framework.name:yarn
- yarn-site.xml:启用 Shuffle 服务与指定 RM 主机
- yarn.nodemanager.aux-services:mapreduce_shuffle
- yarn.resourcemanager.hostname:<RM主机名或IP>
- 资源配置要点(示例为单节点或小型集群,按机器内存与核数调整):
- yarn.nodemanager.resource.memory-mb:8192(NodeManager 可分配的总内存 MB)
- yarn.nodemanager.resource.cpu-vcores:4(NodeManager 可分配的 vcore 数)
- yarn.scheduler.minimum-allocation-mb:1024(容器最小内存)
- yarn.scheduler.maximum-allocation-mb:8192(容器最大内存)
- yarn.scheduler.minimum-allocation-vcores:1
- yarn.scheduler.maximum-allocation-vcores:4
- 调度器选择与队列(二选一或多队列):
- CapacityScheduler(推荐多租户)
- yarn.resourcemanager.scheduler.class:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
- 在 capacity-scheduler.xml 中定义队列与容量,例如:
- yarn.scheduler.capacity.root.queues:default,queue1,queue2
- yarn.scheduler.capacity.root.default.capacity:50
- yarn.scheduler.capacity.root.default.maximum-capacity:100
- yarn.scheduler.capacity.root.queue1.capacity:25
- yarn.scheduler.capacity.root.queue2.capacity:25
- FairScheduler(按用户/应用公平分配)
- yarn.resourcemanager.scheduler.class:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
- 在 fair-scheduler.xml 中配置队列、权重与抢占:
- yarn.scheduler.fair.user-as-default-queue:true
- yarn.scheduler.fair.preemption:true
- yarn.scheduler.fair.allocation.file:/etc/hadoop/conf/fair-scheduler.xml
- 应用侧 MapReduce 必要配置(mapred-site.xml):
- mapreduce.jobhistory.address:<JobHistory主机>:10020
- mapreduce.jobhistory.webapp.address:<JobHistory主机>:19888
- 生效与启动
- 首次启动前格式化 NameNode:hdfs namenode -format
- 启动服务:start-dfs.sh、start-yarn.sh
- 验证进程:jps 应看到 NameNode、DataNode、ResourceManager、NodeManager(以及可选的 JobHistoryServer)
与HDFS相关的性能与调度协同优化
- 块大小:通过 dfs.blocksize 调整(更大块利于顺序读/大文件吞吐,更小块利于小文件与随机读,需权衡 NameNode 内存与作业并发)。
- 副本数:通过 dfs.replication 设置(提高可靠性与读取并发,代价是存储放大;伪分布式常用 1,生产通常 3)。
- 数据本地性:增加 DataNode 数量、合理机架感知,减少跨节点网络传输,提升作业调度与执行效率。
- 小文件治理:合并小文件、使用 SequenceFile/Parquet/ORC 等容器格式,降低 NameNode 元数据压力。
- 压缩:在 MapReduce/作业链路中启用 Snappy/LZO/Bzip2 等压缩,降低网络与存储开销(权衡 CPU)。
- 缓存与I/O:对热点数据启用 HDFS 缓存(集中式缓存),并结合 SSD/NVMe、更高带宽网络提升 I/O。
常用运维命令与验证
- 集群健康与存储:hdfs dfsadmin -report
- HDFS 基本操作:hdfs dfs -mkdir /path、-ls、-put、-get、-rm
- YARN 应用管理:yarn application -list、-status 、-kill
- 服务状态与端口:
- 进程检查:jps
- Web UI(默认端口示例):ResourceManager 8088、NameNode 50070、JobHistory 19888(如启用)