rod*_*ocf 5 python sqlalchemy python-3.x amazon-redshift
我正在做一些事情:
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)
Run Code Online (Sandbox Code Playgroud)
在 Redshift 集群上运行查询。最近,我一直在执行维护任务,例如vacuum reindex在每天被截断和重新加载的大表上运行。
问题是,上面的命令对于一个特定的表(该表很大,15 列有 6000 万行)需要大约 7 分钟,当我使用上面的方法运行它时,它永远不会完成并挂起。我可以在 AWS 的集群仪表板中看到,vacuum 命令的一部分正在运行大约 5 分钟,然后它就停止了。没有python错误,集群上没有错误,什么都没有。
我的猜测是在命令期间连接丢失。那么,如何证明我的理论呢?还有其他人有这个问题吗?我如何更改连接字符串以使其保持更长时间?
编辑:
我在这里发表评论后改变了我的连接:
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")
Run Code Online (Sandbox Code Playgroud)
它已经工作了一段时间。但是,它决定对更大的表开始使用相同的行为,其中vacuum reindex实际上需要大约 45 分钟(至少这是我的估计,该命令从未在 Python 中完成运行)。
无论查询运行时如何,我怎样才能使这项工作正常进行?
这很可能不是连接断开问题。要确认这一点,请尝试将几百万行推入虚拟表(这需要超过 5 分钟)并查看语句是否失败。将查询提交到 redshift 后,无论您的连接字符串如何关闭查询,查询都会在后台执行。
现在,回到问题本身 - 我的猜测是您的内存或磁盘空间不足,您能否更详细地说明并列出您的 redshift 设置(dc1/ds2 有多少个节点)?另外,尝试运行一些管理查询并查看磁盘上还剩多少空间。有时,当集群加载到边缘时,会抛出磁盘已满错误,但在您的情况下,因为连接可能会在错误被抛出到 python shell 之前就被断开。
| 归档时间: |
|
| 查看次数: |
1579 次 |
| 最近记录: |