我正在使用带有datastax驱动程序的Cassandra数据库。我需要从Cassandra批量读取2000行的内容。我的用例是,我在请求中获取id列表,这些id是我在Cassandra中的分区键。我想知道生成2000个线程并从Cassandra并行获取数据是否是个好主意(在这种情况下,读取数据将有效,因为它只到达一个节点),或者是否有可能找到一种方法来对存在于同一节点中的id进行分组,以便我可以优化读取(现在在这种情况下,我需要在Cassandra上生成更少的线程和更少的开销)。请告诉我,除了生成多个线程之外,我还能以有效的方式实现批量读取吗?谢谢!PS:从Cassandra返回的数据没有那么大,不会导致OOM。
有可能找到一种方法来对同一节点中的id进行分组吗
是的,您可以获取cassandra集群的令牌范围,并检查范围内ID的令牌出现情况,然后按节点对ID进行分组。
此外:
没有必要生成许多线程,数据税驱动程序提供了异步api,我们在项目中使用它来并行执行许多查询,它工作得很好,但从性能角度来看并不出色。
需要执行数千个读取数据请求表明数据模型不合适。您应该围绕查询实现数据模型,以最小化请求数量,从而获得良好的性能。
更新:
我想,您可以使用方法 Metadata.newToken 在驱动程序端计算令牌,或者直接获取给定分区键的元数据.getReplicas 的副本。但在它根据其类型和协议版本序列化分区键之前
我理解了与Cassandra分区键、复合键、集群键的区别。但是没有找到足够的信息来理解cassandra中如何处理分区 在cassandra中,分区密钥的范围像分区/碎片一样存储在节点上。我的理解是否正确 每个分区键在数据库中是否有不同的文件(在系统级别)。。?如果是这样的话,读取速度不是会变慢吗 如果每个分区键在数据库中没有不同的文件。怎么处理的。。?
假设我有一张桌子,像这样: 这遵循了所需的Cassandra模式,跨分区分布良好(假设默认的Murmur3哈希分区器)。 但是,我也需要(很少)按时间顺序执行范围查询。这在Cassandra中似乎是不可能的。实际上,我确实需要按组访问数据,所以是可以接受的。由于似乎没有办法让辅助索引有多个列,我想正确的做法是将其反规范化,如下所示: 除了< code>group基数很低,比方说< code>('A
我正在尝试将以下结构存储在卡桑德拉中。 上面的大多数查询是 这就是为什么将()设置为主键很有用的原因。 根据docu,Cassandra的默认分区键是主键的第一列-在我的例子中是,但我想在Cassandr集群上均匀分布数据,我不能允许一个中的所有数据只存储在一个分区中,因为有些商店有10M条记录,有些只有1k条记录。 我可以设置()作为分区键,然后我可以达到Cassandra集群中记录的统一分布。
作为卡桑德拉数据分区的后续,我得到了vNodes的想法。感谢“西蒙·丰塔纳·奥斯卡森” 当我尝试使用vNodes进行数据分区时,我有几个问题, 我尝试观察2节点中的分区分布() 因此,根据我在两个节点中的观察,随着一个范围的扩展,节点61的值从-9207297847862311651到-9185516104965672922。。。 注意:分区范围从9039572936575206977到90199
有人能详细说明一下使用领域吗。确实需要两者都实现两者。?
我正在学习Cassandra,并有一个关于分区/集群键的问题。 我有一个表,存储数据的股份,如行业的分支,最近6/12个月的业绩,名称等。 该表如下所示: 多谢了,伙计们