Spring Batch 可以与 Amazon Redshift 一起使用吗?

Posted

技术标签:

【中文标题】Spring Batch 可以与 Amazon Redshift 一起使用吗?【英文标题】:Can Spring Batch work with Amazon Redshift? 【发布时间】:2018-12-19 19:21:49 【问题描述】:

我正在尝试使用 Spring Batch (4.0.1.RELEASE) 与 Amazon Redshift 配合使用。我解决了 Redshift 不支持序列here 的第一个主要问题。

但是,现在我在尝试运行作业时遇到了这个问题:

10:57:07.122 ERROR [http-nio-8080-exec-4 ] [JobLaunchingService] [] Could not start job [demoJob]
org.springframework.dao.InvalidDataAccessApiUsageException: PreparedStatementCallback; SQL [INSERT INTO BATCH_JOB_EXECUTION_CONTEXT (SHORT_CONTEXT, SERIALIZED_CONTEXT, JOB_EXECUTION_ID) VALUES(?, ?, ?)[Amazon][JDBC](10220) Driver does not support this optional feature.; nested exception is java.sql.SQLFeatureNotSupportedException: [Amazon][JDBC](10220) Driver does not support this optional feature.

这是使用 Redshift 1.2.16.1027 JDBC 驱动程序。

甚至可以使用 Redshift 作为批处理数据库吗?有关如何解决此问题的任何建议?

【问题讨论】:

什么是批处理数据库?反正我猜不是,redshift postgres。有很多与 redshift 兼容的 ETL 平台,为什么不使用其中之一呢。 “batch”数据库是 Spring Batch 存储其控制表的地方。我正在使用它,因为我已经有十几个用 Spring Batch 编写的作业,我只想从 mysql 目标数据库更改为 Redshift。 【参考方案1】:

我不确定您的用例是否受到限制或约束,您只需要 Spring 批处理。另外,jdbc 驱动程序说它不支持批处理。,那么我相信没有办法让它工作。 作为推荐的方法和最佳实践,在Redshift 中而不是insert statement 中,应使用COPY 命令。不过,您可以使用普通的JDBC 调用copy 命令可能是个好主意。

你可以看看我之前提供的answer。 我只是复制/粘贴它以方便使用。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Properties;

public class RedShiftJDBC 
public static void main(String[] args) 

Connection conn = null;
Statement statement = null;
try 
//Make sure to choose appropriate Redshift Jdbc driver and its jar in classpath
Class.forName("com.amazon.redshift.jdbc42.Driver");
Properties props = new Properties();
props.setProperty("user", "username***");
props.setProperty("password", "password****");

System.out.println("\n\nconnecting to database...\n\n");
//In case you are using postgreSQL jdbc driver.

conn = DriverManager.getConnection("jdbc:redshift://********url-to-redshift.redshift.amazonaws.com:5439/example-database", props);

System.out.println("\n\nConnection made!\n\n");

statement = conn.createStatement();

String command = "COPY my_table from 's3://path/to/csv/example.csv' CREDENTIALS 'aws_access_key_id=******;aws_secret_access_key=********' CSV DELIMITER ',' ignoreheader 1";

System.out.println("\n\nExecuting...\n\n");

statement.executeUpdate(command);
//you must need to commit, if you realy want to have data copied.
conn.commit();
System.out.println("\n\nThats all copy using simple JDBC.\n\n");
statement.close();
conn.close();
  catch (Exception ex)     ex.printStackTrace();      

我希望这能给你一些想法。如果您有具体问题添加评论,我应该能够重新调整答案。

【讨论】:

【参考方案2】:

为了完成这项工作,我必须为 Spring Batch“控制”表定义一个单独的 MySQL 数据库。那是 Batch 应用程序中的默认 (@Primary) 数据库。 ItemWriters 接收到不同的 DataSource,即指向 Redshift 的那个。

所以现在我有一个DataSource 用于批处理表,一个用于我的源数据库,一个用于目标数据库。这似乎可行,但我只使用标准DataSourceTransactionManager,所以我根本不清楚事务边界是什么,如果一个步骤失败,数据库是否以相同的方式回滚。但我不会用 XA !!

【讨论】:

如果您正在生成和提交插入 - 您可能会发现性能问题。您可能需要考虑将数据暂存到 s3,然后在 redshift 上发出复制命令。【参考方案3】:

Amazon Redshift 不是 Spring Batch 支持的数据库。此处列出了支持的数据库:https://github.com/spring-projects/spring-batch/tree/master/spring-batch-core/src/main/resources/org/springframework/batch/core。

【讨论】:

以上是关于Spring Batch 可以与 Amazon Redshift 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Batch Job 不会终止

FlatFileParseException 解析错误 - Spring Batch

Spring Batch MongoDB 依赖问题

Spring Batch Kafka Kafka 到数据库作业

Spring Batch 与 Spring Cloud Task Quartz 等概念辨析

如何使用 Amazon Polly 阅读 PDF 文件?