[英]Running Job On Airflow Based On Webrequest
我想知道是否可以在通过 HTTP 获取请求时执行气流任务。 我对 Airflow 的调度部分不感兴趣。 我只是想用它来代替芹菜。
因此,示例操作将是这样的。
从我在线阅读的任何内容来看,您都可以通过在命令行上执行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
。
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.