Python 气流上S3KeySensor中的多个文件路径
我有一些任务需要在S3上的某些文件或目录发生更改时运行 假设我有PythonOperator,如果/path/file.csv发生更改或者/path/nested\u path/some\u other\u file.csv发生更改,它需要运行 我曾尝试创建如下动态关键点传感器: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
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
有什么想法吗?这方面有一些想法:
一次成功
,这意味着只要一个上游传感器成功即可运行任务。这确实意味着其他传感器仍将继续运行,但您可以使用带有低轮询超时的标志来避免任何故障。或者,您可以让主任务或单独的后期清理任务将DAG中的其余传感器标记为成功李>
根据可能的路径数量,如果不是太多,那么可能只有一个任务传感器,在路径中循环检查更改。一旦一条路径通过检查,您就可以返回,以便传感器成功。否则,如果没有路径通过,则保持轮询李>
在这两种情况下,如果您希望继续收听新文件,您仍然必须频繁/不间断地安排此DAG。一般来说,气流并不是真正用于长时间运行的流程。如果主任务逻辑更容易通过空气流执行,那么您仍然可以考虑外部过程监视器的改变,但是通过包含主任务的API或CLI来改变。p>
也不确定是否适用于此处或您已经考虑过的内容,但您可能有兴趣更明确地了解更改的文件或目录,这些文件或目录可能会被用户使用 谢谢你的提示!第一个看起来真的很有希望。对于第二点,您会让s3FileSensor查看所有给定的路径吗?有没有一种不用编辑传感器自身工作原理的方法?最后一个建议似乎只有广泛的bucket事件,而不是针对directories的特定事件。是的,我认为如果不创建一个自定义传感器来实现这一点,您将无法完成#2。然而,若你们在现有的基础上构建它,我不认为你们会免费得到很多逻辑。