我有一个 AWS Glue 作业,该作业将标准分析库集与 Python Shell 结合使用。特别值得注意的是,它使用
SQLAlchemy
连接到我们的 Microsoft SQL Server。为此,我们还特意导入了 pymssql
2.3.1。在此 Glue 作业中,我们按顺序运行同一存储过程的多个副本六次。 看似随机,从 SQL Server 的角度来看,第六个(也是最后一个)存储过程将运行完成,但在其 pandas.read_sql
调用中失败。据我所知,错误消息来自 FreeTDS,是
操作错误(“pymssql.exceptions.OperationalError)(20047,b'DB-lib错误消息20047,严重性9: DBPROCESS 已死亡或未启用 ')
它的类型是
sqlalchemy.exc.OperationalError
。
我们的 SQL 框上的数据每天只更改一次,但奇怪的是:当我收到此错误时,我在当天剩下的时间里都会收到它。我重新运行 Glue 作业多少次并不重要。
我该如何调试这个?
抱歉这么长,但我已经尝试了很多:
sp_WhoIsActive
和 SQL Server 错误日志都没有显示任何有趣的内容。他们知道 Python 何时关闭连接,但这很正常。更改
pymssql
版本没有任何作用。我已经在 2.3.0 和 2.3.1 上尝试了以下所有内容。stream_results
添加到我的连接选项中没有任何效果,无论是 True
还是 False
。该文档不清楚 Microsoft SQL Server 是否支持它。echo="debug", echo_pool="debug"
添加到我的引擎选项中。他们添加的额外日志记录没有任何价值。我什至懒得在这里分享。它完美地运行,直到我们得到与我上面提到的相同的错误。pool_pre_ping = True
是迄今为止最建议的解决方案。它并不能解决问题。我可以在上面讨论的附加日志中看到预 ping,但作业仍然以同样的方式失败。
禁用连接池 (poolclass=NullPool
pool_reset_on_return
也没有解决问题。鉴于上述情况,我认为池化问题已被排除。但我确实发现有趣的是,默认池数是 5,而我在查询 6 上失败了。pyobdc
您被安全措施(很可能是防火墙)阻止,这就是为什么当您收到此错误时,您将在当天剩余的时间内收到该错误,然后 24 小时后,当您(或您的计算即时)获得新的 IP 地址时您将能够再次重新运行它。 检查为什么您的胶水工作可能看起来像安全威胁,然后从那里开始工作。
更新:
docs.aws.amazon.com/glue/latest/dg/security.html,您可以从 docs.aws.amazon.com/glue/latest/dg/infrastruct-security.html 对其进行一些控制
另请查看此链接:Assigning static IP to AWS Glue jobs dev.to/chuac/assigning-static-ip-to-aws-glue-jobs-300d
祝你好运,希望你能指出问题