繁体   English   中英

基于 Web 请求在气流上运行作业

[英]Running Job On Airflow Based On Webrequest

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

因此,示例操作将是这样的。

  1. 用户提交一个表格,要求提供一些报告。
  2. 后端接收请求并向用户发送已收到请求的通知。
  3. 然后后端使用 Airflow 安排作业立即运行。
  4. Airflow 然后执行一系列与 DAG 相关的任务。 比如先从redshift拉取数据,从MySQL拉取数据,对两个结果集做一些操作,合并后将结果上传到Amazon S3,发邮件。

从我在线阅读的任何内容来看,您都可以通过在命令行上执行airflow ...来运行airflow 作业。 我想知道是否有可以执行相同操作的 python api。

谢谢。

Airflow REST API 插件会在这里帮助你。 按照说明安装插件后,您只需要点击以下网址: 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,并为 conf 传递一个 url 编码的 json(带有您在触发的 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.7 和 1.8 的最新版本中的实验性但内置的 API 端点。 这允许您在气流服务器上运行 REST 服务以侦听端口并接受 cli 作业。

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

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

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

有关如何配置它的文档可在此处获得: https : //airflow.apache.org/api.html

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

您应该根据需要查看Airflow HTTP Sensor 您可以使用它来触发 dag。

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 运行列表:

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 工作,在airflow.cfg中将rbac标志设置为True

以下是可用的 API 列表: here & there

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 中使用气流 API 的更多示例可在此处获得: https : //github.com/apache/airflow/blob/master/airflow/api/client/json_client.py

我在尝试做同样的事情时发现了这篇文章,经过进一步调查,我切换到 ArgoEvents。 它基本相同,但基于事件驱动的流,因此它更适合此用例。 链接: https : //argoproj.github.io/argo

Airflow 现在支持稳定的 REST API 使用稳定的 REST API,您可以触发 DAG:

curl --location --request POST 'localhost:8080/api/v1/dags/unpublished/dagRuns' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic YWRtaW46YWRtaW4=' \
--data-raw '{
    "dag_run_id": "dag_run_1",
    "conf": {
        "key": "value"
    }
}'

暂无
暂无

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

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