java - 我应该为 "com.datastax.driver.core.exceptions.ReadTimeoutException"做什么?

标签 java cassandra garbage-collection cassandra-2.0

我将近1.9亿条记录放入具有3个节点的Cassandra(2.1.11)集群中,复制因子为1,然后我编写客户端应用程序来计算所有记录均使用 datastax's Java Driver ,片段代码如下:

Statement stmt = new SimpleStatement("select * from test" );

System.out.println("starting to read records ");
stmt.setFetchSize(10000);
ResultSet rs = session.execute(stmt);

//System.out.println("rs.size " + rs.all().size());
long cntRecords = 0;

for(Row row : rs){
    cntRecords++;

    if(cntRecords % 10000000 == 0){
        System.out.println("the " + cntRecords/10000000 + " X 10 millions of records");
    }
}

上面的变量cntRecords超过3000万之后,我总是得到异常:

Exception in thread "main" com.datastax.driver.core.exceptions.ReadTimeoutException: 
Cassandra timeout during read query at consistency ONE (1 responses were required but only 
0 replica responded)

我在google上得到了几条结果,并更改了有关堆和GC的设置,以下是我的相关设置:

-XX:InitialHeapSize=17179869184 
-XX:MaxHeapSize=17179869184 
-XX:MaxNewSize=12884901888 
-XX:MaxTenuringThreshold=1 
-XX:NewSize=12884901888 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:+UseCompressedOops 
-XX:+UseConcMarkSweepGC 
-XX:+UseCondCardMark 
-XX:+UseGCLogFileRotation 
-XX:+UseParNewGC 
-XX:+UseTLAB 
-XX:+UseThreadPriorities
-XX:+CMSClassUnloadingEnabled 

我用了GCViewer分析gc日志文件,吞吐量分别为99.95%、98.15%和95.75%。

更新开始: 我使用jstat监控三个节点之一,发现当S1的值变为100.00时,我会得到上面的错误快点:

/usr/java/jdk1.7.0_80/bin/jstat -gcutil 8862 1000 
S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
0.00 100.00  28.57  36.29  74.66     55   14.612     2    0.164   14.776

而一旦S1变为100.00S1就不再减少,不知道这和误差有关吗?或者我应该为此设置 cassandra.yaml 或 cassandra-env.sh 中的哪些属性?

如何完成统计所有记录的任务?提前致谢!

附加: 以下是其他选项:

-XX:+CMSEdenChunksRecordAlways 
-XX:CMSInitiatingOccupancyFraction=75 
-XX:+CMSParallelInitialMarkEnabled 
-XX:+CMSParallelRemarkEnabled 
-XX:CMSWaitDuration=10000 
-XX:CompileCommandFile=bin/../conf/hotspot_compiler 
-XX:GCLogFileSize=94371840 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:NumberOfGCLogFiles=90 
-XX:OldPLABSize=16 
-XX:PrintFLSStatistics=1 
-XX:+PrintGC 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCDateStamps 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintHeapAtGC 
-XX:+PrintPromotionFailure 
-XX:+PrintTenuringDistribution 
-XX:StringTableSize=1000003 
-XX:SurvivorRatio=8 
-XX:ThreadPriorityPolicy=42 
-XX:ThreadStackSize=256 

最佳答案

检查为什么您需要知道行数。您的应用程序真的需要知道这一点吗?如果它可以“仅仅”有一个很好的近似值,那么创建一个计数器并在加载数据时递增它。

http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html

您可以尝试的事情:

  • 选择单个列而不是*。这可能会减少 GC 压力和网络消耗。最好选择字节数较少且属于主键一部分的列:select column1 from test
  • 每 1M 条记录后添加一个短暂的暂停。每 1M 条记录让循环暂停 500 毫秒左右。这可能会让节点喘口气来处理 GC 之类的事情
  • 编辑节点上的 cassandra.yaml 并增加 range_request_timeout_in_msread_request_timeout_in_ms
  • 找出分配给每个节点的 token 范围,并对每个 token 范围发出单独的查询。添加每个查询的计数。这利用了 token 感知驱动程序将每个“ token 范围”查询直接发送到可以回答它的节点。看这个blog article获取完整说明和示例代码。

关于java - 我应该为 "com.datastax.driver.core.exceptions.ReadTimeoutException"做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33993619/

相关文章:

JavaPoet 添加泛型参数

java - 从 Hector QueryResult 对象中获取字符串

docker - Linux服务器上没有Internet的docker上的Cassandra/Scylla

python - 如何使用cql引擎将图像存储为cassandra数据库中的字节字段?

c# - 如何在非托管内存中实例化 C# 类? (可能的?)

java - "finalizer guardian"在 Java 中如何工作?

C# 托管内存泄漏

java - 包括 jpos.xml

java - 当我从共享首选项中读取数据时,是否需要初始化我的ArrayList?

java - 可重入锁await和signalAll方法