Airflow 重新处理气流的历史数据

Airflow 重新处理气流的历史数据,airflow,airflow-scheduler,apache-airflow-xcom,Airflow,Airflow Scheduler,Apache Airflow Xcom,我正在将一些管道迁移到气流。我希望能够在历史负载的特定时间范围内运行一些DAG,我正在探索我的选项。注意:我不想重新执行以前的运行(例如过去10天),但我希望能够在需要时(甚至在创建DAG之前)根据上次加载的时间戳变量(例如2017-12-09 00:00:00.000000)重新加载数据。此变量还用于外部调用API 我脑子里总共有4个概念: 当前dag运行通过元数据数据库中的xcom表实现交换此变量。尽管每次我想修改它时,我必须更新数据类型为blob的字段。我甚至不确定这是否可能 将此参数保

我正在将一些管道迁移到气流。我希望能够在历史负载的特定时间范围内运行一些DAG,我正在探索我的选项。注意:我不想重新执行以前的运行(例如过去10天),但我希望能够在需要时(甚至在创建DAG之前)根据上次加载的时间戳变量(例如2017-12-09 00:00:00.000000)重新加载数据。此变量还用于外部调用API

我脑子里总共有4个概念:

  • 当前dag运行通过元数据数据库中的xcom表实现交换此变量。尽管每次我想修改它时,我必须更新数据类型为blob的字段。我甚至不确定这是否可能

  • 将此参数保留在其他位置。易于实施的解决方案,但我不想重新发明轮子。如果总是有一些功能实现的气流,我想探讨它

  • 气流变量:到目前为止,也许还不是最受认可的气流概念,但我确实觉得这就是我想要的

  • 回填:如果我没有弄错的话,这是附在以前的执行。因此,如果我的dag在12月份开始每天运行,我将无法加载8月份的数据


  • 有什么建议吗?

    对于此用例,您可以按如下方式处理ETL:

  • 从变量中读取上次加载的值
  • 在上次加载到当前时间戳或执行日期或您选择的更高边界之间运行ETL
  • 将较高的边界存储到变量中
  • 概述可以是:

    def set_dag_variables(**kwargs):
        new_value = kwargs['var_value']
        Variable.set(key=DAG_ID, value=new_value, serialize_json=True)
    
    
    last_loaded = Varible.get(key=var_name) # don't do this in production. Use macro instead.
    your_higher_boundary_param = datetime.now(tz=None)
    
    op1 = YourOperaror(
        task_id='op1_task',
        params = {"param1":last_loaded,
                 param2: your_higher_boundary_param }
    )
    op2 = PythonOperator(
        task_id='set_dag_variable_task',
        provide_context=True,
        python_callable=set_dag_variables,
        op_kwargs={'var_value': your_higher_boundary_param}
        )
    op1 >> op2
    
    注意:这是非常高的级别,细节很重要


    例如,我使用了
    variable.get
    超出运算符/宏范围,这是一种不好的做法。正确的方法是使用宏,但由于示例的提出,我简化了宏。

    谢谢你,Elad。我将使用变量解决方案,到目前为止效果良好