我目前正在使用 Airflow 1.8.2 来安排一些 EMR 任务,然后在我们的 Redshift 集群上执行一些长时间运行的查询。为此,我使用 postgres_operator。查询运行大约需要 30 分钟。然而,一旦完成,连接就永远不会关闭,并且运算符(operator)会运行一个半小时以上,直到每次在 2 小时标记处终止。终止时的消息是服务器意外关闭了连接。
我检查了 Redshift 端的日志,它显示查询已运行且连接已关闭。不知何故,这永远不会传达回 Airflow。任何我可以检查的内容的指示都会有帮助。为了提供更多信息,我的 Airflow 安装是 https://github.com/puckel/docker-airflow 的扩展docker 镜像在 ECS 集群中运行,并以 SQLite 作为后端,因为我仍在测试 Airflow。另外,我在后端使用顺序执行器
。我将不胜感激在此事上的任何帮助。
最佳答案
我们之前也遇到过类似的问题,但我正在使用 SQLAlchemy 来 Redshift,如果您使用 postgres_operator,它应该非常相似。如果 Redshift 没有看到长时间运行的查询的任何事件,它似乎会关闭连接,在您的情况下,30 分钟是相当长的查询。
检查https://www.postgresql.org/docs/9.5/static/runtime-config-connection.html
您有三个设置:tcp_keepalives_idle
、tcp_keepalives_idle
、tcp_keepalives_count
,它们向 redshift 发送实时消息以指示“嘿,我还活着。< br/>
您可以传递以下内容作为参数,如下所示: connect_args={'keepalives': 1, 'keepalives_idle':60, 'keepalives_interval': 60}
关于postgresql - Airflow dag 中 postgres_operator 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396876/