AWS DynamoDB中的Scan和Parallel Scan有什么区别?

7

在云存储系统中,AWS的需求非常高。扫描过程需要更快的速度。那么扫描过程是如何工作的,哪个(Scan / Parallel Scan)在哪种情况下更好?

  1. AWS DynamoDB中的扫描如何工作?
  2. AWS DynamoDB中的并行扫描如何工作?
  3. AWS DyanmoDB中的Scan vs Parallel Scan?
  4. 什么时候会优先选择Parallel Scan?
  5. 过滤表达式是否在扫描之前应用?

这是一个好问题。 - nik
2个回答

19

1. AWS DynamoDB中的扫描操作是如何工作的?

Ans:

i) 扫描操作将返回一个或多个项目。

ii) 默认情况下,扫描操作按顺序进行。

iii) 默认情况下,Scan在访问表中的数据时使用最终一致性读取。

iv) 如果扫描的项目总数超过1 MB的最大数据集大小限制,则扫描将停止,并将结果作为LastEvaluatedKey值返回给用户,以便在随后的操作中继续扫描。

v) 默认情况下,扫描操作执行最终一致性读取,它可以返回高达1 MB(一个页面)的数据。因此,单个扫描请求可能会消耗大量资源。

(1 MB page size / 4 KB item size) / 2 (eventually consistent reads) = 128 read operations.

2. AWS DynamoDB中的并行扫描是如何工作的?

答:

i) 在大型表或辅助索引上,应用程序可以请求并行扫描操作以获得更快的性能。

ii) 您可以并行运行多个工作线程或进程。每个工作器将能够与其他工作器同时扫描表的单独段。 DynamoDB的扫描函数现在接受两个额外的参数:

  • TotalSegments 表示将同时访问表的工作器数量。
  • Segment 表示调用工作者将访问的表段。

iii) 当一起使用这两个参数时,会将扫描限制在表中特定块的项中。您还可以使用现有的Limit参数来控制单个扫描请求返回多少数据。

3. AWS DyanmoDB中的Scan和Parallel Scan有什么区别?

答:

i) 扫描操作一次只能读取一个分区。因此需要并行扫描来快速读取多个分区。

ii) 顺序扫描可能无法充分利用所提供的读取吞吐量容量。因此需要并行扫描。

iii) 并行扫描可以将某些类型的查询和扫描成本降低多达4倍。

4. 什么情况下会选择并行扫描?

答:

如果满足以下条件,那么并行扫描可能是正确的选择:

  • 表大小为20 GB或更大。

  • 表的预配读取吞吐量没有被充分利用。

  • 顺序扫描操作太慢了。

5. 过滤表达式是在扫描之前应用的吗?

答:不是,FilterExpression是在项已经被读取后应用的;过滤的过程不会消耗任何额外的读取容量单位。

资源链接:

  1. Scan

  2. Parallel Scan

  3. 示例-使用Java进行并行扫描

  4. Amazon DynamoDB - 并行扫描,读取成本降低4倍,其他好消息

  5. 避免突发读取活动


2
并行扫描不是便宜4倍。那只是与并行扫描同时推出的另一个功能。https://aws.amazon.com/blogs/aws/amazon-dynamodb-parallel-scans-and-other-good-news/ - emilyk
@emilyk 感谢您的指出。您是正确的。实际上,它可以将成本降低多达4倍。 - SkyWalker
1
@SkyWalker 这个说法是错误的:“实际上可以将成本降低多达4倍”。并行扫描可以帮助您更快地扫描DynamoDB表,但这也取决于您定义的工作程序/段数。您仍然需要支付相同的费用。 - user1188611

5

讨论何时应该使用并行扫描而不是常规扫描的问题...

我的经验是,当表中数据超过2MB时,并行扫描比常规扫描更快,大致上来说,在表中每1MB数据运行一个段可以优化性能。

我有三个表,每个表根据需要进行配置。一个微小的表包含300个项目和70KB数据。一个小表包含1,800个项目和4MB数据。一个大表包含1.1百万个项目和1.05GB数据。

我可以通过将此命令放入名为scan.sh的shell脚本中来计时常规扫描:

aws dynamodb scan --table-name MyTable --select COUNT

然后执行
time scan.sh

我可以通过在shell脚本中替换命令,来计算并行扫描的时间。

aws dynamodb scan --table-name MyTable --total-segments 4 --segment 0 --select COUNT

上述命令将扫描分为4个部分,只执行其中一个部分。我在我的应用程序中使用DynamoDBMapper(Java SDK),该SDK负责并行运行不同的线程。
在我的小表上,每次扫描需要1.4秒,并行扫描没有任何区别。在我的小型表格上,常规扫描需要1.8秒,而并行扫描在4个部分中运行最佳,只需1.4秒即可完成。
有趣的结果是大表格。以下是基于并行扫描中段数的执行扫描所需时间:
- 1个段 - 120秒 - 4个段 - 30秒 - 8个段 - 15秒 - 16个段 - 8秒 - 32个段 - 5秒 - 64个段 - 3秒 - 128个段 - 1.9秒 - 256个段 - 1.6秒 - 512个段 - 1.4秒 - 1024个段 - 1.4秒

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接