我想知道在通过HTTP获取请求时是否可以执行气流任务。我对Airflow的调度部分不感兴趣。我只想用它作为芹菜的替代品。
所以示例操作就是这样的。
从我在线阅读的内容中,您可以通过在命令行上执行airflow ...
来运行气流作业。我想知道是否有一个可以执行相同操作的python api。
感谢。
答案 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
。
答案 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