温馨提示×

Ubuntu下Hadoop作业调度怎样实现

小樊
44
2025-12-26 14:57:15
栏目: 智能运维

Ubuntu下Hadoop作业调度的实现路径

在Ubuntu上,Hadoop作业调度通常分为两个层面:一是集群侧的多租户与队列资源调度(YARN Scheduler),二是按时间或数据触发的工作流/定时调度(如 Oozie、crontab)。下面给出可直接落地的实现方案与关键配置。

一、集群侧调度 YARN Scheduler 选型与配置

  • 调度器类型与适用场景
    • FIFO Scheduler:先进先出,简单但不适合多用户/多队列混部。
    • Capacity Scheduler:多队列、容量配额、支持队列内资源保障与访问控制,适合生产多团队共享。
    • Fair Scheduler:按“池/作业”公平分配资源,支持最小资源保障与权重,适合交互式与批处理并存。
  • 启用与配置步骤(以 Capacity Scheduler 为例)
    1. $HADOOP_HOME/etc/hadoop/yarn-site.xml 指定调度器类:
      <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
      </property>
      
    2. $HADOOP_HOME/etc/hadoop/capacity-scheduler.xml 定义队列与容量(示例为单队列 default):
      <property>
        <name>yarn.scheduler.capacity.root.queues</name>
        <value>default</value>
      </property>
      <property>
        <name>yarn.scheduler.capacity.root.default.capacity</name>
        <value>100</value>
      </property>
      
    3. 分发配置并重启 YARN:
      $HADOOP_HOME/sbin/stop-yarn.sh
      $HADOOP_HOME/sbin/start-yarn.sh
      
    4. 提交作业时指定队列(示例):
      yarn jar /path/to/your-job.jar com.example.YourJobClass \
        -Dmapreduce.job.queuename=default input output
      
    5. ResourceManager Web UI(http://:8088) 的 Scheduler 页面查看队列与资源分配。

二、按时间与数据触发的工作流调度

  • 使用 Oozie 编排与定时

    • 核心概念:**Workflow(工作流)**定义任务依赖DAG;**Coordinator(协调器)**按时间或数据可用性触发工作流;Bundle用于批量管理多个协调器。
    • 快速上手(示例目录结构与要点):
      • 目录结构
        oozie-apps/
        └─ mr-wordcount-wf/
           ├─ job.properties
           ├─ workflow.xml
           └─ lib/(依赖jar)
        
      • job.properties(关键项)
        nameNode=hdfs://master:8020
        oozie.wf.application.path=${nameNode}/user/${user}/oozie-apps/mr-wordcount-wf/workflow.xml
        inputDir=mr-wordcount-wf/input
        outputDir=mr-wordcount-wf/output
        
      • workflow.xml(核心节点)
        <workflow-app name="mr-wordcount-wf" xmlns="uri:oozie:workflow:0.5">
          <start to="mr-node"/>
          <action name="mr-node">
            <map-reduce>
              <job-tracker>${jobTracker}</job-tracker>
              <name-node>${nameNode}</name-node>
              <configuration>
                <property><name>mapreduce.job.queuename</name><value>${queueName}</value></property>
                <!-- 其他MR参数 -->
              </configuration>
            </map-reduce>
            <ok to="end"/>
            <error to="fail"/>
          </action>
          <kill name="fail"><message>Workflow failed</message></kill>
          <end name="end"/>
        </workflow-app>
        
      • 提交与定时
        # 上传应用
        hdfs dfs -mkdir -p /user/${USER}/oozie-apps/mr-wordcount-wf
        hdfs dfs -put oozie-apps/mr-wordcount-wf /user/${USER}/oozie-apps/
        
        # 运行一次
        oozie job -oozie http://<oozie-host>:11000/oozie -config oozie-apps/mr-wordcount-wf/job.properties -run
        
        # 创建定时协调器(按时间触发,示例为每天2点)
        # 在 coordinator.xml 中配置 <start>, <end>, <frequency> 与 <dataset> 等
        oozie job -oozie http://<oozie-host>:11000/oozie -config coordinator.properties -run
        
    • 适用场景:多步骤 ETL(如 Sqoop → Hive → MR → 导出)、跨系统依赖、需要数据触发与时间窗口管理的任务。
  • 使用 Linux crontab 触发 Hadoop/Hive/Sqoop 脚本

    • 适合轻量调度与简单依赖,或作为 Oozie 的补充。
    • 示例脚本(run_etl.sh)
      #!/usr/bin/env bash
      set -e
      LOG=~/etl/run_$(date +%F).log
      hive -f /home/hadoop/sql/daily_import.hql >> "$LOG" 2>&1
      
    • 定时(每天 02:00)
      crontab -e
      0 2 * * * /home/hadoop/bin/run_etl.sh
      
    • 提示:为脚本配置 HADOOP_HOME、HIVE_HOME、JAVA_HOME 与日志目录;必要时在脚本内检测上一步退出码并实现重试。

三、监控与运维要点

  • 集群资源与队列:通过 ResourceManager Web UI(http://:8088) 查看应用、队列使用与抢占情况;在容量/公平调度下,按队列隔离与保障关键业务。
  • 作业与日志:使用命令行查看与跟踪作业状态
    yarn application -list
    yarn application -status <application_id>
    yarn logs -applicationId <application_id>
    
  • 工作流与定时:在 Oozie Web Console(http://:11000/oozie) 查看工作流/协调器执行历史、失败原因与重试策略。

四、方案选型建议

  • 多团队共享、强配额与访问控制:优先 Capacity Scheduler + Oozie Coordinator(队列治理 + 时间/数据触发)。
  • 交互式与批处理混部、强调公平:选择 Fair Scheduler + Oozie(最小资源保障 + 工作流编排)。
  • 轻量任务或遗留脚本:使用 crontab + Shell/Hive/Sqoop,必要时逐步迁移到 Oozie 统一管理。

0