Bash运算符错误:在airflow中没有此文件或目录

15
我对Airflow和BashOperator都是新手,正在努力学习。我想在我的dag.py中使用BashOperator访问一个shell脚本。
我查看了以下内容: 如何在Airflow中运行bash脚本文件BashOperator未在apache airflow中运行bash文件 以了解如何通过BashOperator访问shell脚本。
这是我所做的:
 cmd = "./myfirstdag/dag/lib/script.sh "

        t_1 = BashOperator(
            task_id='start',
            bash_command=cmd
        )
在运行我的脚本并在airflow中检查后,我收到了以下错误消息:
[2018-11-01 10:44:05,078] {bash_operator.py:77} INFO - /tmp/airflowtmp7VmPci/startUDmFWW: line 1: ./myfirstdag/dag/lib/script.sh: No such file or directory
[2018-11-01 10:44:05,082] {bash_operator.py:80} INFO - Command exited with return code 127
[2018-11-01 10:44:05,083] {models.py:1361} ERROR - Bash command failed

不确定为什么会出现这种情况,希望能得到帮助。

谢谢!

编辑备注:我猜它在搜索一些airflow临时位置而不是我提供的路径。但是我该如何让它搜索正确的路径。


./myfirstdag/dag/lib/script.sh 相对于 $AIRFLOW_HOME/dags 目录吗? - SergiyKolesnikov
@SergiyKolesnikov 不是这样的。/myfirstdag/dag/lib/ 是不同的路径,而当我尝试时 $AIRFLOW_HOME 给出了另一条路径。 - Marvin
script.sh绝对路径是什么? - SergiyKolesnikov
@SergiyKolesnikov 这个路径是 /home/notebook/work/myfirstdag/dag/lib/。我也尝试过给出这个路径,但是它仍然报同样的错误。 - Marvin
1
显然,它正在搜索它创建的 tmp 目录。这是我从源代码中理解到的。https://github.com/apache/incubator-airflow/blob/27309b13f17402eaa61d4e4fede8785effa8bbb7/airflow/operators/bash_operator.py#L90 。不确定如何让它在我提供的路径中搜索。 - Marvin
@Marvin,你是否得到了一个明确的答案?以下4个答案中没有被接受或者赞同的很多。 - Canovice
5个回答

10

试一下这个:

bash_operator = BashOperator(
    task_id = 'task',
    bash_command = '${AIRFLOW_HOME}/myfirstdag/dag/lib/script.sh '
    dag = your_dag)

1
嗨,感谢您回答这个问题!您可以提供一些关于这段代码如何解决问题的细节吗? :) - barshopen
这解决了我的问题!如果我更改bash_command以包含末尾的额外空格以适应jinja错误,我将始终收到脚本未找到错误。使用环境变量彻底解决了它,谢谢! - Omar Pervez Khan

3

如果您正在运行docker版本。

我也遇到了同样的问题,花了一段时间才意识到问题所在,但是使用docker时行为可能会有所不同。当DAG运行时,它将其tmp文件移动,如果您没有在同一台计算机上安装airflow,则该文件将位于另一个容器中运行。而我的docker版本将其移动到另一个容器中运行,在运行时显然不会有脚本文件。

仔细检查任务日志,您应该在任务运行之前看到此问题发生。这也可能取决于您的airflow-docker设置。


3
我只使用 Docker 的特定版本。你是如何解决这个问题的? - Anupam Kumar

2
尝试以下操作。需要使用你的bash文件的完整文件路径。
cmd = "/home/notebook/work/myfirstdag/dag/lib/script.sh "

t_1 = BashOperator(
    task_id='start',
    bash_command=cmd
)

1
已尝试过,但无效。请参考上面的注释。 - Marvin
为了调试,请尝试删除“.sh”扩展名并使用“cmd=bash /home/notebook/work/myfirstdag/dag/lib/script”运行,然后告诉我它是否有效。 - kaxil

0
你确定你定义的路径正确吗?
cmd = "./myfirstdag/dag/lib/script.sh "

使用标题 . 表示它是相对于您执行命令的路径。

你能试试这个吗?

cmd = "find . -type f"

我也试过不加“.”,但是还是出现了同样的错误。 - Marvin
你误解了我的意思,我已经根据你应该尝试的命令更新了我的答案。 - Bsquare ℬℬ
是的,这就是我要找的。无论是如何将文件复制到该位置,还是访问我提供的路径。 - Marvin
你的电脑上 script.sh 文件位于哪里? 此外,也许你应该在你的 bash operator 中添加 dag=dag 的定义,请参考 https://airflow.apache.org/tutorial.html#it-s-a-dag-definition-file - Bsquare ℬℬ
@Marvin 在 Stackoverflow 上,你可以给那些有帮助的答案点赞以表达感谢,并从中选择任何一个作为最佳答案。 - Bsquare ℬℬ
显示剩余6条评论

0

尝试运行这个:

path = "/home/notebook/work/myfirstdag/dag/lib/script.sh"
copy_script_cmd = 'cp ' + path + ' .;'
execute_cmd = './script.sh'

t_1 = BashOperator(
    task_id='start',
    bash_command=copy_script_cmd + execute_cmd
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接