1

在我问我的问题之前,先介绍一下我们的问题的背景。

我们正在开发政府收入预测应用程序。在这个应用程序中,我们收集有关以前收入的数据,应用几个计量经济学和政治预测模型(通过几个阶段),同时将其保存到数据库中。

简而言之,这是投影系统的简化模型:

使用此模式的几行(开始时,约 6.000 行)代表过去的收入(称为场景):

+------+------+------+------+------+-------+---------+
| Cat1 | Cat2 | Cat3 | Cat4 | Year | Month | Revenue |
+------+------+------+------+------+-------+---------+

在整个投影系统中,数据以多种方式进行转换(移动类别、更改收入值、修复非典型性等)。每个转换都在一个阶段完成:

Initial Scenario (S0) ---(1st transformation phase)--> Transformed Scenario (S1)
S1 ---(2nd t.p.)--> S2 ---> S3 ---...---> SN

每个阶段转换场景的一部分,这部分的大小在数据的 2-100% 之间变化,并且部分场景状态必须保持直到达到其最终状态 (SN)。部分状态可以只是转换后的线或整个部分场景(只要可以比较部分状态)。

此外,用户可以返回该过程(例如,返回第 2 阶段)并从那里重新开始投影,而忽略之前完成的工作。

在这个用例中,我们遇到了 RDBMS 的一个问题:它们的写入操作真的很慢(需要半个小时来进行场景投影)。

在阅读了 NoSQL DBMS 之后,我们得出了几个选择,但是,由于我仍在学习曲线上,我想问一下:在这个用例上使用的最佳选择是什么:VoltDB、Redis、Riak、Cassandra、 MongoDB 还是 HBase?

提前致谢。

4

1 回答 1

2

我将从 MongoDB 的角度提出我的解决方案。也许其他人可以从其他数据库中添加他们的经验。

Mongo 有一个 map/reduce 框架,可以让你对你的数据运行相当复杂的查询。他们的 map/reduce 东西的好处是您可以将结果输出到数据库中的集合(类似于 RDBMS 中的表)。

所以它会是:

  1. 运行 map/reduce 作业 1 => 输出到集合 A。
  2. 针对集合 A 运行 map/reduce 作业 2 => 输出到集合 B。
  3. 针对集合 B 运行 map/reduce 作业 3 => 输出到集合 C。
  4. ...
  5. 利润!

每一步都会产生一组持久化的数据。这使您可以从中断的地方继续。你当然必须在完成后清理,但它可以工作。

我不是 Hadoop 专家,但您的方案听起来很适合他们的生态系统。分阶段运行具有中间输出的复杂作业。

于 2013-03-14T22:46:31.247 回答