Airflow中执行spark-submit命令提示‘command not found’问题求助
解决Airflow中BashOperator执行
spark-submit提示"command not found"的问题 这个问题的核心原因很明确:Airflow Worker进程运行时的环境变量和你手动在终端登录时的环境变量不一样。你在终端里能正常执行spark-submit,是因为你的用户shell加载了配置文件(比如.bashrc或.profile),里面已经把Spark的bin目录加到了PATH里;但Airflow的后台进程不会加载这些用户级的配置,所以它的PATH里找不到spark-submit的位置。
下面给你几个可行的解决办法:
1. 使用spark-submit的绝对路径执行
这是最直接的方法,先在终端里执行which spark-submit,得到它的绝对路径(比如/usr/local/spark/bin/spark-submit),然后把BashOperator里的命令换成绝对路径版本:
t1 = BashOperator( task_id='spark-submit-scala', bash_command='/usr/local/spark/bin/spark-submit --class dataload.dataload_daily /home/ubuntu/airflow/dags/scripts/data_to_s3-assembly-0.1.jar' )
2. 在Bash命令中临时设置PATH
如果不想写死绝对路径,可以在执行spark-submit前先把Spark的bin目录加到当前命令的PATH里:
t1 = BashOperator( task_id='spark-submit-scala', bash_command='export PATH=$PATH:/usr/local/spark/bin && spark-submit --class dataload.dataload_daily /home/ubuntu/airflow/dags/scripts/data_to_s3-assembly-0.1.jar' )
注意这里的/usr/local/spark/bin要换成你实际的Spark安装路径下的bin目录。
3. 配置Airflow全局环境变量
如果你的Airflow里有很多Spark任务,不想每个任务都单独设置,可以给Airflow Worker配置全局的环境变量:
- 若用systemd管理Airflow Worker,找到对应的服务文件(比如
airflow-worker.service),在脚本里添加Environment="PATH=/usr/local/spark/bin:$PATH" - 或者修改Airflow的
airflow.cfg配置文件,找到env_vars项,添加PATH=/usr/local/spark/bin:$PATH(不同Airflow版本配置方式略有差异,可参考对应版本文档)
配置完成后重启Airflow Worker,这样所有任务都会继承这个包含Spark路径的PATH环境变量。
内容的提问来源于stack exchange,提问作者ds_user
相关产品推荐
相关产品推荐

