Airflow中的多个BashOperator无法识别当前文件夹

时间:2019-03-01 22:03:49

标签: airflow

我正在使用Airflow来查看是否可以对数据进行同样的工作,原始的摄取通过在Shell中的两个步骤完成:

  1. cd〜/ bm3
  2. ./ bm3.py runjob -p projectid -j jobid

在Airflow中,BashOperator有两个任务:

task1 = BashOperator(
    task_id='switch2BMhome',
    bash_command="cd /home/pchoix/bm3",
    dag=dag)

task2 = BashOperator(
    task_id='kickoff_bm3',
    bash_command="./bm3.py runjob -p client1 -j ingestion",
    dag=dag)

task1 >> task2

task1已按预期完成,请在下面记录:

[2019-03-01 16:50:17,638] {bash_operator.py:100} INFO - Temporary script location: /tmp/airflowtmpkla8w_xd/switch2ALhomeelbcfbxb
[2019-03-01 16:50:17,638] {bash_operator.py:110} INFO - Running command: cd /home/rxie/al2

task2因日志中显示的原因而失败:

[2019-03-01 16:51:19,896] {bash_operator.py:100} INFO - Temporary script location: /tmp/airflowtmp328cvywu/kickoff_al2710f17lm
[2019-03-01 16:51:19,896] {bash_operator.py:110} INFO - Running command: ./bm32.py runjob -p client1 -j ingestion
[2019-03-01 16:51:19,902] {bash_operator.py:119} INFO - Output:
[2019-03-01 16:51:19,903] {bash_operator.py:123} INFO - /tmp/airflowtmp328cvywu/kickoff_al2710f17lm: line 1: ./bm3.py: No such file or directory

因此,似乎每个任务都是从一个看起来唯一的临时文件夹执行的,该文件夹使第二个任务失败。

如何从特定位置运行bash命令?

如果您可以在这里分享任何想法,将不胜感激。

非常感谢您。

更新: 感谢您的建议,该建议几乎可行。

bash_command="cd /home/pchoix/bm3 && ./bm3.py runjob -p client1 -j ingestion",首先可以正常工作,但是runjob包含多个任务,第一个任务有效,第二个任务调用impala-shell.py运行某些东西,impala- shell.py在其外部将python2指定为其解释器语言,其他部分正在使用python 3。

当我在shell中运行bash_command但在Airflow中运行时,由于未知原因,尽管我设置了正确的PATH并确保在shell中运行,这没关系:

(base) (venv) [pchoix@hadoop02 ~]$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)

该任务仍在python 3中执行,并使用python 3,从日志中可以看到:

[2019-03-01 21:42:08,040] {bash_operator.py:123} INFO -   File "/data/cloudera/parcels/CDH-5.12.0-1.cdh5.12.0.p0.29/bin/../lib/impala-shell/impala_shell.py", line 220
[2019-03-01 21:42:08,040] {bash_operator.py:123} INFO -     print '\tNo options available.'
[2019-03-01 21:42:08,040] {bash_operator.py:123} INFO -                                   ^
[2019-03-01 21:42:08,040] {bash_operator.py:123} INFO - SyntaxError: Missing parentheses in call to 'print'

请注意,当我在shell环境中运行作业时,此问题不存在:

./bm3.py runjob -p client1 -j ingestion

1 个答案:

答案 0 :(得分:0)

怎么样:

task = BashOperator(
    task_id='switch2BMhome',
    bash_command="cd /home/pchoix/bm3 && ./bm3.py runjob -p client1 -j ingestion",
    dag=dag)