1

我有这样的结构数据(网络访问者)

List(p1,p1,p1,p2,p3,p3,p4,p4,p5...)

一位访客可以访问 1 --> 多次

数据量:约1亿/天

我可以存储唯一访问者以快速访问(接近实时)的数据库怎么样?

2014-11-15 | p1 | p2 | p3 | ...| pn

我尝试通过使用这样的表来使用 Cassandra 来解决:

CREATE TABLE uniqueVisitor (
  key text,
  p text,
  PRIMARY KEY (key, data)
) 

我认为这种商店模式不是很好,因为:

由于该表的数据分区,一个key的所有数据将只存储在一个服务器中(复制因子=1)==>过多的写入请求可能会炸毁存储该key的服务器。

请建议我一个解决方案(存储模式)

4

2 回答 2

3

您可以使用一个集合,因为它消除了重复(并且没有特定的顺序)。例如,

CREATE TABLE uniqueVisitor (
  dt text,
  users set<text>,
  PRIMARY KEY (dt)
);

你是对的,一天的数据不会被分发;它将位于单个节点(和副本)上。当然,不同日期的记录会被分发。所以这是一个潜在的写入热点。话虽如此,我认为在这种情况下写入热点可能并不重要,因为它是一个正在被修改的单个(尽管巨大的)记录。但是,每次用户访问都不会导致磁盘 I/O,因为更改将首先在内存中进行,在 memtables 中,并且只有当 memtables 刷新到磁盘时,它才会写入 SSTable。来自多个 SSTables 的数据会定期压缩,这可能会产生一些性能成本,但我想它不会杀死你的应用程序。

在 Cassandra 2.1 中,还可以在集合类型(如 SET)上创建索引。

希望这可以帮助。

于 2014-12-02T08:31:07.897 回答
1

在处理大量数据流时,为了效率而牺牲一些准确性是很常见的。在给定大量数据流的情况下,有一些算法可以估计唯一性的数量。它们需要的空间比简单地存储每个唯一的要少得多,需要的处理要少得多(甚至可以在单个节点或几个节点上的内存中完成),并提供至少 50% 准确度的结果(如果你做更多的工作)。看看 Flajolet-Martin 算法和(更好的)Alon-Matias-Szegedy (AMS) 算法。您可以在此处找到简要说明:http: //www.st.ewi.tudelft.nl/~hauff/BDP-Lectures/3_streams.pdf和 Ullman 等教授的详细分析。al. 的书在这里免费提供:http: //mmds.org/. 我相信第 4 章很好地介绍了流处理。

于 2014-12-02T10:24:01.627 回答