2

我正在尝试以下列方式使用 SimpleDB。

我想随时将 48 小时价值的数据保存到 simpledb 中,并为不同的目的查询它。每个域都有 1 小时价值的数据,所以在任何时候,simpledb 中都有 48 个域。随着新数据不断上传,我删除了最旧的域并为每个新的小时创建一个新域。

每个域大小约为 50MB,所有域的总大小约为 2.2 GB。域中的项目具有以下类型的属性
标识符 - 大约 50 个字符长 - 每个项目 1 个
时间戳 - 时间戳值 - 每个项目 1 个
serial_n_data - 500-1000 字节数据 - 每个项目 200

我正在使用 python boto 库来上传和查询数据。我每秒发送 1 个项目,在域中具有大约 200 个属性。

对于此数据的其中一个应用程序,我需要从所有 48 个域中获取所有数据。对于所有域,查询看起来像“SELECT * FROM domain”。我使用 8 个线程来查询数据,每个线程负责几个域。
例如域 1-6 线程 1
域 7-12 线程 2 等等

获取整个数据大约需要 13 分钟。我为此使用了 boto 的 select 方法。我需要比这更快的性能。关于加快查询过程的任何建议?我可以使用其他任何语言来加快速度吗?

4

3 回答 3

5

使用更多线程

我建议将您的线程/域比率从 1/6 反转到接近 30/1 的值。从 SimpleDB 中提取大量数据所花费的大部分时间都将花在等待上。在这种情况下,增加线程数将大大提高您的吞吐量。

SimpleDB 的限制之一是查询响应大小上限为 1MB。这意味着在单个域中拉下 50MB 将至少需要 50 个选择(原始 + 49 个附加页面)。这些必须按顺序发生,因为下一个请求需要来自当前响应的 NextToken。如果每个 Select 需要 2 秒以上(在大响应和高请求量中并不罕见),那么您在每个域上花费 2 分钟。如果每个线程都必须依次遍历 6 个域中的每一个,那么大约需要 12 分钟。每个域一个线程应该可以轻松地将其缩短到大约 2 分钟。

但是你应该能够做得比这更好。SimpleDB 针对并发进行了优化。我会尝试每个域 30 个线程,给每个线程一个小时的一部分时间来查询,因为它毕竟是日志数据。例如:

SELECT * FROM domain WHERE timestamp between '12:00' and '12:02'

(显然,您将使用真正的时间戳值)所有 30 个查询都可以在不等待任何响应的情况下启动。通过这种方式,您仍然需要对每个域进行至少 50 次查询,但不是按顺序进行所有查询,您可以获得更多的并发性。您必须自己测试有多少线程可以为您提供最佳吞吐量。我鼓励您尝试每个域最多 60 个,将 Select 条件分解为一分钟增量。如果它对您有用,那么您将拥有完全并行的查询,并且很可能已经消除了所有后续页面。如果您收到 503 ServiceUnavailable 错误,请缩减线程。

域是 SimpleDB 可伸缩性的基本单位,因此最好有一种方便的方式来对数据进行分区。您只需要利用并发性。如果您能够在 13 秒内获取在同一区域的 EC2 上运行的应用程序的数据,而不是 13 分钟,我不会感到惊讶。但实际花费的时间将取决于许多其他因素。

成本问题

作为旁注,我应该提到你正在做的事情的成本,即使你没有提出这个问题。CreateDomain 和 DeleteDomain 是重量级操作。通常我不建议经常使用它们。每次您需要支付大约 25 秒的盒子使用时间,因此每小时创建和删除一个盒子的费用总计约为每月 70 美元,仅用于域管理。您可以在域中存储比您提到的 50MB 多数量级的数据。因此,您可能希望在删除之前让数据积累更多。如果您的查询包含时间戳(或可以包含时间戳),则在域中拥有额外 GB 的旧数据可能不会损害查询性能。在任何情况下,GetAttributes 和 PutAttributes 永远不会受到大域大小的性能影响,只有查询不会' t 充分利用选择性索引。您必须测试您的查询才能看到。这只是一个建议,我意识到创建/删除在概念上更清晰。

由于盒子使用公式中的一个怪癖,一次写入 200 个属性也很昂贵。写入的框使用量与属性数量的 3 次方成正比!以小时为单位的公式是:

0.0000219907 + 0.0000000002 N^3

对于基本费用加上每个属性费用,其中 N 是属性数。在您的情况下,如果您在一个请求中写入所有 200 个属性,则盒子使用费约为每百万个项目 250 美元(如果您写入 256 个属性,则为每百万个 470 美元)。如果您将每个请求分成 4 个请求,每个请求包含 50 个属性,您的 PutAttributes 量将增加四倍,但将盒子使用费降低一个数量级,降低到每百万个项目约 28 美元。如果您能够分解请求,那么它可能是值得的。如果你不能(由于请求量,或者只是你的应用程序的性质),这意味着从成本的角度来看,SimpleDB 最终可能会非常没有吸引力。

于 2010-06-23T19:39:35.960 回答
0

我和查理有同样的问题。分析代码后,我将性能问题缩小到 SSL。似乎这就是它花费大部分时间和 CPU 周期的地方。

我已经阅读了 httplib 库(boto 用于 SSL)中的一个问题,除非数据包超过一定大小,否则性能不会提高,尽管这是针对 Python 2.5 并且可能已经修复。

于 2012-01-26T00:58:30.000 回答
0

SBBExplorer 使用多线程 BatchPutAttributes 来实现高写入吞吐量,同时将批量数据上传到 Amazon SimpleDB。SDB Explorer 允许多个并行上传。如果您有带宽,您可以通过在并行队列中一次运行多个 BatchPutAttributes 进程来充分利用该带宽,这将减少处理时间。

http://www.sdbexplorer.com/

于 2012-03-19T05:56:03.783 回答