amazon-dynamodb - 两个 DynamoDB 扫描段是否可以包含相同的哈希键?
问题描述
我正在扫描一个巨大的表(> 1B 文档),所以我正在使用并行扫描(每个工作人员使用一个段)。
该表有一个哈希键和一个排序键。
直观地说,一个段应该包含一组哈希键(包括它们所有的排序键),所以一个哈希键不应该出现在多个段中,但我还没有找到任何表明这一点的文档。
有谁知道 DynamoDB 在这种情况下的表现如何?
谢谢
解决方案
这是个有趣的问题。我认为很容易找到一份说明每个段包含不相交的哈希键范围的文档,并且相同的哈希键不能出现在多个段中 - 但我也找不到任何这样的文档。我很好奇其他人是否可以找到这样的文件。与此同时,我可以尝试提供额外的直觉来说明为什么你的猜想可能是正确的——但也可能是错误的:
我的第一直觉是你是对的:
DynamoDB 使用散列键(也称为分区键)来决定在众多存储节点中的哪一个来存储此数据的副本。共享相同分区键(具有不同排序键值)的所有项目按排序键顺序存储在一起,因此它们可以按Query
顺序排列在一起。DynamoDB 使用分区键上的散列函数来决定每个项目的位置(因此名称为“散列键”)。
现在,如果 DynamoDB 需要将扫描所有数据的任务划分为“段”,它最明智的做法是将哈希值(即哈希键的哈希函数)的空间划分为不同的相等大小件。这种划分很容易做到(只是一个数字除以TotalSegments
),它确保每个段中的项目数量大致相同(假设有许多不同的分区),并且它确保每个段的扫描涉及不同的存储节点,所以并行扫描可以比单个存储节点的能力更快地进行。
然而,有一个迹象表明这可能不是全部。
DynamoDB文档声称
通常,对于每个分区键值的不同排序键值的数量没有实际限制。
这意味着,至少在理论上,您的整个数据库(可能是其中的 1 PB)可能位于具有数十亿个不同排序键的单个分区中。由于亚马逊的单个存储节点确实有大小限制,这意味着 DynamoDB必须(除非上述陈述为假)支持将单个大分区拆分为多个存储节点。这意味着在GetItem
查找特定项目时,DynamoDB 需要知道哪个排序键在哪个存储节点上。这也意味着并行扫描可能 - 可能 - 将这个巨大的分区分成几部分,所有部分都扫描相同的分区,但其中的排序键范围不同。我不确定我们能否完全排除这种可能性。我猜它永远不会当您只有较小的分区时会发生。
推荐阅读
- azure - 通过 Azure 数据工厂从 ftp 站点获取 zip 和非压缩文件 - 解压缩
- c# - 升级到 .Net Core 2.1 后,IWebHost.Build() 未调用 Startup.Configure()
- php - 如何检查一个号码是巴基斯坦用户的手机号码而不是固定电话号码
- rstudio - 为什么在 R Markdown 中编辑文档时文本变灰?
- javascript - 如何在 axios 请求中转换 curl 请求
- visual-studio-code - 如何将 VSC 配置为使用 coderunner 并避免“无法识别'scriptcs'”
- reporting-services - SSRS - 使用一个文本框的结果来填充数据集中的字段
- javascript - 如何使用简单的 ajax jQuery 对 DialogFlow V2 进行 http 调用?
- sql - PSQL - 双精度类型的无效输入语法:“null”;
- swift - 使用 ARSCNView 后从场景中删除节点