【问题标题】:Redshift + SQLAlchemy long query hangsRedshift + SQLAlchemy 长查询挂起
【发布时间】:2017-09-21 12:03:09
【问题描述】:

我正在做一些事情:

conn_string = "postgresql+pg8000://%s:%s@%s:%d/%s" % (db_user, db_pass, host, port, schema)
conn = sqlalchemy.engine.create_engine(conn_string,execution_options={'autocommit':True},encoding='utf-8',isolation_level="AUTOCOMMIT") 
rows = cur.execute(sql_query)

在 Redshift 集群上运行查询。最近,我一直在执行维护任务,例如在每天都会被截断和重新加载的大型表上运行 vacuum reindex

问题是,对于一个特定的表,上面的命令大约需要 7 分钟(表很大,15 列有 6000 万行),当我使用上面的方法运行它时,它永远不会完成并挂起。我可以在 AWS 的集群仪表板中看到,vacuum 命令的某些部分正在运行大约 5 分钟,然后它就停止了。没有python错误,集群上没有错误,什么都没有。

我的猜测是在命令期间连接丢失。那么,如何证明我的理论呢?还有其他人有这个问题吗?如何更改连接字符串以使其存活更长时间?

编辑:

我在这里的 cmets 之后更改了我的连接:

conn = sqlalchemy.engine.create_engine(conn_string,
                                       execution_options={'autocommit': True},
                                       encoding='utf-8',
                                       connect_args={"keepalives": 1, "keepalives_idle": 60,
                                                             "keepalives_interval": 60},  
                                                        isolation_level="AUTOCOMMIT")

它已经工作了一段时间。但是,它决定从更大的表开始相同的行为,其中vacuum reindex 实际上需要大约 45 分钟(至少这是我的估计,该命令永远不会在 Python 中完成运行)。

无论查询运行时如何,我如何才能使这项工作?

【问题讨论】:

  • 根据我的经验,这样的连接断开(如果确实是连接断开)是由于 NAT 在中间某处静默断开连接。顺便说一下,AWS NAT 网关的超时时间为 5 分钟。棘手的是,psycopg2/libpq 显然默认开启了 TCP keepalive,这应该解决问题。您可以尝试显式设置:create_engine(connect_args={"keepalives": 1, "keepalives_idle": 60, "keepalives_interval": 60});可能是默认的keepalive间隔太长了。
  • @univerio 那些保持活力的论点使这项工作在今天完全没有问题。如果明天有效,我会再次在这里发表评论,要求您将此作为实际答案。这只是让我想知道为什么如果它默认打开我仍然必须手动添加它......
  • @rodrigocf 该解决方案是否始终如一地工作?我也面临同样的问题..
  • @rdeboo 是的。自申请以来一直没有失败。
  • 我在使用气流和 Redshift 时遇到了同样的问题。 @univerio 的评论解决了它,应该是这里接受的答案

标签: python python-3.x sqlalchemy amazon-redshift


【解决方案1】:

这很可能不是连接中断问题。要确认这一点,请尝试将几百万行推入一个虚拟表(这需要 5 分钟以上)并查看语句是否失败。将查询提交给 redshift 后,无论您的连接字符串如何关闭查询都会在后台执行。

现在,回到问题本身 - 我的猜测是您的内存或磁盘空间不足,您能否更详细地列出您的 redshift 设置(dc1/ds2 的多少个节点)?另外,尝试运行一些管理查询,看看你在磁盘上还剩下多少空间。有时,当集群加载到边缘时,会引发磁盘已满错误,但在您的情况下,因为连接可能会在错误引发到您的 python shell 之前很久就断开。

【讨论】:

  • 内存或磁盘空间实际上不是问题,我有一个 4 节点 ds2.8xlarge,在命令期间 CPU 使用率没有超过 60%,磁盘空间保持稳定在 30%。
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 2015-12-20
  • 2021-02-13
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多