systemd启动Airflow scheduler提示找不到hadoop是什么原因
问题核心成因
这个问题的本质是systemd启动的Airflow进程环境变量和你手动终端启动时的环境变量不一致,具体原因如下:
- systemd的
EnvironmentFile加载逻辑不符合预期
你配置的EnvironmentFile=/root/.bashrc根本不会生效:.bashrc是给交互式终端用的配置文件,默认开头都会存在[ -z "$PS1" ] && return的判断逻辑,只要是非交互式shell(systemd启动进程时的shell就是非交互式),执行到这行就会直接终止,后续你写在.bashrc里的HADOOP_HOME、PATH追加hadoop路径等配置完全不会被加载。 - subprocess调用命令的查找规则限制
你代码里用subprocess.Popen("hadoop")调用命令时,默认会从当前进程的PATH环境变量里搜索可执行文件。手动终端启动时你加载了.bashrc的配置,PATH里包含hadoop的bin目录,所以可以正常找到;systemd启动的进程PATH是系统默认值,没有hadoop的路径,就会抛出找不到文件的错误。
可行修复方案
- 方案1:直接在systemd service配置中显式声明需要的环境变量,在
[Service]段新增配置:
Environment=HADOOP_HOME=替换为你的hadoop实际安装路径 Environment=PATH=替换为你的普通PATH值:替换为hadoop的bin目录路径:替换为hadoop的sbin目录路径
修改后执行systemctl daemon-reload再重启Airflow scheduler服务即可。
- 方案2:修改
ExecStart启动命令,启动前主动source .bashrc加载环境变量:
把原配置的ExecStart=/bin/bash -c 'airflow scheduler'修改为:
ExecStart=/bin/bash -c 'source /root/.bashrc && airflow scheduler'
- 方案3:代码层面用绝对路径调用hadoop命令,完全不依赖环境变量:
把业务代码里的subprocess.Popen("hadoop xxx")修改为subprocess.Popen("你的hadoop可执行文件绝对路径 xxx"),该方案兼容性最高,不受部署环境的环境变量配置影响。
内容的提问来源于stack exchange,提问作者Yuesen Dong
相关产品推荐
相关产品推荐

