定位cassandra分区节点
Locating cassandra partition node
我正在使用带有 datastax 驱动程序的 Cassandra 数据库。我需要从 Cassandra 批量读取大约 2000 行的内容。我的用例是这样的,我在请求中获得了 id 列表,这些 id 是我在 Cassandra 中的分区键。我想知道生成 2000 个线程并从 Cassandra 并行获取数据是否是个好主意(在这种情况下,读取数据将有效,因为它只进入一个节点)或者是否有可能找出一种方法来分组 ID住在同一个节点上,这样我就可以优化读取(现在在这种情况下,我需要产生更少的线程和更少的 Cassandra 开销)。请让我知道除了产生多个线程之外,我能否以有效的方式实现批量读取。谢谢!
PS:从 Cassandra 返回的数据并没有大到导致 OOM。
is it possible to figure out a way to group ids which live in same node
是的,您可以 get Token Ranges for cassandra cluster and check occurrence for tokens 为范围内的 ID,然后按节点对 ID 进行分组。
另外:
不需要产生很多线程,datastax 驱动程序提供 asynchronous api,我们在项目中使用它来并行执行大量查询并且它工作得很好,但从性能角度来看并不出色查看。
需要执行数千个请求来读取数据表明数据模型不合适。您应该围绕查询实施数据模型,以最大限度地减少请求数量以获得良好的性能。
更新:
我想,你可以使用方法
Metadata.newToken to calculate token on driver side or directly get replicas with Metadata.getReplicas 对于给定的分区键。
但是在它之前 serialize the partition key 根据它的类型和协议版本
我正在使用带有 datastax 驱动程序的 Cassandra 数据库。我需要从 Cassandra 批量读取大约 2000 行的内容。我的用例是这样的,我在请求中获得了 id 列表,这些 id 是我在 Cassandra 中的分区键。我想知道生成 2000 个线程并从 Cassandra 并行获取数据是否是个好主意(在这种情况下,读取数据将有效,因为它只进入一个节点)或者是否有可能找出一种方法来分组 ID住在同一个节点上,这样我就可以优化读取(现在在这种情况下,我需要产生更少的线程和更少的 Cassandra 开销)。请让我知道除了产生多个线程之外,我能否以有效的方式实现批量读取。谢谢! PS:从 Cassandra 返回的数据并没有大到导致 OOM。
is it possible to figure out a way to group ids which live in same node
是的,您可以 get Token Ranges for cassandra cluster and check occurrence for tokens 为范围内的 ID,然后按节点对 ID 进行分组。
另外:
不需要产生很多线程,datastax 驱动程序提供 asynchronous api,我们在项目中使用它来并行执行大量查询并且它工作得很好,但从性能角度来看并不出色查看。
需要执行数千个请求来读取数据表明数据模型不合适。您应该围绕查询实施数据模型,以最大限度地减少请求数量以获得良好的性能。
更新:
我想,你可以使用方法 Metadata.newToken to calculate token on driver side or directly get replicas with Metadata.getReplicas 对于给定的分区键。 但是在它之前 serialize the partition key 根据它的类型和协议版本