我该怎么办" com.datastax.driver.core.exceptions.ReadTimeoutException"?

时间:2015-11-30 07:41:08

标签: java cassandra garbage-collection cassandra-2.0

我将几乎1放在带有3个节点的Cassandra(2.1.11)集群中,复制因子为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"); } } ,然后我编写客户端应用程序以使用datastax's Java Driver计算所有记录,代码段如下:

cntRecords

在上面的变量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) 超过3000万之后,我总是得到例外:

-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 

我在google中获得了几个结果并更改了有关堆和GC的设置,以下是我的相对设置:

jstat

我使用GCViewer来分析gc日志文件,其中througput为99.95%,98.15%和95.75%。

更新开始: 我使用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.00更改为S1cassandra.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 我应该为此设置什么属性?

如何完成计算所有记录的任务,我该怎么做?提前谢谢!

ATTACH:  以下是其他选择:

{{1}}

1 个答案:

答案 0 :(得分:2)

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

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

你可以尝试的事情:

  • 选择一列而不是*。这可能会降低GC压力和网络消耗。最好选择一个具有少量字节且属于主键的列:select column1 from test
  • 每1M记录后添加一个短暂停顿。每个1M记录的循环暂停500ms左右。这可以让节点快速呼吸,以处理像GC
  • 这样的事情
  • 在您的节点上修改cassandra.yaml并增加range_request_timeout_in_msread_request_timeout_in_ms
  • 计算分配给每个节点的令牌范围,并为每个令牌范围发出单独的查询。添加每个查询的计数。这利用了令牌感知驱动程序将每个“令牌范围”查询直接发送到可以回答它的节点。有关示例代码的完整说明,请参阅此blog article