2013-03-26 35 views
1

我将大量数据编入DynamoDB并尝试批量写入以增加实际吞吐量(即使索引更快)。这里是(this是原始源)的代码块:boto dynamodb:有没有优化批量书写的方法?

def do_batch_write(items,conn,table): 
    batch_list = conn.new_batch_write_list() 
    batch_list.add_batch(table, puts=items) 
    while True: 
      response = conn.batch_write_item(batch_list) 
      unprocessed = response.get('UnprocessedItems', None) 
      if not unprocessed: 
        break 
      # identify unprocessed items and retry batch writing 

我使用博托2.8.0版。如果items有超过25个元素,我会得到一个例外。 有没有办法增加这个限制?此外,我注意到有时候,即使items更短,也不能一次处理所有这些。但是似乎没有这种情况发生的频率,或者尝试之后有多少元素未经处理,并且原始长度为items有没有办法避免这种情况,并尝试一口气写下所有内容?现在,最终目标是加快处理速度,而不是避免重复,因此在连续尝试之间长时间睡眠不是一种选择。

THX

回答

4

documentation

“的BatchWriteItem操作提出或在一个或多个表中删除多个项目BatchWriteItem单个呼叫可以写入最多为16 MB的数据,其可包括作为。多达25个放置或删除请求,单独写入的项目可能大至400 KB。“

某些未成功的原因可能是由于超出了表的预置吞吐量。您是否同时在桌面上执行其他写操作?您是否尝试过增加表上的写入吞吐量以查看是否处理了更多项目。

我不知道增加的每个请求的25个项目的限制的任何方式,但你可以尝试要求在AWS论坛或通过您的支持渠道。

我认为获得最大吞吐量的最佳方法是尽可能提高写入容量单位,并跨多个线程或进程并行执行批处理写入操作。

+0

我已经做了一些在同一台机器上运行多个索引工作的实验。这并没有增加实际的吞吐量。我认为网络是我的瓶颈。 – 2013-03-26 18:19:52

+0

您是否尝试在与DynamoDB表相同的区域中的EC2实例上运行它? – garnaat 2013-03-26 18:46:01

+0

他们在默认情况下不在同一个地区吗? – 2013-03-27 12:53:02

3

根据我的经验,使用批处理写入或多线程优化写入吞吐量几乎没有什么收获。批量写入可以节省一点网络时间,而多线程节省的功能几乎没有,因为项目大小限制非常低,DDB经常会限制您的请求。

因此,在DynamoDB中增加写入容量是一种可行的方法。

啊,像garnaat说,区域内延迟通常是从间区域或AWS外真的不同(比如从15毫秒到250毫秒)。

+0

我只是将我的代码从单个写入切换到20个批量写入。实际吞吐量从<= 100到400,可能会更高。由于我在几处地方(包括这里)读到切换到批处理写操作只能稍微增加t/p,我不确定加速是单纯的批处理写操作还是删除代码中的其他低效操作同时做出改变。但我根本没有摆弄地区。 – 2013-03-27 19:19:25

+0

您提供了多少写入容量?你的意思是400 QPS吞吐量,所以如果你的dynamodb容量<400,你可能会受到限制请求。你以前有过吗?在AWS控制台中有一个很好的图表。 – oDDsKooL 2013-03-29 06:54:43

1

不仅增加写入容量将使其更快。

如果你的散列键多样性很差,那么即使你会增加你写的能力,那么你可以有吞吐量错误。

吞吐量错误取决于您的点击地图。例如:如果您的散列键是1-10之间的数字,并且您有10个散列值为1-10但记录值为10的记录,那么即使在增加写入容量的同时,也会有很多吞吐量错误。