4

我正在将大量数据索引到 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

我正在使用 boto 2.8.0 版。如果items有超过 25 个元素,我会得到一个例外。有没有办法增加这个限制?另外,我注意到有时,即使items更短,它也无法一次处理所有这些。但是,这种情况发生的频率,或者尝试后有多少元素未处理,与items. 有没有办法避免这种情况并一次尝试编写所有内容?现在,最终目标是加快处理速度,而不仅仅是避免重复,因此在连续尝试之间长时间休眠不是一种选择。

谢谢

4

3 回答 3

5

文档中:

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

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

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

我认为获得最大吞吐量的最佳方法是尽可能增加写入容量单元,并在多个线程或进程中并行化批量写入操作。

于 2013-03-26T15:15:23.293 回答
4

根据我的经验,尝试使用批量写入或多线程优化写入吞吐量几乎没有什么收获。批量写入节省了一点网络时间,而多线程几乎没有节省,因为项目大小限制非常低,瓶颈通常是 DDB 限制您的请求。

所以(不管你喜不喜欢)增加你在 DynamoDB 中的写入容量是要走的路。

啊,就像 garnaat 所说,区域内的延迟通常与区域间或 AWS 外部的延迟确实不同(例如从 15 毫秒到 250 毫秒)。

于 2013-03-27T12:55:20.033 回答
2

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

如果您的 HASH KEY 多样性较差,那么即使您增加写入容量,也会出现吞吐量错误。

吞吐量错误取决于您的命中图。

例如:如果您的哈希键是 1-10 之间的数字,并且您有 10 条哈希值为 1-10 的记录,但有 10k 条值为 10 的记录,那么即使在增加写入容量时也会出现许多吞吐量错误。

于 2015-11-02T14:33:00.393 回答