卡桑德拉模式用于进行小时级查询

3
我希望能从多个来源将数据存储在Cassandra中,并每小时运行一次任务,以处理该特定小时的数据点。为此,最好使用哪种模式?
为避免热点问题,我不能将每小时的所有数据都放在单个分区中,因此每小时的数据需要分布在许多分区中。
所以我看到两种查询特定小时的方式:
1.每小时创建一个新表,并对该表执行无where子句的select *以读取该小时的数据。我认为这对于读写是有效的,但管理如此多的表会很麻烦。
2.每周创建一个新表,并在其中包含一列用于表示一周内的小时数(即1至168),并在其上创建一个二级索引。然后可以执行where hour=x的select *。这似乎有效,但如果有大量行,则担心它不会很好地扩展。
是否有人知道哪种方法更好?还有其他更好的方法吗?
谢谢。
2个回答

3
在这种情况下,您可以使用“buckets”来分割分区成几个独立的部分。例如,假设您的模式如下:
CREATE KEYSPACE timeseries WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; USE timeseries; CREATE TABLE hourly ( source_id text, hour text, date timestamp, data text, bucket int, PRIMARY KEY ((hour, bucket), date) );
然后,您可以使用“bucket”将小时分为10个分区,使用一些已知标识符(例如“source_id”)的哈希函数。
在查询时,您需要指定“hour”和通常所有桶:
SELECT * FROM hourly WHERE hour = '2015-07-20 23:00' AND bucket IN (0,1,2,3,4,5,6,7,8,9);
哈希函数很重要,因为您希望它将数据均匀地分布在不同的分区中,即使被散列的标识符不是均匀分布的,但您也不希望它是非常复杂的函数。
这个JSFiddle提供了一个非常简单的哈希函数示例,可以均匀地分配数据并且可以在任何语言中轻松复制: http://jsfiddle.net/joscas/yfp72fq5/ 否则,如果您使用id的模数或时间戳的模数而不是哈希函数,则可能会满足需求,但如果使用id的模数,则必须检查数字是否以一致的模式结尾。另一方面,如果您使用时间戳的模数,您将有效地将所有内容写入某个bucket中一段时间,如果桶的数量很小,则可能会创建热点。

指定所有的桶将导致Cassandra在读取操作期间联系许多(可能是所有的,取决于集群大小)节点。这是可扩展性的限制。 - Carlo Bertuccini
你不能分发数据以避免热点,同时又避免与拥有数据的节点联系。无论如何,你可以控制节点数量(例如在这个例子中是10个)。我在生产环境中使用它处理非常大的数据集而没有问题。 - joscas
当然就像你所说的那样——问题在于在查询时你不会知道10个分区中哪一个包含数据,因此你将会在只需要联系一个节点时却联系了所有节点。我不是说这种方法行不通,只是现在不存在一种干净且有效的解决方案。 - Carlo Bertuccini
如果我将哈希到N个桶,似乎可以使用N个客户端并行地处理逐小时数据的切片,这将大大提高性能。 如果我在每个 C* 节点上运行一个客户端,是否有一种方法可以利用数据本地性,使得每个客户端读取其所在节点上的本地数据?(即Spark连接器的方式,但不使用Spark) - Jim Meyer
@JimMeyer 是的,你可以通过一些努力做到这一点。无论如何,我认为DataStax C*驱动程序为您提供了许多扩展读取负载的选项。一个好的起点是使用DataStax Java驱动程序和TokenAwarePolicy http://docs.datastax.com/en/drivers/java/2.1/com/datastax/driver/core/policies/TokenAwarePolicy.html - joscas

1
你没有太多选择,正如你已经发现的那样,解决方案都有缺点。
由于二级索引相关的可扩展性问题,我肯定会避免使用第二种解决方案。如果你现在需要解决方案,我会使用多个表格。如果你可以等待,我会使用Cassandra 3和materialized views,选择一个合适的键。
希望对你有所帮助, 卡洛

嗨,Carlo,我在物化视图中应该使用什么键?如果我将日期和小时作为分区键,则似乎会回到物化视图中的热点问题。据我所知,物化视图是在基表中每次插入时更新而不是惰性评估。 - Jim Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接