使用雪花 JDBC 驱动程序自定义接收器到雪花非常慢

Posted

技术标签:

【中文标题】使用雪花 JDBC 驱动程序自定义接收器到雪花非常慢【英文标题】:Custom Sink to Snowflake using Snowflake JDBC driver is very slow 【发布时间】:2020-10-23 14:32:01 【问题描述】:

我正在使用 Spring Cloud Data Flow 创建自定义流以将数据加载到雪花中。我编写了一个自定义接收器,使用 Snowflake 的 JDBC 驱动程序将数据加载到 Snowflake 中。我使用的方法类似于使用以下步骤的任何数据库更新:

    创建连接池(使用 HikariCP)获取 Snowflake 数据库连接。 使用准备好的语句,创建了一批行来一次性提交。 使用计划的计时器将批处理提交给雪花。 这时我注意到批次在 Snowflake 中的更新非常缓慢 - 即一次只有一两条记录,而一批 8K 行在 Snowflake 表中的更新时间远远超过 45 分钟(使用 XS 仓库)。

我的问题:是否有更好/另一种/推荐的方法将数据流式传输到 Snowflake?我知道 Kafka 连接到 Snowflake 和 Snowpipes(它们使用内部/外部阶段),但这些不是我们想要追求的选项。

PreparedStatement preparedStatement = null;
Connection conn = null;
String compiledQuery = "INSERT INTO " + env.getProperty("snowtable") + " SELECT parse_json (column1) FROM VALUES (?)";
conn = DataSource.getConnection();
preparedStatement = conn.prepareStatement(compiledQuery);
for(int i = 0; i<messageslocal.size(); i++) 
    preparedStatement.setString(1, messageslocal.get(i));
    preparedStatement.addBatch();

preparedStatement.executeBatch();

谢谢!

【问题讨论】:

【参考方案1】:

一般来说,Snowflake - 与许多列存储或混合存储 DB 一样 - 在插入单行或少量行时表现不佳。因此,您遇到的糟糕性能对我来说并不奇怪,尤其是在 XS WH 上。

在不知道您的任务上下文的情况下,我建议写入 JSON、PARQUET 或 CSV 文件(如果您在 AWS 中,则存储在 S3 上)而不是通过 JDBC 直接写入 Snowflake。您可以通过 Snowflake 中的 Stage 使该 JSON/PARQUET/CSV 文件可用。

然后,您可以编写一个将舞台数据复制到表格的流程,或者在舞台顶部放置一个物化视图。物化视图或多或少相当于触发将 JSON/PARQUET/CSV 数据提取到雪花表中,但这将异步操作而不会影响您的应用程序性能。

【讨论】:

以上是关于使用雪花 JDBC 驱动程序自定义接收器到雪花非常慢的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 将数据插入雪花

雪花 jdbc 参数为所有数据类型返回 VARCHAR

Snowflake JDBC 驱动元数据提取自定义属性

通过 JDBC 与 COPY_INTO + GET 批量卸载雪花数据

JDBC 或复制 INTO

改进 ODBC 和 JDBC API 中的雪花元数据调用