我们有一个在 AWS Fargate 中运行的 Airflow 实例。它连接到本地 Postgres 服务器(在 Windows 上)并尝试从(复杂的)视图加载数据。它为此使用了 PostgresHook
。但是,DAG 中的任务在 Airflow 中失败并出现此错误:
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
我已经尝试了很多潜在的解决方案。
无气流
在 Airflow 之外连接到服务器,直接使用 psycopg2
:有效(使用复杂视图)。
不同的表 尝试从云中的 Airflow 加载不同表中的数据:有效,完成也很快。所以这个“超时”只是因为查询需要一段时间。
在本地运行 Airflow 容器
起初我可以重现这个问题,但我(认为我)通过在 postgres 连接字符串中添加一些额外的参数来解决它:keepalives=1&keepalives_idle=60&keepalives_interval=60
。但是,我无法在云中的 Airflow 中重现此修复程序,因为当我在那里添加这些参数时,错误仍然存在。
增加超时时间
见上文,我添加了 keepalive,但我也试图推断其他潜在的超时。我在 DAG 参数中添加了超时 execution_timeout
,但无济于事。我们还检查了网络超时,但考虑到连接失败的不规则模式,这听起来不像是一个硬超时......
我在这里不知所措。有什么建议吗?
答案 0 :(得分:0)
更新:我们已经通过一种变通方法解决了这个问题。我们没有在查询复杂视图时保持连接打开,而是将连接转换为异步连接(即 psycopg docs 中的 aconn = psycopg2.connect(database='test', async=1)
)。而且,我们把视图变成了物化视图,这样我们只通过异步连接调用一个REFRESH MATERIALIZED VIEW
,然后我们可以稍后在物化视图上SELECT *
,这非常快.