5

我们正在评估Amazon Redshift的实时数据仓库。如何实时加载到Amazon Redshift?

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

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

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

我很担心使用这些服务之一,因为它们都将使用Amazon S3作为中间层,并执行COPY命令,该命令适用于较大的数据集,而不适用于“单行”插入。

回答

5

它是效率不高在Amazon Redshift中使用单个INSERT声明。它被设计为一个数据仓库,提供非常快速的SQL查询。它不是一个经常更新和插入数据的事务处理数据库。

最好的做法是加载批次(或微批次)经由COPY命令。 Kinesis Firehose使用这种方法。这样更有效率,因为多个节点用于并行加载数据。

如果您认真考虑实时处理数据,那么Amazon Redshift可能不是最好的数据库。考虑使用传统的SQL数据库(例如Amazon RDS提供的数据库),NoSQL数据库(如Amazon DynamoDB)或Elasticsearch。如果您的重点是报告大量数据(通常涉及多个表连接),则只应选择使用Redshift。

正如Amazon Redshift Best Practices for Loading Data提到:

如果COPY命令是不是一种选择,你需要SQL插入,使用多行插入只要有可能。当您一次只添加一行或几行数据时,数据压缩效率低下。

+0

我们在几个维度表(100k-600k行)中拥有大约1TB的数据表,而AWS Redshft看起来像是合适的解决方案。但是,实时加载是必须的。 – fenix

+0

另一个选择是[Amazon Athena](http://docs.aws.amazon.com/athena/latest/ug/what-is.html)(目前处于有限展示中),它使用Presto扫描存储在Amazon中的数据S3。您只需将数据存储在S3中,然后在其上运行雅典娜查询。如果可以压缩和分区数据,或以ORC/Parquet格式存储数据,则效果最佳。仅适用于查询,不适用于更新 - 您可以通过直接将其存储在S3中来更新数据。 –

3

最好的选择是Kinesis Firehose,它正在处理多批事件。您将这些事件逐个写入Firehose,并根据您的定义以最佳方式对其进行批处理。您可以定义分批事件的分钟数或批处理的大小(以MB为单位)。 您可能可以使用INSERT更快地将事件插入Redshift,但此方法不可伸缩。 COPY设计几乎可以在任何规模上使用。

+0

谢谢,但它不会是实时的,它会滞后到60秒(最小缓冲区),我说得对吗? – fenix

+1

@fenix是正确的。 Redshift不是实时数据加载的最佳分贝。 – dizzyf

相关问题