Rest 如何使用气流DAG调用静止端点

Rest 如何使用气流DAG调用静止端点,rest,docker,airflow,airflow-scheduler,Rest,Docker,Airflow,Airflow Scheduler,我是新来的。我想使用DAG调用一个REST端点。 例如,REST端点 @PostMapping(path = "/api/employees", consumes = "application/json") 现在,我想使用气流DAG调用此静止端点,并对其进行调度。我所做的是使用SimpleHttpOperator调用其余端点 t1 = SimpleHttpOperator( task_id='post_op', endpoint='http://localhost:8084/api/emplo

我是新来的。我想使用DAG调用一个REST端点。 例如,REST端点

@PostMapping(path = "/api/employees", consumes = "application/json")
现在,我想使用气流DAG调用此静止端点,并对其进行调度。我所做的是使用SimpleHttpOperator调用其余端点

t1 = SimpleHttpOperator(
task_id='post_op',
endpoint='http://localhost:8084/api/employees',
data=json.dumps({"department": "Digital","id": 102,"name": "Rakesh","salary": 80000}),
headers={"Content-Type": "application/json"},
dag=dag,)
当我触发DAG时,任务将失败

[2019-12-30 09:09:06,330] {{taskinstance.py:862}} INFO - Executing <Task(SimpleHttpOperator): 
post_op> on 2019-12-30T08:57:00.674386+00:00
[2019-12-30 09:09:06,331] {{base_task_runner.py:133}} INFO - Running: ['airflow', 'run', 
'example_http_operator', 'post_op', '2019-12-30T08:57:00.674386+00:00', '--job_id', '6', '--pool', 
'default_pool', '--raw', '-sd', 'DAGS_FOLDER/ExampleHttpOperator.py', '--cfg_path', 
'/tmp/tmpf9t6kzxb']
[2019-12-30 09:09:07,446] {{base_task_runner.py:115}} INFO - Job 6: Subtask post_op [2019-12-30 
09:09:07,445] {{__init__.py:51}} INFO - Using executor SequentialExecutor
[2019-12-30 09:09:07,446] {{base_task_runner.py:115}} INFO - Job 6: Subtask post_op [2019-12-30 
09:09:07,446] {{dagbag.py:92}} INFO - Filling up the DagBag from 
/usr/local/airflow/dags/ExampleHttpOperator.py
[2019-12-30 09:09:07,473] {{base_task_runner.py:115}} INFO - Job 6: Subtask post_op [2019-12-30 
09:09:07,472] {{cli.py:545}} INFO - Running <TaskInstance: example_http_operator.post_op 2019-12- 
30T08:57:00.674386+00:00 [running]> on host 855dbc2ce3a3
[2019-12-30 09:09:07,480] {{http_operator.py:87}} INFO - Calling HTTP method
[2019-12-30 09:09:07,483] {{logging_mixin.py:112}} INFO - [2019-12-30 09:09:07,483] 
{{base_hook.py:84}} INFO - Using connection to: id: http_default. Host: https://www.google.com/, 
Port: None, Schema: None, Login: None, Password: None, extra: {}
[2019-12-30 09:09:07,484] {{logging_mixin.py:112}} INFO - [2019-12-30 09:09:07,484] 
{{http_hook.py:131}} INFO - Sending 'POST' to url: 
https://www.google.com/http://localhost:8084/api/employees
[2019-12-30 09:09:07,501] {{logging_mixin.py:112}} INFO - [2019-12-30 09:09:07,501] 
{{http_hook.py:181}} WARNING - HTTPSConnectionPool(host='www.google.com', port=443): Max retries 
exceeded with url: /http://localhost:8084/api/employees (Caused by SSLError(SSLError("bad handshake: 
SysCallError(-1, 'Unexpected EOF')"))) Tenacity will retry to execute the operation
[2019-12-30 09:09:07,501] {{taskinstance.py:1058}} ERROR - 
HTTPSConnectionPool(host='www.google.com', port=443): Max retries exceeded with url: 
/http://localhost:8084/api/employees (Caused by SSLError(SSLError("bad handshake: SysCallError(-1, 
'Unexpected EOF')")))
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py", line 485, in wrap_socket
cnx.do_handshake()
File "/usr/local/lib/python3.7/site-packages/OpenSSL/SSL.py", line 1934, in do_handshake
self._raise_ssl_error(self._ssl, result)
File "/usr/local/lib/python3.7/site-packages/OpenSSL/SSL.py", line 1664, in _raise_ssl_error
raise SysCallError(-1, "Unexpected EOF")
OpenSSL.SSL.SysCallError: (-1, 'Unexpected EOF')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 672, in urlopen
chunked=chunked,
File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 376, in _make_request
self._validate_conn(conn)
File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 994, in _validate_conn
conn.connect()
File "/usr/local/lib/python3.7/site-packages/urllib3/connection.py", line 394, in connect
ssl_context=context,
File "/usr/local/lib/python3.7/site-packages/urllib3/util/ssl_.py", line 370, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/local/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py", line 491, in wrap_socket
raise ssl.SSLError("bad handshake: %r" % e)
ssl.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
[2019-12-30 09:09:06330]{{taskinstance.py:862}}INFO-在2019-12-30T08:57:00.674386+00:00执行
[2019-12-30 09:09:06331]{{base_task_runner.py:133}信息-运行:['aiffair','run',',
“示例_http_operator”、“post_op”、“2019-12-30T08:57:00.674386+00:00”、“作业id”、“6”、“池”,
'默认\u池','-raw','-sd',DAGS\u文件夹/ExampleHttpOperator.py','-cfg\u路径',
“/tmp/tmpf9t6kzxb”]
[2019-12-30 09:09:07446]{{base_task_runner.py:115}}信息-作业6:子任务发布操作[2019-12-30]
09:09:07445]{{{{uuu init_uu.py:51}}信息-使用执行器顺序执行器
[2019-12-30 09:09:07446]{{base_task_runner.py:115}}信息-作业6:子任务发布操作[2019-12-30]
09:09:07446]{{dagbag.py:92}}信息-从中填充dagbag
/usr/local/airflow/dags/ExampleHttpOperator.py
[2019-12-30 09:09:07473]{{base_task_runner.py:115}}信息-作业6:子任务发布操作[2019-12-30]
09:09:07472]{{cli.py:545}}信息-在主机855dbc2ce3a3上运行
[2019-12-30 09:09:07480]{{http_operator.py:87}}INFO-调用http方法
[2019-12-30 09:09:07483]{{logging_mixin.py:112}}信息-[2019-12-30 09:09:07483]
{{base\u hook.py:84}}INFO-使用到:id:http\u default的连接。主持人:https://www.google.com/, 
端口:无,架构:无,登录:无,密码:无,额外:{}
[2019-12-3009:09:07484]{{logging_mixin.py:112}}信息-[2019-12-3009:09:07484]
{{http_hook.py:131}}INFO-将“POST”发送到url:
https://www.google.com/http://localhost:8084/api/employees
[2019-12-3009:09:07501]{{logging_mixin.py:112}}信息-[2019-12-3009:09:07501]
{http_hook.py:181}警告-HTTPSConnectionPool(host='www.google.com',port=443):最大重试次数
已超出url的限制:/http://localhost:8084/api/employees (由SSLError引起(SSLError(“握手不好:
SysCallError(-1,“意外EOF”))将重试执行该操作
[2019-12-3009:09:07501]{{{taskinstance.py:1058}错误-
HTTPSConnectionPool(host='www.google.com',port=443):url超过最大重试次数:
/http://localhost:8084/api/employees (由SSLError引起(SSLError(“握手错误:SysCallError(-1,
“意外EOF”)
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.7/site packages/urllib3/contrib/pyopenssl.py”,第485行,在wrap_套接字中
cnx.do_握手()
文件“/usr/local/lib/python3.7/site packages/OpenSSL/SSL.py”,第1934行,在do_握手中
self.\u raise\u ssl\u错误(self.\u ssl,结果)
文件“/usr/local/lib/python3.7/site-packages/OpenSSL/SSL.py”,第1664行,在_-raise\u-SSL\u错误中
引发系统调用错误(-1,“意外EOF”)
OpenSSL.SSL.syscaller错误:(-1,“意外的EOF”)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.7/site packages/urllib3/connectionpool.py”,urlopen中的第672行
分块的,
文件“/usr/local/lib/python3.7/site packages/urllib3/connectionpool.py”,第376行,在请求中
自我验证连接(连接)
文件“/usr/local/lib/python3.7/site packages/urllib3/connectionpool.py”,第994行,位于“验证”连接中
连接
文件“/usr/local/lib/python3.7/site packages/urllib3/connection.py”,第394行,在connect中
ssl_context=context,
文件“/usr/local/lib/python3.7/site packages/urllib3/util/ssl_uu.py”,第370行,在ssl_wrap_套接字中
返回context.wrap\u套接字(sock,server\u hostname=server\u hostname)
文件“/usr/local/lib/python3.7/site packages/urllib3/contrib/pyopenssl.py”,第491行,在wrap_套接字中
raise ssl.SSLError(“握手错误:%r”%e)
ssl.SSLError:(“握手错误:SysCallError(-1,'意外EOF'),)
气流在Docker上运行,Docker图像为puckel/Docker Airflow。
为什么它调用主机http\u默认值。主机:

我认为您需要在Dockerfile或docker run命令中设置连接字符串的ENV变量:

ENV AIRFLOW__CORE__SQL_ALCHEMY_CONN my_conn_string
看到和

联系

与外部系统的连接信息存储在 气流元数据数据库,并在UI中进行管理(菜单->管理-> 连接)此处定义了连接id和主机名/登录名/ 附加到它的密码/架构信息。气流管道可以 只需参考集中管理的conn_id,无需进行硬操作 在任何地方对这些信息进行编码

可以定义具有相同连接id的多个连接,并且在需要时 当钩子使用来自的get_连接方法时 BaseHook,气流将随机选择一个连接,允许 结合使用时的一些基本负载平衡和容错 重试

气流还能够通过环境引用连接 来自操作系统的变量。环境变量需要 以气流连接作为前缀,视为连接。什么时候 参照气流管道中的连接,连接id应 是不带前缀的变量的名称。例如,如果 conn_id命名为POSTGRES_MASTER环境变量应为 被命名为气流控制硕士。气流假设返回的值 从环境变量中选择URI格式 (例如。postgres://user:password@本地主机:5432/master)

因此,您现在使用默认设置:

Using connection to: id: http_default. Host: https://www.google.com/

您需要同时考虑使用的<代码>运算符< /代码>和它用来连接的基础<代码>钩子< /代码>。
钩子
气流连接
获取连接信息,气流连接只是一个用于存储凭据和其他连接信息的容器。您可以在Airflow UI(使用Airflow UI->Admin->Connection)中配置连接
http_conn_id (str) – connection that has the base API url i.e https://www.google.com/
endpoint (str) – The relative part of the full url. (templated)