我们有很多来自Cassandra中存储的各种网站的用户交互数据,例如cookie,页面访问,广告查看,广告点击等,我们希望对其进行报告。我们当前的 Cassandra 模式支持基本的报告和查询。但是,我们还希望构建大型查询,这些查询通常涉及大型列族(包含数百万行)上的联接。
哪种方法最适合此?一种可能性是将数据提取到关系数据库(如mySQL)并在那里进行数据挖掘。另一种方法是尝试将 Hadoop与 Hive 或 pig 一起使用来为此目的运行 map Reduce 查询?我必须承认我对后者的经验为零。
有人有过一个与另一个的性能差异的经验吗?您会在实时 Cassandra 生产实例或备份副本上运行 mapreduce 查询,以防止查询负载影响写入性能吗?
根据我的经验,Cassandra 更适合需要实时访问数据、快速随机读取以及通常处理大量流量负载的流程。但是,如果您开始进行复杂的分析,Cassandra 集群的可用性可能会受到明显影响。总的来说,从我所看到的情况来看,不要理会Cassandra集群符合您的最佳利益,否则可用性就会受到影响。
听起来你需要一个分析平台,我绝对建议将你的报告数据从Cassandra导出到离线数据仓库系统中使用。
如果你能负担得起,拥有一个真正的数据仓库将允许你在多个表上使用复杂的连接进行复杂的查询。这些数据仓库系统广泛用于报告,以下是我认为主要参与者的列表:
- 内特扎
- 紫苑/太数据
- 维蒂卡
最近一个势头强劲的是Amazon Redshift,但它目前处于测试阶段,但如果你能得到它,你可以尝试一下,因为它看起来像一个可靠的分析平台,其定价比上述解决方案更具吸引力。
使用Hadoop MapReduce/Hive/Pig等替代方案也很有趣,但可能不是Hadoop技术的替代品。如果你有SQL背景,我会推荐Hive,因为它很容易理解你在做什么,并且你可以很容易地扩展。实际上已经有与Hadoop集成的库,如Apache Mahout,它允许你在Hadoop集群上进行数据挖掘,你绝对应该尝试一下,看看它是否符合你的需求。
为了给你一个想法,到目前为止,我使用的一种运行良好的方法是在 Hive 中预先聚合结果,然后在像 Netezza 这样的数据仓库中生成报告本身来计算复杂的连接。
披露:我是DataStax的工程师。
除了Charles的建议之外,你可能还想看看DataStax Enterprise(DSE),它提供了Cassandra与Hadoop,Hive,Pig和Mahout的良好集成。
正如 Charles 所提到的,您不希望直接针对处理实时应用程序需求的 Cassandra 节点运行分析,因为它们会对性能产生重大影响。 为了避免这种情况,DSE 允许您通过使用多个虚拟"数据中心"(在 NetworkToplogyStrategy 意义上)将集群的一部分严格用于分析。作为Hadoop作业的一部分执行的查询只会影响这些节点,基本上不会影响正常的Cassandra节点。 此外,您可以根据性能需求单独扩展或缩减群集的每个部分。
DSE 方法有几个优点。 首先,在处理数据之前,您无需执行任何 ETL;Cassandra的正常复制机制使专用于分析的节点保持最新状态。其次,你不需要外部Hadoop集群。 DSE包括一个称为CFS(CassandraFS)的HDFS的直接替代品,因此Hadoop作业的所有源数据,中间结果和最终结果都可以存储在Cassandra集群中。