我有以下情况:
大约7000万台设备每隔3~5分钟发送一次信号 服务器发送其ID,状态(在线或非在线),IP,位置 (纬度和经度),父节点和其他一些信息。
其他信息可能不是标准格式(因此我没有架构),但我仍然需要查询它。
设备可能会消失一段时间(或永远)不发送 这个过程中的信号。所以我需要一种“忘记”设备的方法 他们在过去的X天没有发出信号。也是新设备 可能随时上线。
我需要查询所有这些数据。就像知道特定区域或以上有多少设备离线一样 IP范围。不会有很多查询同时运行。
有些查询需要快速运行(每个查询少于3分钟)和 在数据库更新的同时。所以我需要索引 主要属性(id,status,IP,location和parent node)。该 查询结果不需要100%准确,最终一致 只要它不需要太长时间(超过20分钟)就可以了 avarage)让他们出现在查询结果中。
我不需要 坚持不懈,如果力量消失,可以输掉 一切。
鉴于所有这些,我想到使用noSQL方法可能是MongoDB或CouchDB,因为我有MapReduce和Javascript的经验,但我不知道哪个更适合我的问题(我倾向于CouchDB)或者如果它们是完全适合处理这种巨大的工作量。我甚至不知道我是否真的需要一个“传统”数据库,因为我不需要持久化到磁盘(也许主内存方法会更好?),但我确实需要一种方法来轻松构建自定义查询。 / p>
我发现的主要问题如下:
需要快速插入/更新大量元组,我不知道 如果我收到的信号已经在数据库中,请事先预先。 几乎所有信号都处于与它们相同的状态 最后一次,也许可以通过id进行查询并检查元组是否发生变化,如果没有做任何事情,如果它确实更新了吗?
伪造离线设备。在夜间运行的批处理作业 删除过期的元组可以解决这个问题。
不会有很多查询同时运行,但是需要它们 跑得快。所以我想我需要一个集群来执行一个 在群集的多个节点上进行单一查询(CouchDB MapReduce 将工作负载拆分到集群的多个节点?)。我不是 肯定我需要一个集群,可能会更贵 机器处理所有负载?
我之前从未使用过noSQL系统,但我有理论上的 该主题的知识。
答案 0 :(得分:1)
这有意义吗?
Apache Flume收集信号。
它是一个分布式,可靠且可用的系统,用于有效地从许多不同的源收集,聚合和移动大量日志数据到集中式数据存储。易于配置和扩展。使用Flume将数据作为文件存储在HDFS中。
Hive用于批量查询。
将HDFS中的数据文件映射为Hive仓库中的外部表。无论何时需要离线批量处理,都要使用HiveQL编写类似SQL的查询。
HBase用于随机实时读/写。
由于作为FS的HDFS缺乏随机读/写功能,因此您需要一个DB来实现此目的。看看你的用例HBase对我来说似乎很好。我不会说MongoDB或CouchDB,因为你不在这里处理文档,这些都是面向文档的数据库。
Impala用于快速互动查询。
Impala允许您直接对存储在HDFS或HBase中的数据运行快速,交互式SQL查询。与Hive不同,它不使用MapReduce。相反,它利用了MPP的强大功能,因此它对实时的东西很有用。并且它易于使用,因为它使用相同的元数据,SQL语法(Hive SQL),ODBC驱动程序等作为Hive。
HTH
答案 1 :(得分:0)
根据分析的类型,CouchDB,Flume的HBase可能都是不错的选择。对于严格的数字“一次写入”指标数据,石墨是一种非常流行的开源解决方案。