关于不同的气流运行方式以及如何添加气流提供程序包的问题



我有几个关于气流启动的问题。

启动气流,我用三种不同的方法:

方式1:我使用命令pip install apache-airflow安装气流我用airflow initdb初始化数据库我用airflow webserver -p 8080命令启动web服务器我可以进入localhost:8080进入UI

方式2:我用airflow standalone命令

启动气流第三道:我下载了以下docker-compose。yamlcurl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.0/docker-compose.yaml'我使用以下命令创建目录dags、日志、插件和env文件

mkdir -p ./dags ./logs ./plugins
echo -e "AIRFLOW_UID=$(id -u)" > .env

然后我运行命令docker-compose up airflow-init

我用docker-compose up启动服务

所以我有几点不明白:

  1. 如果我在情况1和2中理解正确,我在本地安装并启动气流。airflow webserver -p 8080airflow standalone有什么区别?
  2. 在案例2中,我们运行docker-compose up airflow-init命令,这将启动airflow-init服务。然后我们将运行docker-compose up命令来启动所有其他服务。不能直接启动docker-compose up而不启动docker-compose up airflow-init吗?乍一看,我会说没有,因为在下面的docker-compose .yaml

我们在一些服务中有:

depends_on:
<<: *airflow-common-depends-on
airflow-init:
condition: service_completed_successfully

例如,在服务airflow-triggerer中,我们有:

airflow-triggerer:
<<: *airflow-common
command: triggerer
healthcheck:
test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"']
interval: 10s
timeout: 10s
retries: 5
restart: always
depends_on:
<<: *airflow-common-depends-on
airflow-init:
condition: service_completed_successfully
  1. 最后我想在气流中创建一个Spark连接。为此,我首先使用命令pip install 'apache-airflow-providers-apache-spark'安装apache-airflow-providers-apache-spark插件。当我运行命令airflow providers list时,我看到插件被添加。我不明白的是,当我通过命令airflow webserver -p 8080airflow standalone访问UI时,我可以在Admin>Connections>Connection类型中看到,我有Spark插件。但是当我通过命令docker-compose up访问UI时,我看不到Spark插件。

是因为命令pip install 'apache-airflow-providers-apache-spark'只在本地气流中安装插件吗?如果是,我如何在集装箱气流上也安装插件?

非常感谢你的帮助!

airflow webserver -p 8080airflow standalone命令的区别是什么?

airflow standalone是一个集所有功能于一体的命令,它初始化db,创建用户,运行web服务器,调度程序和触发器,它类似于下面的bash脚本(但都在同一个进程中):

airflow db init
airflow users create 
--username admin 
--firstname admin 
--lastname admin 
--role Admin 
--email admin@example.com
airflow webserver --port 8080
airflow scheduler
airflow triggerer

通过分别调用它们,你可以选择你想要启动的服务,你可以在不影响其他服务的情况下重新启动一个服务,你可以在不同的主机上运行它们(如果你的数据库对所有主机都是可访问的)。

是否可以直接启动docker-compose up而不启动docker-compose up airflow-init?

由于所有的服务都有airflow-init服务作为依赖项,docker将运行airflow-init服务并等待它成功完成后再启动其他任务,因此您可以直接运行docker-compose up

是因为命令pip install 'apache-airflow-providers-apache-spark'只在本地气流中安装了插件吗?如果是,我如何在集装箱气流上也安装插件?

是的,通过执行这个命令,你在本地安装lib,如果你想在docker compose中拥有它,你需要构建你自己的镜像并在docker compose中使用它

Dockerfile:

FROM apache/airflow:2.5.0
RUN pip install 'apache-airflow-providers-apache-spark'

创建图像:

docker run -it my_airflow_image:2.5.0 .

运行docker compose up:

AIRFLOW_IMAGE_NAME=my_airflow_image:2.5.0 docker-compose up

最新更新