温馨提示×

HDFS在Linux中如何进行资源调度

小樊
45
2025-10-14 07:06:39
栏目: 智能运维

HDFS在Linux中的资源调度机制与实现步骤
HDFS本身不直接负责资源调度,其资源管理与调度由Hadoop YARN(Yet Another Resource Negotiator)组件完成。YARN作为Hadoop的核心资源管理框架,负责集群资源的统一分配、任务调度及监控,确保HDFS及其他Hadoop应用(如MapReduce、Spark)高效运行。

一、YARN资源调度核心组件

YARN的资源调度通过以下组件协同完成:

  • ResourceManager(RM):集群资源管理的“大脑”,负责接收资源请求、协调资源分配,并监控NodeManager的状态。其核心组件包括调度器(Scheduler)(决策资源分配)和应用管理器(ApplicationManager)(管理应用生命周期)。
  • NodeManager(NM):每个集群节点的“资源管家”,负责本地资源(内存、CPU、磁盘等)的管理,执行ResourceManager的命令(如启动/停止容器),并向RM汇报节点状态。
  • ApplicationMaster(AM):每个应用的“专属调度员”,负责向RM申请资源、协调任务执行(如MapTask、ReduceTask的分配),并监控任务进度与容错。
  • Container:YARN中的资源抽象单位,封装了任务运行所需的资源(如内存、CPU核数、磁盘空间),是应用执行的具体实例。

二、常见资源调度策略

YARN支持多种调度策略,适用于不同业务场景:

  1. FIFO(先进先出)调度器

    • 特点:最简单的调度策略,按照作业提交的顺序依次执行。先提交的作业优先占用资源,后续作业需等待前面的作业完成或释放资源。
    • 适用场景:任务处理时间均匀、对实时性要求不高(如离线批处理),且集群资源充足的情况。
  2. Capacity Scheduler(容量调度器)

    • 特点:支持多队列资源分配,为每个队列设置固定比例的资源(如root.queue1.capacity=30%),保证队列的最小资源使用权。当队列资源闲置时,可临时借用其他队列的资源(资源借用机制),提高集群利用率。
    • 适用场景:多租户环境(如企业内不同部门共享集群),需要保证关键业务(如财务报表生成)的资源配额。
  3. Fair Scheduler(公平调度器)

    • 特点:追求资源公平分配,根据作业的资源需求动态调整资源占比。新提交的作业先获得少量资源(如10%的CPU核数),随着运行时间延长,资源逐渐回归均衡(如所有作业均分集群资源)。支持资源抢占(如高优先级作业可抢占低优先级作业的资源),确保小任务及时完成。
    • 适用场景:需要保证所有作业公平获取资源的场景(如数据科学团队的实验任务),避免“长作业饿死短作业”。

三、资源调度配置步骤

1. 前期准备

  • 安装JDK(建议1.8及以上版本),并配置JAVA_HOME环境变量;
  • 配置SSH无密码登录(ResourceManager与NodeManager之间需免密通信);
  • 下载并解压Hadoop安装包,配置HADOOP_HOME环境变量。

2. 配置YARN核心参数(yarn-site.xml)

yarn-site.xml是YARN的核心配置文件,需设置以下关键参数:

<configuration>
    <!-- 设置ResourceManager地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>resourcemanager-hostname</value> <!-- 替换为ResourceManager节点的主机名 -->
    </property>
    <!-- 设置NodeManager资源限制 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>8192</value> <!-- 每个NodeManager可使用的最大内存(MB) -->
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>4</value> <!-- 每个NodeManager可使用的最大CPU核心数 -->
    </property>
    <!-- 设置容器资源限制 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value> <!-- 每个容器请求的最小内存(MB) -->
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>8192</value> <!-- 每个容器请求的最大内存(MB) -->
    </property>
    <!-- 设置调度器类型(关键参数) -->
    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> <!-- 可替换为FairScheduler -->
    </property>
</configuration>

上述配置中,yarn.resourcemanager.scheduler.class决定了使用的调度器类型(如CapacitySchedulerFairScheduler)。

3. 配置调度器具体参数

  • Capacity Scheduler:需创建capacity-scheduler.xml文件(位于etc/hadoop目录),配置队列及资源分配:

    <configuration>
        <!-- 定义根队列及子队列 -->
        <property>
            <name>yarn.scheduler.capacity.root.queues</name>
            <value>default,queue1,queue2</value> <!-- 根队列下的子队列 -->
        </property>
        <!-- 设置默认队列的资源比例 -->
        <property>
            <name>yarn.scheduler.capacity.root.default.capacity</name>
            <value>50</value> <!-- 默认队列占集群资源的50% -->
        </property>
        <!-- 设置queue1的资源比例 -->
        <property>
            <name>yarn.scheduler.capacity.root.queue1.capacity</name>
            <value>25</value> <!-- queue1占集群资源的25% -->
        </property>
        <!-- 设置queue2的资源比例 -->
        <property>
            <name>yarn.scheduler.capacity.root.queue2.capacity</name>
            <value>25</value> <!-- queue2占集群资源的25% -->
        </property>
    </configuration>
    
  • Fair Scheduler:需创建fair-scheduler.xml文件(位于etc/hadoop目录),配置队列及公平策略:

    <allocations>
        <!-- 定义队列及资源限制 -->
        <queue name="default">
            <minResources>1 vcore, 1024 MB</minResources> <!-- 队列最小资源 -->
            <maxResources>2 vcore, 2048 MB</maxResources> <!-- 队列最大资源 -->
        </queue>
        <queue name="queue1">
            <minResources>1 vcore, 1024 MB</minResources>
            <maxResources>2 vcore, 2048 MB</maxResources>
        </queue>
        <!-- 启用用户默认队列(未指定队列时,作业提交到用户同名队列) -->
        <property>
            <name>yarn.scheduler.fair.user-as-default-queue</name>
            <value>true</value>
        </property>
        <!-- 启用资源抢占(可选) -->
        <property>
            <name>yarn.scheduler.fair.preemption</name>
            <value>true</value>
        </property>
    </allocations>
    

    同时,需在yarn-site.xml中指定fair-scheduler.xml的路径:

    <property>
        <name>yarn.scheduler.fair.allocation.file</name>
        <value>/etc/hadoop/conf/fair-scheduler.xml</value>
    </property>
    

4. 启动与验证

  • 格式化HDFS(首次启动需执行):hdfs namenode -format
  • 启动HDFS集群:start-dfs.sh
  • 启动YARN集群:start-yarn.sh
  • 验证集群状态:通过yarn node -list查看NodeManager节点,通过yarn application -list查看运行中的应用。

四、优化建议

  • 数据本地化:HDFS会优先将计算任务调度到数据所在的节点(减少网络传输开销),可通过hdfs-site.xml中的dfs.datanode.hdfs-blocks-metadata.enabled参数优化;
  • 机架感知:配置机架信息(topology.script.file.name),将数据副本分布在不同机架(提高容错性与访问性能);
  • 监控调整:使用Ambari、Ganglia等工具监控集群资源使用情况(如内存、CPU利用率),根据实际情况调整队列资源比例或容器大小。

0