私はAirflowの初心者で、BashOperatorと格闘しています。 dag.pyでbashオペレーターを使用してシェルスクリプトにアクセスしたい。
私はチェックしました: Airflowでbashスクリプトファイルを実行する方法 および BashOperatorはbashファイルを実行しませんApache Airflow
bashオペレーターを介してシェルスクリプトにアクセスする方法について。
これは私がやったことです:
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
なぜこれが起こっているのかわかりません。任意の助けいただければ幸いです。
よろしくお願いします!
編集注:私が提供したパスではなく、一部のairflow tmpの場所を検索していると思います。しかし、どうすれば正しいパスを検索できますか。
Dockerバージョンを実行しているユーザー向け。
私はこれと同じ問題を抱えていましたが、問題を実現するのにしばらく時間がかかりました。Dockerでは動作が異なる場合があります。 DAGを実行すると、tmpファイルが移動します。dockerにエアフローがない場合、これは同じマシン上にあります。私のdockerバージョンでは、別のコンテナーに移動して実行します。もちろん、実行するとスクリプトファイルはオンになりません。
タスクログを注意深く確認すると、タスクが実行される前にこれが発生することがわかります。これは、airflow-dockerの設定によっても異なる場合があります。
以下を試してください。 bashファイルへの完全なファイルパスが必要です。
cmd = "/home/notebook/work/myfirstdag/dag/lib/script.sh "
t_1 = BashOperator(
task_id='start',
bash_command=cmd
)
定義したパスは確かですか?
cmd = "./myfirstdag/dag/lib/script.sh "
。という見出しは、コマンドを実行するパスに相対的であることを意味します。
これやってみませんか?
cmd = "find . -type f"
これを実行してみてください:
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
)