【问题标题】:Locating cassandra partition node定位 cassandra 分区节点
【发布时间】:2017-05-03 20:15:48
【问题描述】:

我正在使用带有 datastax 驱动程序的 Cassandra 数据库。我需要从 Cassandra 批量读取大约 2000 行的内容。我的用例是,我在请求中获得了 id 列表,这些 id 是我在 Cassandra 中的分区键。我想知道产生 2000 个线程并从 Cassandra 并行获取数据是否是一个好主意(在这种情况下,读取数据将有效,因为它只进入一个节点)或者是否有可能找出一种方法来分组 id住在同一个节点,这样我就可以优化读取(现在在这种情况下,我需要在 Cassandra 上产生更少的线程和更少的开销)。请让我知道除了产生多个线程之外,我能否以有效的方式实现批量读取。谢谢! PS:从 Cassandra 返回的数据并没有那么大导致 OOM。

【问题讨论】:

    标签: cassandra datastax-java-driver spring-data-cassandra


    【解决方案1】:

    是否有可能找到一种方法来对位于同一节点中的 id 进行分组

    是的,您可以get Token Ranges 用于 cassandra 集群,check occurrence for tokens 用于范围内的 id,然后按节点对 id 进行分组。

    补充:

    不需要生成很多线程,datastax 驱动程序提供了asynchronous api,我们在项目中使用它来并行执行大量查询,它工作得足够好,但从性能角度来看并不出色。

    需要执行数千次读取数据的请求表明数据模型不合适。您应该围绕查询实现数据模型,以尽量减少请求数量以获得良好的性能。

    更新:

    我想,你可以使用方法 Metadata.newToken 在驱动程序端计算令牌或直接使用Metadata.getReplicas 获取给定分区键的副本。 但在它之前serialize the partition key 根据它的类型和协议版本

    【讨论】:

    • 感谢您的帮助!您知道如何使用 dataStax 驱动程序计算给定分区键的令牌。目前我正在做类似select token(key) from demotable where key=1231 的事情来计算给定分区键的令牌值。而且我认为这样做很糟糕,因为它会多次访问 Cassandra 服务器。我认为应该有一种方法可以通过数据 stax 公开正确的哈希算法,从而完成工作。
    • @Coder,我已经更新了关于驱动程序端令牌计算详细信息的答案
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2014-06-10
    • 2016-02-29
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多