在分布式数据库中存储唯一访问

时间:2014-12-01 07:00:22

标签: database cassandra bigdata real-time-data

我有类似的结构数据(网络访问者)

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

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

数据量:约100亿/天

我可以将唯一访问者存储到快速访问(接近实时)的那个或者哪个数据库

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

我试着通过使用Cassandra来解决这个问题:

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

我认为这种商店模式效果不佳,因为:

由于该表的数据分区,密钥的所有数据只存储在一个服务器中(复制因子= 1)==>太多的写请求都会导致存储此密钥的服务器爆炸。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

在Cassandra 2.1中,还可以在SETs等集合类型上创建索引。

希望这有帮助。

答案 1 :(得分: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章很好地涵盖了流处理。