基于Webrequest在Airflow上运行作业

时间:2017-02-22 22:47:27

标签: python airflow

我想知道在通过HTTP获取请求时是否可以执行气流任务。我对Airflow的调度部分不感兴趣。我只想用它作为芹菜的替代品。

所以示例操作就是这样的。

  1. 用户提交请求报告的表单。
  2. 后端接收请求并向用户发送已收到请求的通知。
  3. 然后后端使用Airflow安排作业立即运行。
  4. Airflow然后执行与DAG相关的一系列任务。例如,首先从redshift中提取数据,从MySQL提取数据,对两个结果集进行一些操作,将它们组合,然后将结果上传到Amazon S3,发送电子邮件。
  5. 从我在线阅读的内容中,您可以通过在命令行上执行airflow ...来运行气流作业。我想知道是否有一个可以执行相同操作的python api。

    感谢。

5 个答案:

答案 0 :(得分:13)

Airflow REST API Plugin可以帮到你。按照安装插件的说明操作后,您只需要点击以下网址:http://{HOST}:{PORT}/admin/rest_api/api/v1.0/trigger_dag?dag_id={dag_id}&run_id={run_id}&conf={url_encoded_json_parameters},将dag_id替换为dag的id,省略run_id或指定唯一ID,并传递url编码的json用于conf(使用触发式dag中需要的任何参数)。

这是一个使用jQuery调用Airflow api的示例JavaScript函数:

function triggerDag(dagId, dagParameters){
    var urlEncodedParameters = encodeURIComponent(dagParameters);
    var dagRunUrl = "http://airflow:8080/admin/rest_api/api/v1.0/trigger_dag?dag_id="+dagId+"&conf="+urlEncodedParameters;
    $.ajax({
        url: dagRunUrl,
        dataType: "json",
        success: function(msg) {
            console.log('Successfully started the dag');
        },
        error: function(e){
           console.log('Failed to start the dag');
        }
    });
}

答案 1 :(得分:8)

气流中的一个新选项是 experimental ,但是在最近的1.7和1.8版本中内置了API端点。这允许您在气流服务器上运行REST服务以侦听端口并接受cli作业。

我自己只有有限的经验,但我已成功运行测试骰子。根据文档:

/api/experimental/dags/<DAG_ID>/dag_runs为给定的dag id(POST)创建一个dag_run。

这将安排你想要运行的任何dag的立即运行。但它仍然使用调度程序,等待心跳看到dag正在运行并将任务传递给worker。这与CLI的行为完全相同,所以我仍然相信它适合您的用例。

有关如何配置文档的文档,请访问:https://airflow.apache.org/api.html

在github中也有一些简单的示例客户端,在airflow / api / clients

答案 2 :(得分:1)

Airflow的实验性REST API接口可用于此目的。

以下请求将触发DAG:

curl -X POST \
    http://<HOST>:8080/api/experimental/dags/process_data/dag_runs \
    -H 'Cache-Control: no-cache' \
    -H 'Content-Type: application/json' \
    -d '{"conf":"{\"START_DATE\":\"2018-06-01 03:00:00\", \"STOP_DATE\":\"2018-06-01 23:00:00\"}'

以下请求检索特定DAG ID的Dag Run列表:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://<HOST>:8080/api/experimental/dags/process_data/dag_runs

要使GET API正常工作,请将rbac的{​​{1}}标志设置为True

以下是可用的API列表:herethere

答案 3 :(得分:1)

Airflow具有REST API(当前处于实验状态)-在此处可用: https://airflow.apache.org/api.html#endpoints

如果您不希望按照其他答案中的建议安装插件-这是代码,您可以直接使用API​​进行操作:

def trigger_dag(self, dag_id, run_id=None, conf=None, execution_date=None):
    endpoint = '/api/experimental/dags/{}/dag_runs'.format(dag_id)
    url = urljoin(self._api_base_url, endpoint)
    data = self._request(url, method='POST',
                         json={
                             "run_id": run_id,
                             "conf": conf,
                             "execution_date": execution_date,
                         })
    return data['message']

更多可用示例在python中使用airflow API: https://github.com/apache/airflow/blob/master/airflow/api/client/json_client.py

答案 4 :(得分:0)

我在尝试执行此操作时发现了该帖子,在进一步调查后,我切换到ArgoEvents。它基本上是相同的,但是基于事件驱动流,因此它更适合此用例。 链接: https://argoproj.github.io/argo