Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 气流上S3KeySensor中的多个文件路径_Python_Airflow_Directed Acyclic Graphs - Fatal编程技术网

Python 气流上S3KeySensor中的多个文件路径

Python 气流上S3KeySensor中的多个文件路径,python,airflow,directed-acyclic-graphs,Python,Airflow,Directed Acyclic Graphs,我有一些任务需要在S3上的某些文件或目录发生更改时运行 假设我有PythonOperator,如果/path/file.csv发生更改或者/path/nested\u path/some\u other\u file.csv发生更改,它需要运行 我曾尝试创建如下动态关键点传感器: trigger_path_list = ['/path/file.csv', '//path/nested_path/some_other_file.csv'] for trigger_path in

我有一些任务需要在S3上的某些文件或目录发生更改时运行

假设我有PythonOperator,如果/path/file.csv发生更改或者/path/nested\u path/some\u other\u file.csv发生更改,它需要运行

我曾尝试创建如下动态关键点传感器:

    trigger_path_list = ['/path/file.csv', '//path/nested_path/some_other_file.csv']
    for trigger_path in trigger_path_list:
        file_sensor_task = S3KeySensor(
                    task_id=get_sensor_task_name(trigger_path),
                    poke_interval=30,
                    timeout=60 * 60 * 24 * 8,
                    bucket_key=os.path.join('s3://', s3_bucket_name, trigger_path),
                    wildcard_match=True)
                file_sensor_task >> main_task
然而,这意味着必须触发两个传感器才能对其进行处理。 我还尝试使这两项任务都独一无二,如下所示:

        for trigger_path in trigger_path_list:
            main_task = PythonOperator(
task_id='{}_task_triggered_by_{}'.format(dag_name, trigger_path), 
...)
            file_sensor_task = S3KeySensor(
                task_id=get_sensor_task_name(trigger_path),
                poke_interval=30,
                timeout=60 * 60 * 24 * 8,
                bucket_key=os.path.join('s3://', s3_bucket_name, trigger_path),
                wildcard_match=True)
            file_sensor_task >> main_task
但是,这意味着如果列表中的所有文件都没有出现,DAG将无法完成。因此,如果/path/file.csv连续出现2次,则不会再次触发,因为DAG的这一部分将完成

难道没有办法将多个文件传递到S3KeySensor吗?我不想为每条路径创建一个DAG,因为对我来说,它将是40个DAG x大约5条路径,这将提供大约200个DAG

有什么想法吗?

这方面有一些想法:

  • 使用Airflow的其他任务,特别是您可能希望在主任务上获得
    一次成功
    ,这意味着只要一个上游传感器成功即可运行任务。这确实意味着其他传感器仍将继续运行,但您可以使用带有低
    轮询超时的标志来避免任何故障。或者,您可以让主任务或单独的后期清理任务将DAG中的其余传感器标记为成功
    
  • 根据可能的路径数量,如果不是太多,那么可能只有一个任务传感器,在路径中循环检查更改。一旦一条路径通过检查,您就可以返回,以便传感器成功。否则,如果没有路径通过,则保持轮询 在这两种情况下,如果您希望继续收听新文件,您仍然必须频繁/不间断地安排此DAG。一般来说,气流并不是真正用于长时间运行的流程。如果主任务逻辑更容易通过空气流执行,那么您仍然可以考虑外部过程监视器的改变,但是通过包含主任务的API或CLI来改变。p>
    也不确定是否适用于此处或您已经考虑过的内容,但您可能有兴趣更明确地了解更改的文件或目录,这些文件或目录可能会被用户使用

    谢谢你的提示!第一个看起来真的很有希望。对于第二点,您会让s3FileSensor查看所有给定的路径吗?有没有一种不用编辑传感器自身工作原理的方法?最后一个建议似乎只有广泛的bucket事件,而不是针对directories的特定事件。是的,我认为如果不创建一个自定义传感器来实现这一点,您将无法完成#2。然而,若你们在现有的基础上构建它,我不认为你们会免费得到很多逻辑。