读取查询期间的Cassandra超时

时间:2017-12-18 21:01:21

标签: cassandra timeout cassandra-2.0

对于在SELECT查询上有550万条记录的表,Cassandra读取超时激活正在发生。

  

com.datastax.driver.core.exceptions.ReadTimeoutException:Cassandra   在一致性LOCAL_ONE读取查询期间超时(1个响应是   需要但只有0副本响应)   com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:88)     在   com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:25)     在   com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)     在   com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245)     在   com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:68)     在   com.batchjob.util.DataUtil.getFaIdClientIdKeysDataList(DataUtil.java:50)

我们正在尝试基于CURRENT_DATE列进行检索,如下面的查询

中所示
net use

cassandra.yaml 文件配置:

Statement stmt = QueryBuilder.select().column("FA_ID").column("CLIENT_ID").from(tableName).allowFiltering().where(lt("CURRENT_DATE",localDate)).setFetchSize(5);
ResultSet rs = session.execute(stmt);

我们还有read_request_timeout_in_ms: 360000 write_request_timeout_in_ms: 360000 request_timeout_in_ms: 360000 counter_write_request_timeout_in_ms: 10000 tombstone_failure_threshold: 600000 指定的表,因为我们有删除墓碑的DELETE作业。

识别问题的任何解决方案都会对我们有所帮助!

基本上问题只发生在下面的表中,其中记录的数量是以百万计。 注意 - 此READ Timeout问题具有特定模式 - 通常是每周一发生。从星期二到星期日,不要在一周中的其他日子里开始工作。每天都会定期开始工作。

560万(表X) 370万(表Y) 用于获取记录的代码段:

gc_grace_seconds = 86400(1 DAY)

以下是数据模型。目前,我们没有在表中的任何列上维护任何索引。

public List<DataDeleteObject> getFaIdClientIdKeysDataList(String tableName) {
    List<DataDeleteObject> dataDeleteObjList = new ArrayList<DataDeleteObject>();
    Statement stmt = QueryBuilder.select().column(CommonConstantInterface.FA_ID)
            .column(CommonConstantInterface.CLIENT_ID).from(tableName)
            .allowFiltering().where(lt(CommonConstantInterface.CURRENT_DATE, getCurrentDate()))
            .setFetchSize(5);

    ResultSet rs = config.getSession().execute(stmt);
    DataDeleteObject fgaDO = null;
    int count = 0;
    while (!rs.isExhausted()) {
        count++;
        Row row = rs.one();
        fgaDO = new DataDeleteObject();
        fgaDO.setFaId(row.getString(CommonConstantInterface.FA_ID));
        fgaDO.setClientId(row.getVarint(CommonConstantInterface.CLIENT_ID));
        dataDeleteObjList.add(fgaDO);
    }
    return dataDeleteObjList;
}

0 个答案:

没有答案