celery backend mysql_完美起航-Airflow2.0.0+Celery集群搭建

1、说明

依赖python环境、基于pip安装apache-airflow

安装过程可能会缺少系统依赖报错如gcc、mysql-devel 之类, 缺什么就 yum install 什么即可

2、airflow + celery架构

c0df6d733c588f7bec4f73ac2e0a7d93.png

3、集群规划

服务器hadoop100服务器hadoop101服务器hadoop102web serverV

schedulerV

workerVVV

注意

编写DAG文件需要保证在集群每个节点都要同步,因为每个worker都是从本地进行读取执行的, 不像oozie那样上传到HDFS. scheduler仅仅是发送一条要执行哪个DAG下的哪个Task的命令到Queue Broker下, 然后worker再根据命令去指定指定的那个Task.

集群里面的airflow.cfg配置文件也需要保持同步

4、安装

4.1、下载apache-airflow、celery、mysql、redis包

1、在3台机器上都要下载一次

以下是在hadoop101上执行, 在hadoop100,hadoop102一样的下载

[hadoop@hadoop101 ~]$ pip3 install apache-airflow==2.0.0

[hadoop@hadoop101 ~]$ pip3 install apache-airflow[celery]

[hadoop@hadoop101 ~]$ pip3 install apache-airflow[reids] -i

http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

2、配置Airflow工作目录的环境变量

在3台机器上都要配置一次、最好使用xsync脚本同步

[hadoop@hadoop101 ~]$ vim /etc/profile

添加如下

export AIRFLOW_HOME=~/app/airflow

3 配置airflow命令

下载apache-airflow包后,在python环境的bin目录下会生成airflow命令, 需要自己配置到全局调用, 我是用软连接挂在到/usr/local/bin

[hadoop@hadoop101 bin]$ pwd

/usr/local/python3/bin

[hadoop@hadoop101 bin]$ ll | grep airflow

-rwxr-xr-x. 1 hadoop hadoop 231 1月 6 19:58 airflow

# 创建软连接

[hadoop@hadoop101 bin]$ ln -s /usr/local/python3/bin/airflow /usr/local/bin/airflow

[hadoop@hadoop101 bin]$ cd /usr/local/bin/

[hadoop@hadoop101 bin]$ ll

lrwxrwxrwx. 1 root root 30 1月 7 10:26 airflow -> /usr/local/python3/bin/airflow

使用命令airflow --help看是否执行成功, 执行airflow的任何命令都会初始化airflow的工作目录的生成(在${AIRFLOW_HOME}目录下)

[hadoop@hadoop101 airflow]$ pwd

/home/hadoop/app/airflow

[hadoop@hadoop101 airflow]$ ll

总用量 24488

-rw-rw-r--. 1 hadoop hadoop 38857 1月 7 20:09 airflow.cfg

drwxrwxr-x. 9 hadoop hadoop 179 1月 7 20:05 logs

-rw-rw-r--. 1 hadoop hadoop 2619 1月 7 10:26 unittests.cfg

-rw-rw-r--. 1 hadoop hadoop 4279 1月 7 10:26 webserver_config.py

4.2、配置元数据库

修改 ${AIRFLOW_HOME}/airflow.cfg配置文件, 配置远程连接数据库的地址, 需要先创建一个叫airflow的数据库. 因为默认使用的是sqlite作为元数据库不支持DAG任务的并发执行、绝不能用于生产环境

需要设置mysql的my.cnf 文件下的 `[mysqld] 的 explicit_defaults_for_timestamp=1 才能正常连接成功

[core]

# 时区设置

default_timezone = Asia/Shanghai

# 数据库连接设置

sql_alchemy_conn = mysql+mysqldb://airflow:123456@www.burukeyou.com:3306/airflow?charset=utf8

# 数据库编码

sql_engine_encoding = utf-8

4.3、配置celery

修改 ${AIRFLOW_HOME}/airflow.cfg配置文件, 配置celery和executor相关配置

# 设置执行策略、可选SequentialEXecutor(默认)、LocalExecutor(适合单机)、Celery Executor

executor = CeleryExecutor

# 配置celery的broker_url(存储要执行的命令然后celery的worker去消费)

broker_url = redis://127.0.0.1:6379/0

# 配置celery的result_backend (存储任务执行状态)、 也可以用redis存储

result_backend = db+mysql://airflow:123456@www.burukeyou.com:3306/airflow?charset=utf8

#result_backend = redis://127.0.0.1:6379/1

4、其他airflow.cfg 配置(可选)

# web ui 界面使用的时区

default_ui_timezone=Asia/Shanghai

# 是否加载案例demo

load_examples = False

# 是否执行以前未执行的DAG Run, 定义每个DAG对象可传递catchup参数覆盖

catchup_by_default = False

5、启动

5.1 初始化元数据库表生成

执行如下命令成功后, 查看数据库airflow下是否生成各个表

[hadoop@hadoop101 ~]$ airflow db init

bedec98672b3192fbf9b0a182fd2fc91.png

5.2 启动web server、scheduler、worker

在hadoop101上启动web server、scheduler、worker

在hadoop100和102上启动worker

[hadoop@hadoop101 ~]$ airflow webserver --port 9988 # -D 参数以守护进程启动(以下均适用)

[hadoop@hadoop101 ~]$ airflow scheduler -D

[hadoop@hadoop101 ~]$ airflow celery worker -D # -q 可指定worker监听消费的队列,默认是default队列

[hadoop@hadoop100 ~]$ airflow celery worker -D

[hadoop@hadoop102 ~]$ airflow celery worker -D

访问 hadoop101:9988的web server 的UI界面

a0c638f4bb4d0d509507ccd461dabbba.png

发现需要账号密码、创建一个即可.

[hadoop@hadoop101 ~]$airflow users create \

--username hadoop \

--firstname hadoop \

--lastname hadoop \

--role Admin \

--email xx@xx.com

74186521059dd97b4dc6a206fd92f7d6.png

之后在${AIRFLOW_HOME}/dags 编写自己的DAG任务即可, DAG文件名以包含dag或者airflow就会被scheduler去调度执行. 会根据 DAG对象的start_date和schedule_interval两个参数去生成每个DAG RUN的时间点, 时间到了就会触发执行.

tip:

start_date和schedule_interval 两个参数去配置定时的周期可不是从字面上看上那么简单.

打赏

如果觉得文章有用,你可鼓励下作者(支付宝)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我想将frontend 也是用volumes,将其映射到/app/frontend目录,在/app/frontend下install以及build,如何实现 docker-compose.yml文件: version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always frontend:dockerfile文件 FROM node:16.18.1 WORKDIR /app/frontend COPY package*.json ./ RUN npm install COPY . . RUN npm run build:prod FROM nginx:latest COPY --from=0 /app/frontend/dist/ /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
最新发布
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值