【问题标题】:Bash Operator error: No such file or directory in airflowBash 操作员错误:气流中没有这样的文件或目录
【发布时间】:2019-04-05 14:11:04
【问题描述】:

我是 Airflow 的新手,正在努力使用 BashOperator。我想在我的 dag.py 中使用 bash 操作符访问 shell 脚本。

我检查了: How to run bash script file in AirflowBashOperator doen't run bash file apache airflow

关于如何通过 bash 操作符访问 shell 脚本。

这就是我所做的:

 cmd = "./myfirstdag/dag/lib/script.sh "

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

在运行我的食谱并检查气流时,我收到以下错误:

[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

不知道为什么会这样。任何帮助将不胜感激。

谢谢!

编辑注意:我假设它在某些气流 tmp 位置而不是我提供的路径中搜索。但是如何让它搜索正确的路径。

【问题讨论】:

  • ./myfirstdag/dag/lib/script.sh 是否相对于 $AIRFLOW_HOME/dags 目录?
  • @SergiyKolesnikov 不,不是。 /myfirstdag/dag/lib/ 是不同的路径,而 $AIRFLOW_HOME 在我尝试时给出了不同的路径。
  • 那么script.sh绝对路径是什么?
  • @SergiyKolesnikov 这个 /home/notebook/work/myfirstdag/dag/lib/ 。我也试过给这个。它会引发同样的错误。
  • 显然,它正在创建的 tmp 目录中进行搜索。这就是我从源代码中理解的。 github.com/apache/incubator-airflow/blob/… 。不知道如何让它在我给的路径中搜索。

标签: python bash airflow directed-acyclic-graphs


【解决方案1】:

试试这个:

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

【讨论】:

  • 您好,感谢您回答这个问题!您能否提供一些详细信息,此代码如何解决问题? :)
  • 这解决了我的问题!如果我更改 bash_command 以在最后合并额外的空间以适应 jinja 错误,我总是会得到一个未找到脚本的错误。使用 env 变量解决了这个问题,谢谢!
【解决方案2】:

尝试运行这个:

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
)

【讨论】:

    【解决方案3】:

    对于那些运行 docker 版本的人。

    我遇到了同样的问题,我花了一段时间才意识到这个问题,docker 的行为可能会有所不同。当 DAG 运行时,它会移动它的 tmp 文件,如果 docker 上没有气流,则它在同一台机器上。使用我的 docker 版本,它会将其移动到另一个容器中运行,当然当它运行时不会打开脚本文件。

    仔细检查任务日志,您会看到在任务运行之前发生了这种情况。 这也可能取决于您的气流泊坞窗设置。

    【讨论】:

    • 我只使用 docker 版本。你是怎么解决这个问题的?
    【解决方案4】:

    你确定你定义的路径吗?

    cmd = "./myfirstdag/dag/lib/script.sh "
    

    带有标题表示它是相对于您执行命令的路径。

    你能试试这个吗?

    cmd = "find . -type f"
    

    【讨论】:

    • 我试过不带 .也。它给出了同样的错误。
    • 尝试设置 cmd="pwd" 并在相应目录中给我们一个 find - ls 的输出?
    • 我已经试过了。它提供了一个 tmp 目录,该目录在每次运行后都会被删除。但我不确定如何将路径设置为我的脚本所在的路径。
    • 好了,把find -ls作为自己的cmd,我们看看myfirstdag/dag/lib/script.sh在哪里
    • 似乎无法使用 find 命令找到它。这是因为它找不到目录本身。所以我做了cd /home ; ls -lrt。我得到的只是一个文件夹airflow/,其中我还有另外两个文件夹,分别名为example/notebook/,当我通过bashOperator 执行此操作时没有显示。我得到的只是:Running command: cd / ; cd home/; ls Output: airflow
    【解决方案5】:

    试试下面的。它需要有一个完整的 bash 文件路径。

    cmd = "/home/notebook/work/myfirstdag/dag/lib/script.sh "
    
    t_1 = BashOperator(
        task_id='start',
        bash_command=cmd
    )
    

    【讨论】:

    • 已经试过了。不工作。请参考上面的cmets。
    • 您能否为了调试,尝试删除.sh 扩展名并使用cmd=bash /home/notebook/work/myfirstdag/dag/lib/script 运行,让我知道它是否有效。
    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多