繁体   English   中英

Airflow - 如果传感器出现故障则跳过 DAG

[英]Airflow - skip DAG if sensor failed

我有一个过程,我每周都在等待一个文件,但是这个文件在其名称中带有时间戳,以表示 mesurment 的日期。 所以我知道我这周会有一些东西,名字可以是 2020-05-25*.csv 到 2020-05-31*.csv。

我发现使用 airflow 开始我的进程的唯一方法是在开始@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 设置为跳过的原因,当且仅当传感器发生故障时。 如果是别的,我想要一个真正的失败。

Airflow 具有多个传感器,可感应目录以检查定义的文件。 schedule_interval as None 将适用于您的用例,因为您希望 DAG 仅在收到文件时触发(考虑到文件可以在一周内的任何时间收到)。

下面的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM