排查 AWS Redshift 上的 COPY 错误



更新:如果想通了,但我仍然对解释感兴趣。问题是我在运行下面的代码的同时,也从 SqlWorkbenchJ 连接到我的 Redshift 集群(两者都在同一台笔记本电脑上运行(。当我断开我的 SqlWorkbenchJ 会话并重新运行我的代码时,它不会挂起。为什么?


请注意:虽然我在这个问题中提到了Java/JDBC,但严格来说,这是一个关于Redshift故障排除的问题,并且与语言/框架无关!!


此外,这是一个SSCCE存储库,可以完美地重现挂起问题: https://github.com/bitbythecron/redshift-copy-troubleshooting

我正在尝试从Java代码运行以下Redshift COPY命令(使用Postgres JDBC驱动程序(:

COPY my_schema.mytable
FROM 's3://com.example.mybucket/mydata.csv/part-00000-bc1b179d-b4c1-459f-8f5e-8fe361d4b40f-c000.csv'
iam_role 'arn:aws:iam::blah:role/MyRedshiftRole'
csv;

如果我没看错文档,这应该:

  1. 读取存储在 S3 上的 CSV 文件
  2. 将其内容复制到红移表中 (my_schema.mytable(

当我在我的Redshift UI客户端(SqlWorkbenchJ(中运行此命令时,它会正确执行并在几秒钟内运行。但是,当我执行以下 JDBC 代码(使用完全相同的连接 URL、凭据等(时,代码只是在executeUpdate命令处挂起:

Connection conn = null;
Statement statement = null;
try {
Class.forName("org.postgresql.Driver");
Properties props = new Properties();
props.setProperty("user", redshiftInfo.username);
props.setProperty("password", redshiftInfo.password);
log.info("nnAttempting to connect!nn");
conn = DriverManager.getConnection("jdbc:postgresql://<sameExactUrl_thatIUser_inSqlWorkbenchJ>", props);
log.info("nnConnection made!nn");
statement = conn.createStatement();
String command = "COPY my_schema.my_table FROM 's3://com.example.mybucket/mydata.csv/part-00000-bc1b179d-b4c1-459f-8f5e-8fe361d4b40f-c000.csv' iam_role 'arn:aws:iam::blah:role/MyRedshiftRole' csv";
log.info("nnExecuting...nn");
statement.executeUpdate(command);
log.info("nnHey I think it worked!!!nn");
statement.close();
conn.close();
} catch (Exception ex) {
log.info(ExceptionUtils.getStackTrace(ex));
}

当它运行时,在日志中我得到了Executing...日志语句,但随后软件只是挂起。我已经等了30分钟,看看它是否由于某种原因很慢。我还在这 30 分钟内(和之后(刷新了我的 SqlWorkbenchJ 连接并运行了SELECT COUNT(*) FROM my_schema.my_table计数始终为 0。所以它建立了连接,但实际上没有任何东西被复制,或者如果是,它没有被提交。

我想看看 Redshift 方面发生了什么:是否有任何表或日志(在 AWS 控制台或其他情况下(我可以跟踪或检查记录是否实际被复制并暂存到某个地方,或者查看是否有任何错误从 Redshift 的角度报告

你的 Java 代码没有问题。如果记录数较少,它工作得很好。

create table my_table (
c_name            varchar(25)    not null,
c_address         varchar(25)    not null,
c_city            varchar(25)    not null);

创建一个包含 data# 的 CSV,并将其放入 S3 中,只有 2-3 条记录,

one,two,three
example1,example2,example3

然后,运行您的代码,它将遵循输出。

Attempting to connect!
Connection made!
Executing...
Hey I think it worked!!!

现在,做

Select * from my_table;
c_name  | c_address |  c_city
----------+-----------+----------
one      | two       | three
example1 | example2  | example3

回到你的问题,为什么你在Select * from my_table;中看到0条记录

事实:Amazon Redshift 完全是 ACID 投诉,这意味着在您的复制命令完成并提交之前,您将不会在 SELECT 中看到任何记录。

解决方案:您想看看,您的查询发生了什么,是被执行还是终止?

您可以运行以下命令来查看所有当前正在运行的查询。

select pid, user_name, starttime, query from stv_recents where status='Running';
//OR
select query, pid, elapsed, substring from svl_qlog where userid = 100 order by starttime desc limit 5;

有关更多详细信息,请参阅 AWS Redshift 系统查询文档。

问题是我在运行下面的代码的同时,也从 SqlWorkbenchJ 连接到我的 Redshift 集群(两者都在同一台笔记本电脑上运行(。当我断开我的 SqlWorkbenchJ 会话并重新运行我的代码时,它不会挂起。

最新更新