Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Cassandra模式建议_Cassandra_Schema_Bigdata - Fatal编程技术网

需要Cassandra模式建议

需要Cassandra模式建议,cassandra,schema,bigdata,Cassandra,Schema,Bigdata,我正在为浏览器事件收集系统设计一个Cassandra模式,我希望检查我的方法是否正确。系统在浏览器中收集用户事件,如鼠标移动、单击等。这些事件被存储和处理,以在网页上创建用户活动的热图。我选择Cassandra作为持久性,因为我的用例更重于写,而不是准备:每50毫秒,ajax调用就会将聚合的事件转储到我的服务器,并转储到数据库中。我在服务器上使用node.js,服务器上的JSON事件如下所示: { uuid: dsf86ag487hadf97hadf97, type: 'MOVE', time:

我正在为浏览器事件收集系统设计一个Cassandra模式,我希望检查我的方法是否正确。系统在浏览器中收集用户事件,如鼠标移动、单击等。这些事件被存储和处理,以在网页上创建用户活动的热图。我选择Cassandra作为持久性,因为我的用例更重于写,而不是准备:每50毫秒,ajax调用就会将聚合的事件转储到我的服务器,并转储到数据库中。我在服务器上使用node.js,服务器上的JSON事件如下所示:

{ uuid: dsf86ag487hadf97hadf97, type: 'MOVE', time: 12335234345, pageX: 334, pageY:566, .... }
正如您所见,每个用户都有一个唯一的uuid,该uuid与浏览器上生成的每个事件关联,存储在cookie中。我的阅读案例将是一些地图缩减工作。每个顶级域都将是一个键空间,我计划使用uuid作为分区键。主表是events表,其中每一行都是一个事件,使用复合主键,由浏览器生成的uuid和cassandra生成的timeuuid组成。主键必须具有timeuuid组件,因为在某些浏览器上,两个事件可能具有相同的时间戳。事件的数据类型将是字符串、整数和时间戳。分区的总数据不应超过几百兆字节。那么…这是理智的吗?我应该问自己什么问题?我认识到这个用例在传感器数据收集等方面有很多类似之处,所以请给我指出现有的例子。提前谢谢

选择分区键 虽然在某些情况下记录用户ID对于区分可能同时发生的来自不同用户的事件可能很重要,但是用户ID可能不是分区密钥的最佳选择。也就是说,除非您计划分析特定用户的行为

您可能更关心热图是如何随时间变化的,特别是涉及页面的哪些区域。对于分区键来说,这些可能是更好的考虑因素,尽管可能不是存储为时间戳,也不是存储为X/Y坐标,我将在后面讨论

您通常希望选择一个分区键,该分区键(1)具有较大的值分布,以便在整个集群中创建均匀的负载,(2)由相对“众所周知”的值组成。我所说的“众所周知”是指你事先知道的东西,或者是可以很容易和确定地计算出来的东西。例如,您将拥有许多用户,并将在许多天内收集统计数据。虽然可以根据已知的开始/结束日期范围或查询输入轻松确定特定天数(例如,编码为YYYY-MM-DD字符串),但如果不扫描整个集群,则很难确定所有有效用户ID的集合(假设UUID或其他非增量值或哈希)。避免分区键扫描;以“精确”随机访问分区为目标

分区键的格式 在许多示例中,分区键传统上显示为单列,但您可以使用多列分区键。当使用日期/时间信息作为全部或部分键时,这可能很有用。您的目标是使每列具有尽可能少的唯一值,以便需要枚举的值集尽可能小,但需要尽可能多的值(或附加列),以平衡集群中的I/O负载和数据分布

例如,如果要使用时间戳作为分区键,则在64位Java时间戳格式中,每秒可能有1000个分区。即使您可以在技术上对它们进行迭代,但这可能比您需要或想要的更细粒度。另一方面,如果您的分区键只是4位数的年份,那么该年份的所有事件都将转到同一分区(使其非常大)和同一组副本节点(热点、群集使用效率低下)。通过选择一个在这两个极端之间保持平衡的键,您可以控制分区的大小以及为了满足查询而必须访问的分区的数量

也考虑当你想删除旧数据时你会做什么。最简单的方法(在单个列族/表中)是删除整个分区,因为这有助于避免累积单个列墓碑。如果您想要运行“删除所有早于2013年的数据”这样的操作,那么您肯定不想将日期深深地埋藏在数据中,而是希望将其作为分区键的一部分

选择行(群集)键 主键中不属于分区键的任何其他列都将成为分区内的行键,并且这些行将按照这些列中第一列的排序顺序进行聚集(排序)

聚类/排序很重要,因为它通常是使用Cassandra获得的唯一本地排序。即使分区键降低到特定日期的特定小时或分钟级别,您也可以选择按毫秒时间戳或时间UUID对行进行集群,以按时间顺序保留该分区内的所有内容

您仍然可以在行键中添加其他列,如X/Y坐标或用户ID,以防听起来像我建议您(仅)在分区键和集群键中都添加时间

使用X/Y坐标 这一部分与Cassandra无关,但如果您正在对页面进行热映射,请注意人们使用不同分辨率的屏幕和设备。除非你在你的网站上做像素完美的布局(希望你使用的是一个流畅、响应迅速的布局),否则一个用户的X/Y坐标将不会与另一个用户的X/Y坐标匹配。如果同一用户切换设备,它们甚至可能不匹配

考虑不是通过鼠标的X/Y坐标进行映射,而是可能通过DOM中元素的ID进行映射。有你的“侧边栏”的ID吗