如何实时加载到 Amazon Redshift?

How to do Real-time loading into Amazon Redshift?

我们正在评估用于实时数据仓库的 Amazon Redshift。

数据将通过 Java 服务进行流式传输和处理,并且应存储在数据库中。我们逐行(实时)处理,每个事务只插入一行。

将实时数据加载到 Amazon Redshift 的最佳实践是什么?

我们应该使用 JDBC 并执行 INSERT INTO 语句,还是尝试使用 Kinesis Firehose 或 AWS Lambda?

我担心使用其中一种服务,因为两者都将使用 Amazon S3 作为中间层并执行适用于更大数据集的 COPY 命令,不适用于 "one-row" 插入.

最好的选择是 Kinesis Firehose,它正在处理批量事件。您正在将事件一个接一个地写入 Firehose,它会根据您的定义以最佳方式对其进行批处理。您可以定义对事件进行批处理的分钟数,或以 MB 为单位的批处理大小。 您或许可以使用 INSERT 将事件更快地插入到 Redshift 中,但此方法不可扩展。 COPY 设计用于几乎所有规模。

在 Amazon Redshift 中使用单独的 INSERT 语句效率不高。它被设计为 数据仓库 ,提供非常快速的 SQL 查询。它不是经常更新和插入数据的 transaction-processing 数据库。

最佳做法是通过 COPY 命令加载 batches(或 micro-batches)。 Kinesis Firehose 使用这种方法。这样效率更高,因为使用多个节点并行加载数据。

如果您认真考虑在 real-time 中处理数据,那么 Amazon Redshift 可能不是最适合使用的数据库。考虑使用传统的 SQL 数据库(例如 Amazon RDS 提供的数据库)、NoSQL 数据库(例如 Amazon DynamoDB)甚至 Elasticsearch。如果您的重点是报告大量数据,通常涉及许多 table 连接,则您应该只选择使用 Redshift。

Amazon Redshift Best Practices for Loading Data所述:

If a COPY command is not an option and you require SQL inserts, use a multi-row insert whenever possible. Data compression is inefficient when you add data only one row or a few rows at a time.