如何覆盖对cassandra集群或密钥空间的任何查询的default_fetch_size?

时间:2015-01-16 22:14:29

标签: cassandra cql cassandra-2.0

我有一个带有3个节点的cassandra 2.0.5群集设置。多个服务使用具有单独密钥空间的相同群集。由于表中blob条目的大小,遍历所有行的查询会导致OutOfMemory错误并导致群集崩溃。这对我来说是不可接受的,因为不同的服务使用相同的群集,而不应该影响其他群集。

现在,有一种方法可以使用fetchSize参数限制每个查询一次在内存中加载的行数,并使用大多数驱动程序支持集群2.0协议的查询。

default_fetch-size值为5000,我想将此值重写为小于500的值以避免OOM错误。我不能假设所有客户端在发出昂贵的查询时都会使用小的fetchSize。有办法吗?我在cassandra.yaml中找不到任何这样的配置。

我可以在每个键空间级别设置此值,因此对特定键空间的所有查询都会有一个较小的default_fetch_size吗?

2 个答案:

答案 0 :(得分:0)

我所知道的是,您只能设置特定语句的提取大小。 statement.setFetchSize(100);

答案 1 :(得分:0)

  1. 要在所有语句上设置fetchsize,可以在构建会话时在QueryOptions中执行此操作。像这样的东西,

    Session session = Cluster.builder()
            .addContactPoint("127.0.0.1")
            .withQueryOptions(new QueryOptions().setFetchSize(100))
            .build().connect();
    
  2. 如果要为不同的键空间使用不同的fetchsize,则为每个键空间维护会话对象。像这样的东西,

    Session sessionForKeyspace1 = Cluster.builder()
            .addContactPoint("127.0.0.1")
            .withQueryOptions(new QueryOptions().setFetchSize(100))
            .build().connect("keyspace1");
    
    Session sessionForKeyspace2 = Cluster.builder()
            .addContactPoint("127.0.0.1")
            .withQueryOptions(new QueryOptions().setFetchSize(200))
            .build().connect("keyspace2");