Airflow 从XCom值中选择运算符参数
将xcom值分配给Bash运算符时遇到一些问题 除了tmp_dir之外,所有参数都被正确检索,tmp_dir是在init_dag期间生成的xcom值。我能够在自定义运算符中检索该值,但无法在bash运算符中检索该值。我添加了我尝试过的三种不同方法的输出,这些方法浮现在我的脑海中 我认为一种方法是,如果我能将该值存储在一个变量中,但我也无法找出它是如何存储的 我们将非常感谢您的帮助 这是我的DAG代码:Airflow 从XCom值中选择运算符参数,airflow,apache-airflow-xcom,Airflow,Apache Airflow Xcom,将xcom值分配给Bash运算符时遇到一些问题 除了tmp_dir之外,所有参数都被正确检索,tmp_dir是在init_dag期间生成的xcom值。我能够在自定义运算符中检索该值,但无法在bash运算符中检索该值。我添加了我尝试过的三种不同方法的输出,这些方法浮现在我的脑海中 我认为一种方法是,如果我能将该值存储在一个变量中,但我也无法找出它是如何存储的 我们将非常感谢您的帮助 这是我的DAG代码: import airflow from airflow.models import DAG f
import airflow
from airflow.models import DAG
from airflow.utils.dates import days_ago
from airflow.models import Variable
from utility import util
import os
from airflow.operators.bash_operator import BashOperator
from operators.mmm_operator import MMMOperator #it is a custom operator
from operators.iftp_operator import IFTPOperator #it is another custom operator
AF_DATAMONTH = util.get_date_by_format(deltaMth=2,deltaDay=0,ft='%b_%Y').lower() #it gives a date in required format
AF_FILENM_1 = 'SOME_FILE_' + AF_DATAMONTH + '.zip' #required filename for ftp
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': days_ago(0),
}
dag = DAG(dag_id='my_dag', default_args=default_args, schedule_interval=None)
init_dag = MMMOperator(
task_id='init_dag',
provide_context=True,
mmm_oracle_conn_id=Variable.get('SOME_VARIABLE'),
mmm_view="{0}.{1}".format(Variable.get('ANOTHER_VARIABLE'), AF_DAG_MMM_VIEW_NM),
mmm_view_filter=None,
mmm_kv_type=True,
mmm_af_env_view="{0}.{1}".format(Variable.get('ANOTHER_VARIABLE_1'),Variable.get('ANOTHER_VARIABLE_2')),
dag=dag
) #local_tmp_folder is generated here and pushed via xcom
download_ftp_files = IFTPOperator(task_id='download_ftp_files',
ftp_conn_id=util.getFromConfig("nt_conn_id"), #value properly retrieved by xcom_pull
operation='GET',
source_path=util.getFromConfig("nt_remote_folder"), #value properly retrieved by xcom_pull
dest_path=util.getFromConfig("local_tmp_folder"), #value properly retrieved by xcom_pull
filenames=AF_FILENM,
dag=dag
)
bash_cmd_template = "cd /vagrant/ && python3 hello_print.py {{params.client}} {{params.task}} {{params.environment}} {{params.tmp_dir}} {{params.af_file_nm}}"
#try 1 output value for params.tmp_dir: {{ ti.xcom_pull(task_ids="init_dag")["local_tmp_folder"] }} - instead of the actual tmp folder location
#try 2 and try 3 output: Broken DAG: [/home/vagrant/airflow/dags/my_dag.py] name 'ti' is not defined - message in UI
execute_main_py_script = BashOperator(
task_id='execute_main_py_script',
bash_command=bash_cmd_template,
params={'client' : 'some_client',
'task' : 'load_some_task',
'environment' : 'environment_name',
#'tmp_dir' : util.getFromConfig("local_tmp_folder"), #try 1
#'tmp_dir' : {{ ti.xcom_pull(task_ids="init_dag")["local_tmp_folder"] }} #try 2
#'tmp_dir' : ti.xcom_pull(task_ids="init_dag")["local_tmp_folder"] #try 3
'af_file_nm' : AF_FILENM_1
},
provide_context=True,
dag=dag
)
init_dag >> download_ftp_files >> execute_main_py_script
BashOperator的
params
参数不是Jinja模板,因此在params
中传递的任何值都将按“原样”呈现
您应该在bash\u cmd\u模板中直接传递tmp\u dir
的值,如下所示:
bash\u cmd\u template=”“”
cd/vagrant/&&python3 hello_print.py{{params.client}{{params.task}{{params.environment}{{ti.xcom\u pull(task_id=“init_dag”)[“local_tmp\u folder”]}{{params.af u file\u nm}
"""
执行\u main\u py\u script=bash运算符(
任务\u id='execute\u main\u py\u script',
bash\u命令=bash\u cmd\u模板,
params={'client':'some_client',
“任务”:“加载一些任务”,
“环境”:“环境名称”,
'af_file_nm':af_FILENM_1
},
提供上下文=True,
dag=dag
)