在事务中更新到 Redshift

Posted

技术标签:

【中文标题】在事务中更新到 Redshift【英文标题】:Upsert to Redshift within transaction 【发布时间】:2018-01-14 21:47:40 【问题描述】:

我对整个 Lambda、AWS、步进函数和 Redshift 非常陌生。但我想我已经指出了一个让我去调查的问题。

step 函数调用 lambda 节点 js 代码来执行从 S3 到 Redshift 的复制。

相关步骤定义如下所示

"States": 
...
            "CopyFiles": 
                "Type": "Task",
                "Resource": "ARN:activity:CopyFiles",
                "ResultPath": "...",
                "Retry": [
                    
                        "ErrorEquals": ["Error"],
                        "MaxAttempts": 0
                    ,
                    
                        "ErrorEquals": [
                            "States.ALL"
                        ],
                        "IntervalSeconds": 60,
                        "BackoffRate": 2.0,
                        "MaxAttempts": 3
                    
                ],
                "Catch": [
                    
                        "ErrorEquals": [
                            "States.ALL"
                        ],
                        "ResultPath": "$.errorPath",
                        "Next": "ErrorStateHandler"
                    
                ],
                "Next": "SuccessStep"
            ,
            "SuccessStep": 
                "Type": "Task",
                "Resource": "ARN....",
                "ResultPath": null,
                "Retry": [
                    
                        "ErrorEquals": ["Error"],
                        "MaxAttempts": 0
                    ,
                    
                        "ErrorEquals": [
                            "States.ALL"
                        ],
                        "IntervalSeconds": 60,
                        "BackoffRate": 2.0,
                        "MaxAttempts": 3
                    
                ],
                "End": true
            ,

SQL 语句(在 CopyFiles 活动中使用)由

包装在事务中
"BEGIN;
CREATE TABLE "tempTable_datetimestamp_here" (LIKE real_table);
COPY tempTable_datetimestamp_here from 's3://bucket/key...' IGNOREHEADER 1 COMPUPDATE OFF STATUPDATE OFF';
DELETE FROM toTable
    USING tempTable_datetimestamp_here
    WHERE toTable.index = tempTable_datetimestamp_here.index;
INSERT INTO toTable SELECT * FROM tempTable_datetimestamp_here;

END;

当我同时通过多个文件(50)时,所有的步骤功能都挂起(一直运行直到我中止),请看截图。如果我输入一个文件,那么它工作正常。

select pid, trim(starttime) as start,
duration, trim(user_name) as user,
query as querytxt
from stv_recents
where status = 'Running';

不再返回任何内容。但是,阶跃函数仍显示为“正在运行”。

任何人请告诉我我需要做什么才能让它工作? 谢谢 蒂姆

【问题讨论】:

你能在你的问题中包含你的步骤函数吗? 【参考方案1】:

这种方法(50 个并发小提交)可以在 OLTP(小型精确查询)数据库(例如 Postgres、mysql)上正常工作。

但概述的过程会创建多个竞争提交,这些提交在 Redshift 中相互阻塞或成为瓶颈。

Redshift 专为 OLAP(大型分析查询)而设计,Redshift 中的提交相对昂贵,因为它们必须得到所有计算节点的确认才能返回。

我建议一个两阶段的过程:

    使用 Lambda 创建清单(JSON 文件),列出当前可供加载的文件(例如 50 个文件)。 将 COPY 与清单一起使用以并行加载所有可用文件并处理事务一次

https://docs.aws.amazon.com/redshift/latest/dg/loading-data-files-using-manifest.html

【讨论】:

以上是关于在事务中更新到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

使用 Zend 框架 2 将数据插入和更新到两个表(事务)中

MySQL可重复读采坑记录-对事务B进行更新时,事务A提交的更新会不会影响到事务B

使用事务的 DAO 记录集批量更新(excel)

OLEDB事务

JDBC应用中的事务管理

SQL 从事务日志中恢复数据