> 100 mio 的大数据项目选择哪种数据模型。项目

Posted

技术标签:

【中文标题】> 100 mio 的大数据项目选择哪种数据模型。项目【英文标题】:Which data model to choose for big data project with > 100 mio. items 【发布时间】:2016-05-04 13:31:43 【问题描述】:

我正在从事一个大数据项目,从不同的在线卖家那里收集大量产品信息,例如价格、标题、卖家等(每件商品 30 多个数据点)。

一般来说,该项目有 2 个用例:

    在网络应用程序或小部件中显示特定产品的最新数据点 分析历史数据,例如价格历史、产品聚类、语义分析等

我首先决定使用 MongoDB 来实现水平扩展,因为假设为项目存储的数据在数百 GB 的范围内,并且数据可以通过 MongoDB 跨多个 MongoDB 实例动态分片。

每个产品的 30 多个数据点不会一次收集,而是在不同的时间收集,例如一个爬虫收集价格,几天后另一个爬虫收集产品描述。但是,某些数据点可能会重叠,因为两个爬虫都收集例如产品标题。例如,结果可能是这样的:

Document 1:

'_id': 1,
'time': ISODate('01.05.2016'),
'price': 15.00,
'title': 'PlayStation4',
'description': 'Some description'


Document 2:

'_id': 1,
'time': ISODate('02.05.2016'),
'price': 16.99,
'title': 'PlayStation4',
'color': 'black'

因此我最初提出了以下想法(想法1):

如上所述,在一个特定爬网过程中找到的所有数据点最终都在一个文档中。为了获得最新的产品信息,我会单独查询每个数据点并获取不超过某个阈值的最新条目,例如一周,以确保“用例 1”的产品信息不会过时,并且我们拥有所有数据点(因为单个文档可能不包含所有数据点,而仅包含一个子集)。 但是,由于某些数据点(例如产品名称)不会定期更改,因此始终保存所有数据(以便能够进行时间序列分析和高级分析)会导致数据库中的大量冗余,例如每天都会保存相同的产品描述,即使它没有改变。因此,我想我可能会检查数据库中的最新值,并且仅在值发生更改时才保存该值。但是,这会导致大量额外的数据库查询(每个数据点一个),并且由于上述时间阈值,我们将丢失数据点是否未更改或被所有者从网站上删除的信息商店。

因此,我在考虑不同的解决方案(想法 2):

我想拆分不同文档中的所有数据点,例如价格和标题存储在单独的文档中,并带有自己的时间戳。如果数据点未更改,则可以更新时间戳以指示该数据点未更改并且仍可在网站上使用。但是,这会导致小数据点(例如布尔值)的巨大开销,因为每个文档都需要自己的键、时间戳等才能使用索引快速查找/过滤/排序它们。

例如:


'_id': 1,
'timestamp': ISODate('04.05.2016'),
'type': 'price',
'value': 15.00

因此,我正在努力寻找用于该项目的正确模型和/或数据库。总结一下,就是这些要求:

收集数以亿计的产品(数百 GB 甚至 TB) 分布式爬虫在不同时间点检索重叠的产品信息子集 信息应存储在分布式、水平可扩展的数据库中 应将数据冗余降至最低 应保留有关数据点的时间序列信息

我将非常感谢任何可能帮助我推进项目的想法(数据模型/架构、不同的数据库……)。提前非常感谢!

【问题讨论】:

【参考方案1】:

字段/数据点是否已知并已指定?即,你有固定的模式吗?如果是这样,那么您也可以考虑使用关系数据库。

DB2 有一个他们称之为时态数据库的东西。在“系统”形式中,数据库透明地处理版本控制。任何插入都会自动添加时间戳,并且每当您更新一行时,前一行都会自动迁移到历史表(保留其旧时间戳)。此后,您可以在任何给定时间点运行 SQL 查询,DB2 将返回指定时间(或时间范围)的数据。它们还有一个“应用程序”表单,您可以在其中指定插入行时该行有效的时间段(例如,如果价格在特定时间段内有效),但最终的 SQL 查询仍然工作相同方式。好的是,无论哪种方式,所有时间复杂度都由数据库管理,您可以编写相对干净的 SQL 查询。

您可以通过他们的DeveloperWorks site查看更多信息。

我知道像 Oracle 这样的其他关系数据库也具有时间序列数据的特殊功能,可以为您管理版本控制/时间戳。

就空间效率和规模而言,我不确定,因为我没有运行任何大型数据库 :-)

(OTOH,如果您没有固定架构,或者您知道您将有多个架构用于不同的数据输入并且您无法使用稀疏表对其进行建模,那么像 mongo 这样的文档数据库可能是您的最好的选择)

【讨论】:

以上是关于> 100 mio 的大数据项目选择哪种数据模型。项目的主要内容,如果未能解决你的问题,请参考以下文章

Scala VS Python:为大数据项目选择哪一个

如何选择大数据的编程语言

客快物流大数据项目学习框架

实时即未来,大数据项目车联网之重启机制及数据积压

实时即未来,大数据项目车联网之重启机制及数据积压

25k 用户之后的大数据流程堆栈