我有一个程序,每周要等待一个文件,但是此文件的名称带有时间戳记,以表示购买日期。所以我知道这周我要去吃点东西,名字可以是2020-05-25 * .csv至2020-05-31 * .csv。
我发现要启动气流的唯一方法是在@daily开始运行传感器,并使用执行日期查找是否有文件。 事实是,由于我不知道要在哪一天上传文件,因此我将有6个失败的传感器,因此有6个失败的DAG,并且有1个成功。
SFTP传感器部分示例:
with DAG(
"geometrie-sftp-to-safe",
default_args=default_args,
schedule_interval="@daily",
catchup=True,
) as dag:
starting_sensor = DummyOperator(
task_id="starting_sensor"
)
sensor_sftp_A = SFTPSensor(
task_id="sensor_sftp_A",
path="/input/geometrie/prod/Track_Geometry-{{ ds_nodash }}_A.csv",
sftp_conn_id="ssh_ftp_landing",
poke_interval=60,
soft_fail=True,
mode="reschedule"
)
第二次使用GCSSensor
with DAG(
"geometrie-preprocessing",
default_args=default_args,
schedule_interval="@daily",
catchup=True
) as dag:
# File A
sensor_gcs_A = GoogleCloudStorageObjectSensor(
task_id="gcs-sensor_A",
bucket="lisea-mesea-sea-cloud-safe",
object="geometrie/original/track_geometry_{{ ds_nodash }}_A.csv",
google_cloud_conn_id="gcp_conn",
poke_interval=50
)
因此,当且仅当传感器发生故障时,我希望DAG设置为跳过。如果还有其他事情,我会真正失败。
答案 0 :(得分:1)
Airflow有多个传感器,可感应目录以检查定义的文件。如果您希望DAG仅在接收到文件时才触发(考虑到一周中的任何时间都可以接收到文件),则schedule_interval设置为None将对您的用例起作用。
下面的GCSSensor示例将检测特定类型文件的存储桶并打印文件名。我很确定SFTP传感器应该以相同的方式工作。
dag = DAG(
dag_id='sensing-bucket',
schedule_interval=None,
default_args=args)
def new_file_detection(**context):
value = context['ti'].xcom_pull(task_ids='list_Files')
print('value is : '+str(value))
File_sensor = GoogleCloudStoragePrefixSensor(
task_id='gcs_polling',
bucket='lisea-mesea-sea-cloud-safe',
prefix='geometrie/original/track_geometry_',
dag=dag
)
GCS_File_list = GoogleCloudStorageListOperator(
task_id='list_Files',
bucket='lisea-mesea-sea-cloud-safe',
prefix='geometrie/original/track_geometry_',
delimiter='.csv',
google_cloud_storage_conn_id='google_cloud_default',
dag=dag
)
File_detection = PythonOperator(
task_id='print_detected_filename',
provide_context=True,
python_callable=new_file_detection,
dag=dag
)
File_sensor >> GCS_File_list >> File_detection