2017-08-02 67 views
1

我正在尝试调用dynamodb写入操作来写入60k条记录。改进DynamoDB写入操作

我试图将1000个写入容量单位用于预置写入容量。但是我的写作操作仍然花费很多时间。另外,当我检查指标时,我仍然可以看到消耗的写入容量单位为每秒10个左右。

我的记录大小肯定小于1KB。

有没有一种方法可以加速dynamodb的写入操作?

+1

你是单线程写操作吗?您可以通过发送并行请求来提高性能。另外,请确保请求正在跨不同的分区键更新数据,以便它们将负载分散到多个分区。 –

+0

如果我没有错,在dynamodb的情况下,并行写入与batchWrite操作相同。 –

+0

您是否收到任何'ProvisionedThroughputExceededException'错误?如果没有,你没有发送足够的请求。并行发送多个batchWrite请求以获得吞吐量的全部好处。异步可能也适用。 –

回答

1

与大多数数据库一样,DynamoDB的性能高度依赖于它的使用方式。

从您的问题来看,您可能只使用一个DynamoDB分区。每个分区容量为can support up to 1000 write,最高可达10GB的数据。

但是,您还提到您的指标每秒只显示10个写单位。这是非常低的。检查AWS控制台中表格可见的所有指标。这是DynamoDB页面下的每个表的选项卡。检查节流和任何错误。检查消耗的容量是否低于图表上的预置容量。

您的过程中可能存在其他一些瓶颈。

+0

我已经在表格的唯一主键上创建了分区。我使用单个记录而不是batchWrite。使用batchWrite会改变我的统计数据吗? –

+0

如果客户端和DynamoDB之间存在高延迟,batchWrite会有所帮助。试一试,并为其他人评论结果。 –

1

看起来您可以每秒发送更多请求。您可以执行更多的要求,但如果你在一个循环中发送的请求是这样的:

for item in items: 
    table.putItem(item) 

你需要介意每个请求的往返延迟。

您可以使用两个技巧:

  • 从多个线程/机器首先,上传数据。

  • 其次,你可以使用BatchWriteItem方法,让你写多达25个项在一个请求:

的BatchWriteItem操作提出或删除一个或 多个表的多个项目。对BatchWriteItem的单个调用可以写入多达16 MB的 数据,其中可以包含多达25个放置或删除请求。 要写入的单个项目可能大至400 KB。

1

所以这里是我的想法。

我改变了我的电话以使用batchWrite,而且我的消耗写容量单位已经显着增加,达到286个写容量单位。 此外,完整的写入操作在几分钟内完成。 正如所有上述答案中所提到的,使用putItem加载大量数据存在延迟问题,并且会影响您的消耗容量。 batchWrite总是更好。