1. 前置准备:安装与配置Hadoop集群
在Debian上实现Hadoop任务调度前,需先完成Hadoop基础环境的搭建。具体步骤包括:
JAVA_HOME环境变量。/usr/local/目录,配置HADOOP_HOME和PATH环境变量(将Hadoop的bin、sbin目录加入PATH)。$HADOOP_HOME/etc/hadoop)下的关键文件:
core-site.xml:设置HDFS URI(fs.defaultFS,如hdfs://namenode:9000);hdfs-site.xml:配置HDFS副本数(dfs.replication,如3)、NameNode数据目录(dfs.namenode.name.dir)、DataNode数据目录(dfs.datanode.data.dir);mapred-site.xml:指定MapReduce框架为YARN(mapreduce.framework.name,值为yarn);yarn-site.xml:配置ResourceManager主机名(yarn.resourcemanager.hostname,如resourcemanager)、NodeManager辅助服务(yarn.nodemanager.aux-services,值为mapreduce_shuffle)及Shuffle服务类(yarn.nodemanager.aux-services.mapreduce.shuffle.class,值为org.apache.hadoop.mapred.ShuffleHandler)。start-dfs.sh启动HDFS,在ResourceManager节点执行start-yarn.sh启动YARN,通过jps命令验证NameNode、DataNode、ResourceManager、NodeManager等进程是否正常运行。2. 使用YARN内置调度器(基础调度)
YARN是Hadoop的资源管理器,其内置FIFO调度器(默认)、容量调度器(CapacityScheduler)、公平调度器(FairScheduler)三种调度策略,可通过配置mapred-site.xml选择:
default队列占80%资源),支持资源共享,配置capacity-scheduler.xml(示例:为default队列设置yarn.scheduler.capacity.root.default.capacity=80)。fair-scheduler.xml(示例:定义default池,设置yarn.scheduler.fair.default.pool)。yarn application -submit命令提交作业,YARN会根据选择的调度器分配资源。3. 使用Linux Cron定时执行Hadoop任务
对于周期性任务(如每日ETL),可通过Debian的cron工具定时调用Hadoop命令:
crontab -e;0 0 * * * /usr/local/hadoop/bin/hadoop jar /path/to/job.jar com.example.YourJobClass /input/path /output/path >> /path/to/logfile.log 2>&1(>>将输出追加到日志文件,2>&1将错误输出重定向到标准输出)。crontab -l可查看当前用户的定时任务列表。4. 使用Apache Airflow实现复杂工作流调度
对于需要任务依赖(如“数据采集→数据处理→数据入库”)、可视化监控的复杂场景,可使用Apache Airflow:
pip安装(pip install apache-airflow),初始化数据库(airflow db init);airflow.cfg,设置executor(如LocalExecutor,适合单机环境)、sql_alchemy_conn(数据库连接,如SQLite或PostgreSQL);BashOperator调用Hadoop命令),示例:from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2025, 9, 1),
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag = DAG(
'hadoop_etl_workflow',
default_args=default_args,
description='A simple Hadoop ETL workflow',
schedule_interval='@daily', # 每天执行一次
catchup=False
)
run_hadoop_job = BashOperator(
task_id='run_hadoop_job',
bash_command='/usr/local/hadoop/bin/hadoop jar /path/to/job.jar com.example.YourJobClass /input/path /output/path',
dag=dag
)
run_hadoop_job # 定义任务依赖(此处无前置任务,直接执行)
airflow webserver -p 8080启动Web服务器,访问http://localhost:8080查看DAG并手动触发或等待定时执行。5. 使用Azkaban/Oozie实现作业流调度(可选)
azkaban.properties(如azkaban.webserver.port=8081),通过Web界面上传作业流(.job文件定义任务依赖),设置定时触发条件。workflow.xml(定义任务流程)和coordinator.xml(定义定时策略),通过Oozie CLI或Web界面提交作业。