【发布时间】:2015-07-27 16:56:44
【问题描述】:
我正在我的 Redshift 集群上并行运行多个批处理 ETL 操作。
我的管道执行以下操作:
在临时临时表上做一堆东西。最后,通过执行以下操作将插入到最终表(永久和跨进程共享)中:
BEGIN;
LOCK table X;
DELETE FROM X USING stage_table...
INSERT INTO X ...
END;
不过,当我有多个并行进程时,有些会失败:
错误:1023 详细信息:表上的可序列化隔离违规 - 142443,事务 > 形成循环是:388224、388226 (pid:32012)
(其中 142443 是我的表 X)
当我逐个运行该过程时,一切都像魅力一样。我已经在其他进程上成功使用了锁(并验证了它是否按预期工作)所以我在这里感到困惑。任何帮助表示赞赏!
【问题讨论】:
-
为什么使用 INSERT 而不是 COPY?将 ETL 重新设计为更多 ELT 并使用 COPY 和内部 Redshift 查询可能会更好,从而获得比传统的旧 ETL 流程更快的摄取速度。
-
我的 ETL 分类实际上有点误导。这些是基于 Redshift 中已有数据的派生计算。在那里使用 COPY 似乎仍然有意义吗?
-
嘿,运气好吗?我只是在执行相同的步骤并得到相同的错误..
-
不,仍然有同样的问题。我进行了很多更改,使其频率降低了很多,但仍然没有运气。
-
实际上,如果这有帮助,我已经意识到大多数时候,读取时会引发错误。例如如果您对可能在 SELECT 发生时更新的表执行 SELECT,则应在执行 SELECT 之前尝试锁定该表。
标签: amazon-redshift etl