Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使copy命令在启动它的lambda函数超时后仍以红移方式继续运行?_Python_Postgresql_Amazon Web Services_Aws Lambda_Amazon Redshift - Fatal编程技术网

Python 如何使copy命令在启动它的lambda函数超时后仍以红移方式继续运行?

Python 如何使copy命令在启动它的lambda函数超时后仍以红移方式继续运行?,python,postgresql,amazon-web-services,aws-lambda,amazon-redshift,Python,Postgresql,Amazon Web Services,Aws Lambda,Amazon Redshift,我试图运行一个copy命令,将大约100GB的数据从S3加载到redshift。我每天都在使用lambda函数来启动这个复制命令。这是我当前的代码 from datetime import datetime, timedelta import dateutil.tz import psycopg2 from config import * def lambda_handler(event, context): con = psycopg2.connect(dbname=dbname,

我试图运行一个copy命令,将大约100GB的数据从S3加载到redshift。我每天都在使用lambda函数来启动这个复制命令。这是我当前的代码

from datetime import datetime, timedelta
import dateutil.tz
import psycopg2
from config import *

def lambda_handler(event, context):
    con = psycopg2.connect(dbname=dbname, user=user, password=password, host=host, port=port)
    cur = con.cursor()
    
    try:
        query = """BEGIN TRANSACTION;

                COPY """ + table_name + """ FROM '""" + intermediate_path + """' iam_role '""" + iam_role + """' FORMAT AS parquet;

                END TRANSACTION;"""

        print(query)
        cur.execute(query)
    
    except Exception as e:
        subject = "Error emr copy: {}".format(str(datetime.now().date()))
        body = "Exception occured " + str(e)
        print(body)
    
    con.close()
此函数运行正常,但唯一的问题是,lambda函数超时15分钟后,复制命令也会在reshift中停止执行。因此,我无法完成从s3到红移的副本加载

我还尝试在begin语句之后和copy命令之前包含下面的语句\u timeout语句。这没用

SET statement_timeout to 18000000;
有人能建议我如何解决这个问题吗?

没有明确说明超时发生时会发生什么。但我认为可以肯定地说,它会过渡到“关闭”阶段,此时运行时容器会被环境强制终止

这意味着数据库连接所使用的套接字连接将被关闭,而侦听该套接字的红移进程将收到一个文件结尾——客户端断开连接。在这种情况下,任何数据库的正常行为都是终止任何未完成的查询并回滚其事务

我给出该描述的原因是让您知道,您不能将查询的生存期延长到启动该查询的Lambda的生存期之外。如果您想继续使用数据库连接库,则需要使用不超时的服务:AWS批处理或ECS是两个选项

但是,有一个更好的选择:那就是


此API异步运行:您向Redshift提交一个查询,并获取一个可用于检查查询操作的令牌。当查询完成/失败时,您还可以指示Redshift向AWS Eventbridge发送消息(以便您可以创建另一个Lambda以采取适当的操作)。

好的解决方案在很大程度上取决于您从S3加载的数据。是否有多个文件,文件的结构如何(每个表行一行?!?)等等。请您添加更多详细信息。