我们在AWS Fargate中运行了一个气流实例。它连接到一个前提下的Postgres服务器(在Windows上),并尝试从(复杂的)视图加载数据。为此,它使用了一个PostgresHook。但是,DAG中的任务在气流中失败,出现以下错误:
File "/usr/local/lib/python3.7/site-packages/airflow/hooks/dbapi_hook.py", line 120, in get_records
cur.execute(sql)
psycopg2.OperationalError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.不久前,这个错误发生在大约10-15分钟之后.现在,它发生得更快,5分钟后,甚至更快。
我查看了Postgres日志,这表明(令人困惑地)关闭连接的是客户端:
LOG: could not send data to client: An existing connection was forcibly closed by the remote host.
FATAL: connection to client lost我已经尝试了很多潜在的解决方案。
没有气流连接到服务器外部的气流,直接使用psycopg2:工作(使用复杂的视图)。
不同的表试图从云中的气流中从不同的表加载数据:工作也很快完成。因此,这种“超时”发生只是因为查询需要一段时间。
最初在本地运行气流容器----我可以重现这个问题,但我(认为)通过在postgres连接字符串:keepalives=1&keepalives_idle=60&keepalives_interval=60中添加一些额外的参数来解决这个问题。但是,我不能在云中的气流中重现这个修复,因为当我在那里添加这些参数时,错误仍然存在。
增加超时--见上文,我添加了保留,但我也试图对其他可能的超时进行推理。我在DAG参数中添加了一个超时值execution_timeout,但没有效果。我们也检查了网络超时,但是考虑到连接故障的不规则模式,这听起来并不像一个如此艰难的超时.
我在这里不知所措。有什么建议吗?
发布于 2021-02-01 07:49:52
更新:我们已经通过一个解决办法解决了这个问题。在查询复杂视图时,我们没有将连接保持为打开状态,而是将连接转换为异步连接(即从aconn = psycopg2.connect(database='test', async=1)到心理医生)。此外,我们已经将视图转换为物化视图,这样我们只能通过异步连接调用REFRESH MATERIALIZED VIEW,然后我们可以在稍后的物化视图上只调用SELECT *,这非常快。
https://stackoverflow.com/questions/65844613
复制相似问题