0

我有以下情况:

  • 大约 7000 万台设备每 3~5 分钟向服务器发送一个信号,发送其 id、状态(在线或离线)、IP、位置(经纬度)、父节点和其他一些信息。

  • 其他信息可能不是标准格式(所以我没有架构),但我仍然需要查询它。

  • 设备可能会消失一段时间(或永远)在此过程中不发送信号。因此,如果设备在过去 X 天内没有发送信号,我需要一种方法来“忘记”设备。新设备也可能随时上线。

  • 我需要查询所有这些数据。就像了解特定区域或 IP 范围内有多少设备离线一样。不会有很多查询同时运行。

  • 一些查询需要快速运行(每个查询少于 3 分钟)并且在数据库更新的同时。所以我需要主要属性(id、状态、IP、位置和父节点)的索引。查询结果不需要 100% 准确,最终一致性很好,只要它们不需要太长时间(平均超过 20 分钟)才能出现在查询结果中。

  • 我根本不需要坚持,如果停电了,失去一切也没关系。

考虑到这一切,我想使用 noSQL 方法,可能是 MongoDB 或 CouchDB,因为我有使用 MapReduce 和 Javascript 的经验,但我不知道哪个更适合我的问题(我倾向于 CouchDB)或者它们是否完全适合来处理如此庞大的工作量。我什至不知道我是否真的需要一个“传统”数据库,因为我不需要持久性到磁盘(也许主内存方法会更好?),但我确实需要一种方法来轻松构建自定义查询。

我发现的主要问题如下:

  • 需要非常快速地插入/更新大量元组,我事先不知道我收到的信号是否已经在数据库中。几乎所有信号都将处于与上次相同的状态,因此可以通过 id 查询并检查元组是否更改,如果不执行任何操作,是否更新?

  • 忘记离线设备。在夜间运行的批处理作业删除过期的元组可以解决这个问题。

  • 不会有很多查询同时运行,但它们需要快速运行。所以我想我需要一个在集群的多个节点上执行单个查询的集群(CouchDB MapReduce 是否将工作负载拆分到集群的多个节点?)。我不确定我是否需要一个集群,一台更昂贵的机器可以处理所有负载吗?

  • 我以前从未使用过 noSQL 系统,但我对这个主题有理论知识。

4

2 回答 2

1

这有意义吗?

用于收集信号的Apache Flume 。

它是一个分布式、可靠且可用的系统,用于有效地收集、聚合来自许多不同来源的大量日志数据并将其移动到集中式数据存储。易于配置和扩展。使用 Flume 将数据作为文件存储在 HDFS 中。

Hive用于批量查询。

将 HDFS 中的数据文件映射为 Hive 仓库中的外部表。每当您需要离线批处理时,使用 HiveQL 编写类似 SQL 的查询。

HBase用于随机实时读/写。

由于作为 FS 的 HDFS 缺乏随机读/写能力,因此您需要一个数据库来实现该目的。查看您的用例 HBase 对我来说似乎很好。我不会说 MongoDB 或 CouchDB,因为您不在这里处理文档,而且它们都是面向文档的数据库。

Impala用于快速、交互式查询。

Impala 允许您直接对存储在 HDFS 或 HBase 中的数据运行快速的交互式 SQL 查询。与 Hive 不同,它不使用 MapReduce。相反,它利用了 MPP 的强大功能,因此非常适合实时处理。而且它很容易使用,因为它使用与 Hive 相同的元数据、SQL 语法 (Hive SQL)、ODBC 驱动程序等。

高温高压

于 2013-06-13T00:46:36.237 回答
0

根据分析的类型,CouchDB、Flume 的 HBase 可能都是不错的选择。对于严格的数字“一次写入”度量数据,石墨是一种非常流行的开源解决方案。

于 2013-06-14T15:35:10.650 回答