可能两个DynamoDB扫描段包含相同的哈希密钥



我正在扫描一个巨大的表(>1B文档),所以我使用并行扫描(每个工作人员使用一个段)。

该表有一个散列键和一个排序键。

直观地说,一个片段应该包含一组哈希键(包括它们的所有排序键),所以一个哈希键不应该出现在多个片段中,但我还没有找到任何表明这一点的文档。

有人知道DynamoDB在这种情况下的表现吗?

感谢

这是一个有趣的问题。我认为很容易找到一个文档,说明每个段都包含一个不相交的哈希键范围,并且同一个哈希键不能出现在多个段中,但我也找不到任何这样的文档。我很好奇是否还有人能找到这样一份文件。与此同时,我可以尝试提供更多的直觉来解释为什么你的猜测可能是正确的,但也可能是错误的:

我的第一直觉是你是对的:

DynamoDB使用散列密钥,也称为分区密钥来决定在许多存储节点中的哪个存储节点存储该数据的副本。共享相同分区键(具有不同的排序键值)的所有项都按排序键顺序存储在一起,因此它们可以按顺序Query存储在一起。DynamoDB在分区键上使用散列函数来决定每个项的位置(因此得名"散列键")。

现在,如果DynamoDB需要将扫描所有数据的任务划分为";段";,对它来说,最明智的做法是将哈希值的空间(即哈希键的哈希函数)划分为大小相等的不同部分。这种划分很容易做到(只是TotalSegments的数字划分),它确保每个段中的项目数量大致相同(假设有许多不同的分区),并确保每个段的扫描涉及不同的存储节点,因此并行扫描可以比单个存储节点更快地进行。

然而,有一种迹象表明,这可能不是故事的全部。

DynamoDB文件声称

通常,每个分区键值的不同排序键值的数量没有实际限制。

这意味着,至少在理论上,您的整个数据库,可能是一PB的数据库,可能位于一个具有数十亿个不同排序键的分区中。由于Amazon的单个存储节点确实有大小限制,这意味着DynamoDB必须(除非上述声明为false)支持将单个巨大分区拆分为多个存储节点。这意味着,当GetItem查找特定项时,DynamoDB需要知道哪个排序键在哪个存储节点上。这也意味着并行扫描可能会将这个巨大的分区分割成多个部分,所有的分区都扫描同一个分区,但其中的排序键范围不同。我不确定我们是否可以完全排除这种可能性。我猜,当你只有小分区时,这将永远不会发生。

每个DynamoDB表都有一个"hashspace";并且根据分区密钥的散列值对数据进行分区。当打算进行ParallelScan并且提供TotalSegments和Segment值时,表的完整散列空间在逻辑上被划分为这些"散列";分段";使得TotalSegments覆盖完整的散列空间而不重叠。这里的一些片段实际上可能没有任何对应的数据,因为在分配给该片段的哈希空间中可能没有任何数据。例如,如果选择的TotalSegments值非常高,则可以观察到这一点。

对于扫描请求中传递的每个Segment值(TotalSegments值为常量),每个Segments都将返回不同的项目,没有任何重叠。

常见问题

Q。TotalSegments的理想数量

->您可能需要对值进行实验,找到表的最佳位置,以及使用的工作者数量,直到您的应用程序达到最佳性能。

Q。一个或多个分段不返回任何记录。为什么

->如果根据TotalSegments值分配的哈希范围没有任何项,则可能发生这种情况。在这种情况下,为了获得更好的性能,可以减小TotalSegments值。

Q。扫描段中途失败。现在可以单独重试对该段的扫描吗

->只要TotalSegments值保持不变,就可以重新运行其中一个段的扫描,因为它在任何给定时间都会分配相同的哈希范围。

Q。我可以对单个段执行扫描,而不根据TotalSegments值对其他段执行扫描吗

->对不同分段的多个扫描操作不链接/不依赖于以前/其他分段扫描。

最新更新