Cassandra查询灵活性

时间:2015-05-20 11:24:52

标签: hadoop cassandra apache-spark bigdata cql

我对大数据领域很陌生,目前仍然坚持做出基本决定。

对于一个研究项目,我需要每分钟存储数百万个日志条目到我的基于Cassandra的数据中心,这个工作非常好。 (单个数据中心,4个节点)

Log Entry
------------------------------------------------------------------
| Timestamp              | IP1         | IP2           ... 
------------------------------------------------------------------
| 2015-01-01 01:05:01    | 10.10.10.1  | 192.10.10.1   ...
------------------------------------------------------------------

每个日志条目都有一个特定的时间戳。应该在第一个实例中通过不同的时间范围查询日志条目。按照建议,我开始以大排方式“模拟我的查询”。

Basic C* Schema
------------------------------------------------------------------
| row key              | column key a         | column key b     ... 
------------------------------------------------------------------
|  2015-01-01 01:05    | 2015-01-01 01:05:01  | 2015-01-01 01:05:23
------------------------------------------------------------------

其他细节: 列键是时间戳+ uuid的组合,是唯一的并且避免重写; 特定时间的日志条目通过其相同的分区键存储在节点附近;

因此,日志条目以每行的短时间间隔存储。例如2015-01-01 01:05的每个日志条目,精度为一分钟。查询并非真正作为具有<运算符的范围查询,而是选择条目作为指定分钟的块。

基于范围的查询在适当的响应时间内成功,这对我来说很好。

问题: 在下一步中,我们希望通过查询获得其他信息,这些信息主要关注IP字段。例如:选择包含IP1=xx.xx.xx.xxIP2=yy.yy.yy.yy的所有条目。

显然,当前模型对于其他以IP为中心的CQL查询非常不可用。所以问题不在于找到可能的解决方案,而是可能的解决方案的各种可能技术选择:

  1. 尝试使用独立的C *解决方案解决问题。 (构建第二个模型并以不同的形状管理相同的数据)
  2. 选择其他技术,如Spark ......
  3. 切换到HDFS / Hadoop - Cassandra / Hadoop解决方案......
  4. 由于我在这个领域缺乏知识,很难找到我应该采取的最佳方式。特别是感觉使用集群计算框架将是一个过度的解决方案。

1 个答案:

答案 0 :(得分:2)

据我所知,您的表架构如下所示:

create table logs (
  minute timestamp,
  id timeuuid,
  ips list<string>,
  message text,
  primary key (minute,id)
);

使用这个简单的架构,您:

  • 可以获取特定分钟的所有日志。
  • 可以获取日志间事件的短时间范围。
  • 想要通过IP查询数据集。

从我的观点来看,有多种方法可以实现这个想法:

  • 在IP地址上创建二级索引。但是在C *中,你将失去按时间戳查询的能力:C *不能合并主索引和二级索引(如mysql / pgsql)。
  • 非规范化数据。将您的日志事件一次写入两个表,首先针对时间戳查询进行优化(分钟+ ts为PK),第二个针对基于IP的查询(IP + ts为PK)。
  • 使用spark进行分析查询。但是火花需要执行(完全?)表格扫描(以漂亮的分布式地图缩小方式,但它仍然是桌面扫描)每次都要提取你所要求的所有数据,所以你的所有查询需要很多时间才能完成。如果您计划进行大量低延迟查询,这种方式可能会导致问题。
  • 使用外部索引(如ElasticSearch)进行查询,使用C *进行存储数据。

对于我来说,做这些事情的C *方法是为不同的查询提供一组单独的表。它将使您能够执行超快速的查询(但存储成本增加)。