【问题标题】:May two DynamoDB scan segments contain the same hash key?两个 DynamoDB 扫描段是否可以包含相同的哈希键?
【发布时间】:2020-10-13 10:43:03
【问题描述】:

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

该表有一个哈希键和一个排序键。

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

有谁知道 DynamoDB 在这种情况下的表现如何?

谢谢

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

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

    对于在 Scan 请求中传递的每个 Segment 值(TotalSegments 值是恒定的),每个 Segment 将返回不同的项目而没有任何重叠。

    常见问题解答

    问。 TotalSegments 的理想数字?

    -> 您可能需要试验值,找到适合您的表的最佳位置以及您使用的工作人员数量,直到您的应用程序达到最佳性能。

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

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

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

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

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

    -> 是的。不同 Segment 的多次 Scan 操作没有关联/不依赖于先前/其他 Segment Scan。

    【讨论】:

    【解决方案2】:

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

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

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

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

    但是,有一个迹象表明这可能不是故事的全部。

    DynamoDB documentation 声称

    一般来说,每个分区键值的不同排序键值的数量没有实际限制。

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

    【讨论】:

    • 添加到您的观点 dynamoDB 为段提供相等的读/写容量单位,所以基本上当单个分区键上有这么多请求时,我们会陷入拥塞问题,因为具有相同分区键的条目位于在同一段。因此,AWS 为此添加了一项新功能,该功能在段之间共享容量单元,而不是将具有相同分区键的条目分布在各个段之间(这在逻辑上是不正确的)。所以从逻辑上讲,不会有段具有相同的范围键。
    • 我们现在有这方面的官方文件吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多