hadoop搭便车指南(2)-Airflow的安装

我们安装了hadoop集群后就可以使用了. 但是生产环境的hadoop任务非常复杂, 必须有维护任务调度和依赖的工具. CDH官方的工具是oozie, 我们的选型是airflow.

airflow相对于其他的hadoop任务调度工具(ooziw, azkaban)具有社区活跃, 可视化强大等优点. 我们使用airflow主要解决如下问题:

1. 定时驱动任务; hadoop作业的典型场景是T+1, 即每天的凌晨跑昨天的数据. 这样就需要有类似crontab的定时驱动功能. 驱动的最小粒度是分钟.

2. dag编程模型. 所谓的dag编程模型, 就是你可以将一个项目分成若干任务, 每个任务都可以依赖其他任务的正确执行. 任务之间根据依赖关系形成一个有向无环图(dag).

3. dag之间的可以互相依赖. 这个功能是目前azkaban不具备的, airflow是通过senor完成的. 由于hadoop任务一定是依赖某些特定的数据ready后执行的. 比如你计算DAU, 必须要等待订单数据仓库的ready. 但是一般的调度是不知道其他的dag执行情况的. 另外如果把所有的互相依赖任务都放在同一个dag里面, dag显得就特别臃肿了.

4. 可以设置全局变量.

5. 至少可以调度 sqoop, hive, spark任务.

当然, 需要提醒一句, airflow是一个离线调度工具, 它不是运行storm等流失数据的合适工具.

安装airflow 1.10.0

我们选择安装1.10.0 版本, 这个版本在pip中还没有更新, 只能通过源码安装. 1.10.0相对于1.9多了时区设置的功能. 这个功能对于相对于UTC差了8个时区的中国来说非常重要, 不然不得不处理调度时间和服务器时间不一致的问题.

yum install gcc-c++ -y
yum install python-devel -y
yum -y install mysql-community-devel
yum install -y krb5-devel
yum install cyrus-sasl-lib.x86_64 -y
yum install cyrus-sasl-devel.x86_64 -y
yum install libgsasl-devel.x86_64 -y
pip uninstall configparser
pip install configparser -U

cd /tmp;
git clone https://github.com/apache/incubator-airflow.git
cd incubator-airflow/
git checkout v1-10-stable
export SLUGIFY_USES_TEXT_UNIDECODE=yes
pip install celery
pip install .
pip install .[all]

安装 rabbitmq

yum install erlang -y
rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
yum install rabbitmq-server
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service
rabbitmqctl add_user airflow 123456
rabbitmqctl set_user_tags airflow administrator
rabbitmqctl set_permissions -p / airflow ".*" ".*" ".*"

配置数据库

使用root登陆mysql并创建用户和database:

grant all privileges on airflow.* to airflow@'%' identified by '123456';

flush privileges;

create database airflow DEFAULT CHARACTER SET utf8;

还要设置一下mysql的配置文件:

找到 mysql 的my.ini 的 [mysqld], 加入

explicit_defaults_for_timestamp

重启mysqld

创建环境变量

mkdir -p /home/airflow
echo "export AIRFLOW_HOME=/home/airflow" >> /etc/profile
source /etc/profile

配置

airflow initdb
ls /home/airflow/airflow.cfg # 确保此文件的存在

修改 /home/airflow/airflow.cfg:

executor = CeleryExecutor
sql_alchemy_conn=mysql://123456@yun00:3306/airflow
broker_url = amqp://123456@yun00:5672/
result_backend = db+mysql://123456@yun00:3306/airflow
catchup_by_default = False
max_active_runs_per_dag = 1

这里我们设置max_active_runs_per_dag为一, 保证同一个dag只能依次运行.

初始化db

airflow initdb

注意第一次运行是为了生成airflow.cfg文件, 这次才是配置mysql.

安装systemd启动文件

cd /tmp
wget https://raw.githubusercontent.com/apache/incubator-airflow/master/scripts/systemd/airflow.conf
mv airflow.conf /etc/tmpfiles.d/
wget https://raw.githubusercontent.com/apache/incubator-airflow/master/scripts/systemd/airflow-webserver.service
mv airflow-webserver.service /usr/lib/systemd/system/

修改airflow-webserver.service:

ExecStart=/bin/airflow webserver  -p3425  --pid /run/airflow/webserver.pid

监听3425端口

修改/etc/sysconfig/airflow:

AIRFLOW_HOME=/home/airflow
mkdir -p /run/airflow; chown airflow:airflow /run/airflow/
systemctl restart airflow-webserver.service
systemctl status airflow-webserver.service # 查看服务状态
wget https://raw.githubusercontent.com/apache/incubator-airflow/master/scripts/systemd/airflow-scheduler.service
mv airflow-scheduler.service /usr/lib/systemd/system/
systemctl restart airflow-scheduler.service
systemctl status airflow-scheduler.service # 查看服务状态
wget https://raw.githubusercontent.com/apache/incubator-airflow/master/scripts/systemd/airflow-worker.service
mv airflow-worker.service /usr/lib/systemd/system/
systemctl restart airflow-worker.service
systemctl status airflow-worker.service # 查看服务状态

测试

访问: http://yun00:3425/admin/

启动: example_branch_dop_operator_v3 这是一个分钟级别的任务, 如果所有配置正确的话, 可以看到这个任务每分钟执行一次.

image.png

airflow的时区设置

airflow默认的调度时间为UTC. 这个非常麻烦, 因为中国的服务器时间是北京时间, 但是ariflow的调度时间是UTC, 相差了8小时.

airflow直到1.10.0 才解决这个问题. 有人会疑惑为什么这个基础的功能这个就才解决. airflow的开发者由于是跨国公司, 他们的服务器时间正是UTC. 所以他们不存在这个问题, 支持本地时间也是由于社区的要求才开发的功能.

在 airflow.cfg中配置:

default_timezone = Asia/Shanghai

airflow的分布式方案

airflow的webserver和scheduler是单点的, 但是可以对worker进行分布式部署. 只需要将相同的配置和环境变量拷贝过去, 同时启动worker进程. scheduler能及时发现新的worker.

有一点需要注意的是, worker的运行依赖于dags目录. 因此dags文件必须在每个airflow主机上存在. 本人推荐使用挂载公共目录的方式进行共享.

airflow的开发机配置

为了安全, 开发人员使用的机器不能是airflow运行的机器, 需要单独配置机器. 开发机的配置和worker机器一样的流程, 只是不需要启动任何服务而已.

你可能感兴趣的:(hadoop搭便车指南(2)-Airflow的安装)